8249605: C2: assert(no_dead_loop) failed: dead loop detected
Fixed dead loop detection in PhiNode::Ideal() to additionally account for dead MergeMemNodes Reviewed-by: kvn, thartmann
This commit is contained in:
parent
d9abf606d9
commit
696b9e1847
@ -2229,23 +2229,30 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) {
|
||||
} else {
|
||||
// We know that at least one MergeMem->base_memory() == this
|
||||
// (saw_self == true). If all other inputs also references this phi
|
||||
// (directly or through data nodes) - it is dead loop.
|
||||
// (directly or through data nodes) - it is a dead loop.
|
||||
bool saw_safe_input = false;
|
||||
for (uint j = 1; j < req(); ++j) {
|
||||
Node *n = in(j);
|
||||
if (n->is_MergeMem() && n->as_MergeMem()->base_memory() == this)
|
||||
continue; // skip known cases
|
||||
Node* n = in(j);
|
||||
if (n->is_MergeMem()) {
|
||||
MergeMemNode* mm = n->as_MergeMem();
|
||||
if (mm->base_memory() == this || mm->base_memory() == mm->empty_memory()) {
|
||||
// Skip this input if it references back to this phi or if the memory path is dead
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (!is_unsafe_data_reference(n)) {
|
||||
saw_safe_input = true; // found safe input
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!saw_safe_input)
|
||||
return top; // all inputs reference back to this phi - dead loop
|
||||
if (!saw_safe_input) {
|
||||
// There is a dead loop: All inputs are either dead or reference back to this phi
|
||||
return top;
|
||||
}
|
||||
|
||||
// Phi(...MergeMem(m0, m1:AT1, m2:AT2)...) into
|
||||
// MergeMem(Phi(...m0...), Phi:AT1(...m1...), Phi:AT2(...m2...))
|
||||
PhaseIterGVN *igvn = phase->is_IterGVN();
|
||||
PhaseIterGVN* igvn = phase->is_IterGVN();
|
||||
Node* hook = new Node(1);
|
||||
PhiNode* new_base = (PhiNode*) clone();
|
||||
// Must eagerly register phis, since they participate in loops.
|
||||
|
66
test/hotspot/jtreg/compiler/c2/TestDeadPhiMergeMemLoop.java
Normal file
66
test/hotspot/jtreg/compiler/c2/TestDeadPhiMergeMemLoop.java
Normal file
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @test
|
||||
* @bug 8249605
|
||||
* @summary A dead memory loop is detected when replacing an actually dead memory phi node in PhiNode::Ideal()
|
||||
* by a dead MergeMemNode which builds a cycle with one of its slices.
|
||||
*
|
||||
* @run main/othervm -Xcomp -XX:-TieredCompilation
|
||||
* -XX:CompileCommand=compileonly,compiler.c2.TestDeadPhiMergeMemLoop::main
|
||||
* -XX:CompileCommand=dontinline,compiler.c2.TestDeadPhiMergeMemLoop::dontInline
|
||||
* compiler.c2.TestDeadPhiMergeMemLoop
|
||||
*/
|
||||
|
||||
package compiler.c2;
|
||||
|
||||
public class TestDeadPhiMergeMemLoop {
|
||||
|
||||
public static boolean bFld = false;
|
||||
public static double dArrFld[] = new double[400];
|
||||
|
||||
public static void main(String[] strArr) {
|
||||
int x = 1;
|
||||
int i = 0;
|
||||
int iArr[] = new int[400];
|
||||
dontInline();
|
||||
|
||||
if (bFld) {
|
||||
x += x;
|
||||
} else if (bFld) {
|
||||
float f = 1;
|
||||
while (++f < 132) {
|
||||
if (bFld) {
|
||||
dArrFld[5] = 3;
|
||||
for (i = (int)(f); i < 12; i++) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Not inlined
|
||||
public static void dontInline() {
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user