8352595: Regression of JDK-8314999 in IR matching

Reviewed-by: chagedorn, thartmann
This commit is contained in:
Marc Chevalier 2025-03-25 07:28:06 +00:00 committed by Christian Hagedorn
parent 48fac6626c
commit c94bc7427c
3 changed files with 91 additions and 73 deletions

View File

@ -1163,15 +1163,17 @@ class BadIRNodeForPhase {
public void duplicatedPhase() {}
@Test
@FailCount(4)
@IR(failOn = IRNode.ALLOC, phase = {CompilePhase.FINAL_CODE, CompilePhase.AFTER_MACRO_EXPANSION})
@IR(failOn = IRNode.ALLOC, phase = CompilePhase.PRINT_IDEAL)
@FailCount(6)
@IR(failOn = IRNode.ALLOC, phase = {CompilePhase.FINAL_CODE, CompilePhase.AFTER_MACRO_EXPANSION}) // FINAL_CODE not available
@IR(failOn = IRNode.ALLOC, phase = CompilePhase.PRINT_IDEAL) // PRINT_IDEAL not available
@IR(failOn = IRNode.ALLOC, phase = {CompilePhase.ITER_GVN1, CompilePhase.AFTER_PARSING}) // works
@IR(failOn = IRNode.ALLOC, phase = {CompilePhase.ITER_GVN1, CompilePhase.AFTER_PARSING,
CompilePhase.PRINT_OPTO_ASSEMBLY}) // works
@IR(failOn = IRNode.ALLOC_ARRAY, phase = {CompilePhase.FINAL_CODE, CompilePhase.AFTER_MACRO_EXPANSION})
@IR(failOn = IRNode.ALLOC_ARRAY, phase = CompilePhase.PRINT_IDEAL)
CompilePhase.PRINT_OPTO_ASSEMBLY}) // PRINT_OPTO_ASSEMBLY not available
@IR(failOn = IRNode.ALLOC_ARRAY, phase = {CompilePhase.FINAL_CODE, CompilePhase.AFTER_MACRO_EXPANSION}) // FINAL_CODE not available
@IR(failOn = IRNode.ALLOC_ARRAY, phase = CompilePhase.PRINT_IDEAL) // PRINT_IDEAL not available
@IR(failOn = IRNode.ALLOC_ARRAY, phase = {CompilePhase.ITER_GVN1, CompilePhase.AFTER_PARSING}) // works
@IR(failOn = IRNode.ALLOC_ARRAY, phase = {CompilePhase.ITER_GVN1, CompilePhase.AFTER_PARSING,
CompilePhase.PRINT_OPTO_ASSEMBLY}) // works
CompilePhase.PRINT_OPTO_ASSEMBLY}) // PRINT_OPTO_ASSEMBLY not available
public void alloc() {}
@Test

View File

@ -107,6 +107,16 @@ class Basics {
Object obj3;
Object obj4;
public class Helper {
private String s;
public Helper(String s, int i) {
this.s = s;
}
public String getString() { return s; }
}
@Test
@IR(failOn = IRNode.STORE, phase = {CompilePhase.DEFAULT, CompilePhase.PRINT_IDEAL})
@ExpectedFailure(ruleId = 1, failOn = 1) // Only one failure - remove duplicated phases after mapping DEFAULT
@ -115,15 +125,16 @@ class Basics {
}
@Test
@IR(failOn = {IRNode.STORE, IRNode.ALLOC, IRNode.COUNTED_LOOP},
counts = {IRNode.STORE, "3", IRNode.ALLOC, "1", IRNode.COUNTED_LOOP, "2"})
@IR(failOn = {IRNode.STORE, IRNode.FIELD_ACCESS, IRNode.COUNTED_LOOP},
counts = {IRNode.STORE, "3", IRNode.FIELD_ACCESS, "2", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 1, phase = CompilePhase.PRINT_IDEAL, failOn = 1, counts = {1, 3})
@ExpectedFailure(ruleId = 1, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, counts = 2)
@ExpectedFailure(ruleId = 1, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = 2)
@IR(failOn = {IRNode.STORE, IRNode.ALLOC, IRNode.COUNTED_LOOP})
@IR(failOn = {IRNode.STORE, IRNode.FIELD_ACCESS, IRNode.COUNTED_LOOP})
@ExpectedFailure(ruleId = 2, phase = CompilePhase.PRINT_IDEAL, failOn = 1)
@ExpectedFailure(ruleId = 2, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = 2)
@IR(counts = {IRNode.STORE, "3", IRNode.ALLOC, "1", IRNode.COUNTED_LOOP, "2"})
@IR(counts = {IRNode.STORE, "3", IRNode.FIELD_ACCESS, "1", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 3, phase = CompilePhase.PRINT_IDEAL, counts = {1, 3})
@ExpectedFailure(ruleId = 3, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, counts = 2)
@ -135,52 +146,54 @@ class Basics {
}
@Test
@IR(failOn = {IRNode.STORE_F, IRNode.ALLOC, IRNode.COUNTED_LOOP},
counts = {IRNode.STORE_F, "3", IRNode.ALLOC, "1", IRNode.COUNTED_LOOP, "2"})
@IR(failOn = {IRNode.STORE_F, IRNode.FIELD_ACCESS, IRNode.COUNTED_LOOP},
counts = {IRNode.STORE_F, "3", IRNode.FIELD_ACCESS, "1", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 1, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = 2)
@ExpectedFailure(ruleId = 1, phase = CompilePhase.PRINT_IDEAL, counts = {1, 3})
@IR(failOn = {IRNode.STORE_F, IRNode.ALLOC, IRNode.COUNTED_LOOP})
@IR(failOn = {IRNode.STORE_F, IRNode.FIELD_ACCESS, IRNode.COUNTED_LOOP})
@ExpectedFailure(ruleId = 2, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = 2)
@IR(counts = {IRNode.STORE_F, "3", IRNode.ALLOC, "1", IRNode.COUNTED_LOOP, "2"})
@IR(counts = {IRNode.STORE_F, "3", IRNode.FIELD_ACCESS, "1", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 3, phase = CompilePhase.PRINT_IDEAL, counts = {1, 3})
@IR(failOn = {IRNode.STORE_F, IRNode.ALLOC, IRNode.COUNTED_LOOP},
counts = {IRNode.STORE_F, "3", IRNode.ALLOC, "2", IRNode.COUNTED_LOOP, "2"})
@IR(failOn = {IRNode.STORE_F, IRNode.FIELD_ACCESS, IRNode.COUNTED_LOOP},
counts = {IRNode.STORE_F, "3", IRNode.FIELD_ACCESS, "2", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 4, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = 2, counts = 2)
@ExpectedFailure(ruleId = 4, phase = CompilePhase.PRINT_IDEAL, counts = {1, 3})
@IR(counts = {IRNode.ALLOC, "2"})
@IR(counts = {IRNode.FIELD_ACCESS, "2"})
@ExpectedFailure(ruleId = 5, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, counts = 1)
public Object defaultOnOptoAssembly() {
return new Object();
public Object defaultOnOptoAssembly(Helper h) {
return h.getString();
}
@Test
@IR(failOn = {IRNode.STORE, IRNode.ALLOC, IRNode.ALLOC_OF, "Object", IRNode.COUNTED_LOOP},
counts = {IRNode.STORE, "20", IRNode.ALLOC, "1", IRNode.ALLOC_OF, "Object", "1", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 1, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = {2, 3})
@ExpectedFailure(ruleId = 1, phase = CompilePhase.PRINT_IDEAL, failOn = 1, counts = {1, 4})
@IR(failOn = {IRNode.STORE, IRNode.FIELD_ACCESS, IRNode.COUNTED_LOOP},
counts = {IRNode.STORE, "20", IRNode.FIELD_ACCESS, "3", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 1, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = 2)
@ExpectedFailure(ruleId = 1, phase = CompilePhase.PRINT_IDEAL, failOn = 1, counts = {1, 3})
@IR(failOn = {IRNode.STORE, IRNode.ALLOC, IRNode.ALLOC_OF, "Object", IRNode.COUNTED_LOOP})
@IR(failOn = {IRNode.STORE, IRNode.FIELD_ACCESS, IRNode.COUNTED_LOOP})
@ExpectedFailure(ruleId = 2, phase = CompilePhase.PRINT_IDEAL, failOn = 1)
@ExpectedFailure(ruleId = 2, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = {2, 3})
@ExpectedFailure(ruleId = 2, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = 2)
@IR(counts = {IRNode.STORE, "20", IRNode.ALLOC, "1", IRNode.ALLOC_OF, "Object", "2", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 3, phase = CompilePhase.PRINT_IDEAL, counts = {1, 4})
@ExpectedFailure(ruleId = 3, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, counts = 3)
@IR(counts = {IRNode.STORE, "20", IRNode.FIELD_ACCESS, "2", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 3, phase = CompilePhase.PRINT_IDEAL, counts = {1, 3})
@ExpectedFailure(ruleId = 3, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, counts = 2)
@IR(failOn = {IRNode.STORE, IRNode.ALLOC, IRNode.ALLOC_OF, "Object", IRNode.COUNTED_LOOP},
counts = {IRNode.STORE, "20", IRNode.ALLOC, "2", IRNode.ALLOC_OF, "Object", "2", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 4, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = {2, 3}, counts = {2, 3})
@ExpectedFailure(ruleId = 4, phase = CompilePhase.PRINT_IDEAL, failOn = 1, counts = {1, 4})
@IR(failOn = {IRNode.STORE, IRNode.FIELD_ACCESS, IRNode.COUNTED_LOOP},
counts = {IRNode.STORE, "20", IRNode.FIELD_ACCESS, "2", IRNode.COUNTED_LOOP, "2"})
@ExpectedFailure(ruleId = 4, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, failOn = 2, counts = 2)
@ExpectedFailure(ruleId = 4, phase = CompilePhase.PRINT_IDEAL, failOn = 1, counts = {1, 3})
@IR(counts = {IRNode.ALLOC, "2", IRNode.ALLOC_OF, "Object", "1"})
@IR(counts = {IRNode.FIELD_ACCESS, "2"})
@ExpectedFailure(ruleId = 5, phase = CompilePhase.PRINT_OPTO_ASSEMBLY, counts = 1)
public void defaultOnBoth() {
obj = new Object();
public Object defaultOnBoth(Helper h) {
i = 34;
l = 34;
return h.getString();
}
@Test
@ -202,7 +215,7 @@ class Basics {
return x;
}
@Run(test = "removeLoopsWithMultipleCompilations")
@Run(test = {"removeLoopsWithMultipleCompilations", "defaultOnOptoAssembly", "defaultOnBoth"})
@Warmup(1)
public void run() {
for (int i = 0; i < 10000; i++) {
@ -211,6 +224,8 @@ class Basics {
for (int i = 0; i < 10000; i++) {
removeLoopsWithMultipleCompilations(3);
}
defaultOnOptoAssembly(new Helper("a", 1));
defaultOnBoth(new Helper("a", 1));
}
@Test
@ -238,9 +253,9 @@ class Basics {
@Test
@IR(failOn = {IRNode.ALLOC, IRNode.ALLOC_ARRAY},
counts = {IRNode.ALLOC, "0", IRNode.ALLOC_ARRAY, "0"},
phase = {CompilePhase.BEFORE_REMOVEUSELESS, CompilePhase.CCP1, CompilePhase.PRINT_OPTO_ASSEMBLY, CompilePhase.DEFAULT})
phase = {CompilePhase.BEFORE_REMOVEUSELESS, CompilePhase.CCP1, CompilePhase.DEFAULT})
@ExpectedFailure(ruleId = 1, failOn = {1, 2}, counts = {1, 2},
phase = {CompilePhase.BEFORE_REMOVEUSELESS, CompilePhase.CCP1, CompilePhase.PRINT_OPTO_ASSEMBLY})
phase = {CompilePhase.BEFORE_REMOVEUSELESS, CompilePhase.CCP1, CompilePhase.BEFORE_MACRO_EXPANSION})
public void alloc() {
obj = new Object();
obj2 = new Object[1];
@ -248,7 +263,7 @@ class Basics {
@Test
@IR(counts = {IRNode.ALLOC, "2", IRNode.ALLOC_ARRAY, "2"}, // works for all phases
phase = {CompilePhase.BEFORE_REMOVEUSELESS, CompilePhase.CCP1, CompilePhase.PRINT_OPTO_ASSEMBLY, CompilePhase.DEFAULT})
phase = {CompilePhase.BEFORE_REMOVEUSELESS, CompilePhase.CCP1, CompilePhase.DEFAULT})
public void alloc2() {
obj = new Object();
obj2 = new Object[1];

View File

@ -147,9 +147,9 @@ public class TestCompilePhaseCollector {
String simpleMethodName, CompilePhase... compilePhases) {
String methodName = getFullMethodName(testClass, simpleMethodName);
Set<CompilePhase> compilePhaseSet = methodToCompilePhases.get(methodName);
Assert.assertEquals("must be equal", compilePhases.length, compilePhaseSet.size());
Assert.assertEquals("In method " + simpleMethodName + ": must be equal", compilePhases.length, compilePhaseSet.size());
for (CompilePhase compilePhase : compilePhases) {
Assert.assertTrue("did not find " + compilePhase + " for " + methodName,
Assert.assertTrue("In method " + simpleMethodName + ": did not find " + compilePhase + " for " + methodName,
methodToCompilePhases.get(methodName).contains(compilePhase));
}
}
@ -193,44 +193,45 @@ public class TestCompilePhaseCollector {
}
static class Opto {
@Test
@IR(failOn = IRNode.ALLOC)
public void test1() {}
@Test
@IR(failOn = {IRNode.ALLOC_OF, "Foo"})
public void test2() {}
@Test
@IR(counts = {IRNode.SCOPE_OBJECT, "2"})
public void test3() {}
public void test1() {}
@Test
@IR(counts = {IRNode.ALLOC_ARRAY_OF, "Foo", "!= 4"})
public void test4() {}
@IR(counts = {IRNode.OOPMAP_WITH, "Foo", "2"})
public void test2() {}
@Test
@IR(failOn = IRNode.FIELD_ACCESS)
@IR(counts = {IRNode.CHECKCAST_ARRAY, "2"})
public void test5() {}
public void test3() {}
@Test
@IR(failOn = {IRNode.CHECKCAST_ARRAYCOPY, IRNode.CHECKCAST_ARRAY_OF, "Foo"})
@IR(counts = {IRNode.ALLOC, "2", IRNode.ALLOC_ARRAY_OF, "Foo", "> 1"})
@IR(counts = {IRNode.CBZ_HI, "> 1"})
public void test4() {}
@Test
@IR(failOn = {IRNode.CBNZW_HI})
@IR(counts = {IRNode.CBZ_LS, "2", IRNode.CBZW_LS, "> 1"})
public void test5() {}
@Test
@IR(failOn = {IRNode.CBNZW_HI})
@IR(counts = {IRNode.CBZW_LS, "> 1"})
public void test6() {}
}
static class IdealAndOpto {
@Test
@IR(failOn = IRNode.ALLOC)
@IR(failOn = IRNode.FIELD_ACCESS)
@IR(failOn = IRNode.STORE)
public void test1() {}
@Test
@IR(failOn = {IRNode.ALLOC_OF, "Foo"})
@IR(failOn = {IRNode.CHECKCAST_ARRAY_OF, "Foo"})
@IR(failOn = {IRNode.STORE_OF_FIELD, "iFld"})
public void test2() {}
@ -241,7 +242,7 @@ public class TestCompilePhaseCollector {
@Test
@IR(counts = {IRNode.LOAD_OF_FIELD, "iFld", "!= 4"})
@IR(counts = {IRNode.ALLOC_ARRAY_OF, "Foo", "!= 4"})
@IR(counts = {IRNode.OOPMAP_WITH, "Foo", "!= 4"})
public void test4() {}
@ -254,7 +255,7 @@ public class TestCompilePhaseCollector {
@Test
@IR(failOn = {IRNode.STORE, IRNode.CHECKCAST_ARRAY_OF, "Foo"})
@IR(counts = {IRNode.ALLOC, "2", IRNode.STORE_OF_FIELD, "iFld", "> 1"})
@IR(counts = {IRNode.FIELD_ACCESS, "2", IRNode.STORE_OF_FIELD, "iFld", "> 1"})
public void test6() {}
}
@ -308,7 +309,7 @@ public class TestCompilePhaseCollector {
@Test
@IR(failOn = IRNode.ALLOC, phase = AFTER_PARSING)
@IR(failOn = {IRNode.ALLOC_ARRAY_OF, "Foo"}, phase = DEFAULT)
@IR(failOn = {IRNode.OOPMAP_WITH, "Foo"}, phase = DEFAULT)
public void test3() {}
@Test
@ -326,7 +327,7 @@ public class TestCompilePhaseCollector {
@Test
@IR(failOn = IRNode.STORE, phase = {PHASEIDEALLOOP1, PHASEIDEALLOOP2})
@IR(failOn = IRNode.ALLOC, phase = DEFAULT)
@IR(failOn = IRNode.FIELD_ACCESS, phase = DEFAULT)
@IR(failOn = IRNode.STORE, phase = {FINAL_CODE, OPTIMIZE_FINISHED})
public void test7() {}
@ -346,7 +347,7 @@ public class TestCompilePhaseCollector {
@Test
@IR(counts = {IRNode.ALLOC, "< 3"}, phase = AFTER_PARSING)
@IR(counts = {IRNode.ALLOC_ARRAY_OF, "Foo", ">=3"}, phase = DEFAULT)
@IR(counts = {IRNode.OOPMAP_WITH, "Foo", ">=3"}, phase = DEFAULT)
public void test3A() {}
@Test
@ -364,7 +365,7 @@ public class TestCompilePhaseCollector {
@Test
@IR(counts = {IRNode.STORE, "3"}, phase = {PHASEIDEALLOOP1, PHASEIDEALLOOP2})
@IR(counts = {IRNode.ALLOC, "3"}, phase = DEFAULT)
@IR(counts = {IRNode.FIELD_ACCESS, "3"}, phase = DEFAULT)
@IR(counts = {IRNode.STORE, "3"}, phase = {FINAL_CODE, OPTIMIZE_FINISHED})
public void test7A() {}
@ -386,13 +387,13 @@ public class TestCompilePhaseCollector {
@Test
@IR(failOn = IRNode.STORE, phase = AFTER_PARSING)
@IR(counts = {IRNode.STORE, "3"}, phase = DEFAULT)
@IR(failOn = {IRNode.ALLOC_OF, "Foo"}, phase = DEFAULT)
@IR(failOn = {IRNode.OOPMAP_WITH, "Foo"}, phase = DEFAULT)
public void mix3() {}
@Test
@IR(counts = {IRNode.STORE, "3"}, phase = AFTER_PARSING)
@IR(counts = {IRNode.STORE_OF_CLASS, "Foo", "3"}, phase = DEFAULT)
@IR(failOn = IRNode.ALLOC, phase = DEFAULT)
@IR(failOn = IRNode.FIELD_ACCESS, phase = DEFAULT)
public void mix4() {}
@Test
@ -402,7 +403,7 @@ public class TestCompilePhaseCollector {
@Test
@IR(failOn = IRNode.STORE, phase = {PHASEIDEALLOOP1, PHASEIDEALLOOP2})
@IR(counts = {IRNode.ALLOC, "3"}, phase = DEFAULT)
@IR(counts = {IRNode.FIELD_ACCESS, "3"}, phase = DEFAULT)
@IR(failOn = IRNode.STORE, phase = {FINAL_CODE, OPTIMIZE_FINISHED})
public void mix6() {}
@ -413,7 +414,7 @@ public class TestCompilePhaseCollector {
@Test
@IR(failOn = IRNode.STORE, phase = {PHASEIDEALLOOP1, DEFAULT, PHASEIDEALLOOP2})
@IR(counts = {IRNode.ALLOC, "3"}, phase = {FINAL_CODE, OPTIMIZE_FINISHED, DEFAULT})
@IR(counts = {IRNode.FIELD_ACCESS, "3"}, phase = {FINAL_CODE, OPTIMIZE_FINISHED, DEFAULT})
public void mix8() {}
@Test
@ -425,13 +426,13 @@ public class TestCompilePhaseCollector {
public void mix10() {}
@Test
@IR(failOn = IRNode.ALLOC, phase = {PHASEIDEALLOOP1, PRINT_OPTO_ASSEMBLY, PHASEIDEALLOOP2})
@IR(counts = {IRNode.ALLOC, "3"}, phase = {FINAL_CODE, OPTIMIZE_FINISHED, DEFAULT})
@IR(failOn = IRNode.FIELD_ACCESS, phase = {PHASEIDEALLOOP1, PRINT_OPTO_ASSEMBLY, PHASEIDEALLOOP2})
@IR(counts = {IRNode.FIELD_ACCESS, "3"}, phase = {FINAL_CODE, OPTIMIZE_FINISHED, DEFAULT})
public void mix11() {}
@Test
@IR(failOn = IRNode.STORE, phase = {PHASEIDEALLOOP1, PRINT_IDEAL, PHASEIDEALLOOP2})
@IR(counts = {IRNode.ALLOC, "3"}, phase = {FINAL_CODE, OPTIMIZE_FINISHED, DEFAULT})
@IR(counts = {IRNode.FIELD_ACCESS, "3"}, phase = {FINAL_CODE, OPTIMIZE_FINISHED, DEFAULT})
public void mix12() {}
@Test
@ -456,7 +457,7 @@ public class TestCompilePhaseCollector {
@Test
@IR(counts = {"foo", "3"}, phase = {PHASEIDEALLOOP1, PHASEIDEALLOOP2})
@IR(failOn = IRNode.ALLOC, phase = {FINAL_CODE, OPTIMIZE_FINISHED, DEFAULT})
@IR(failOn = IRNode.FIELD_ACCESS, phase = {FINAL_CODE, OPTIMIZE_FINISHED, DEFAULT})
public void mix17() {}
}
}