Don't merge values for exit block in LSE.
This enables some additional optimizations since exit block doesn't
really merge values.
Test: run-test on host.
Change-Id: I21ed7e0e43a3bc5d9ed2dabfad8462129b904eb7
diff --git a/test/530-checker-lse/src/Main.java b/test/530-checker-lse/src/Main.java
index ca8108f..c4cc3b0 100644
--- a/test/530-checker-lse/src/Main.java
+++ b/test/530-checker-lse/src/Main.java
@@ -949,6 +949,56 @@
return array[1] + array[i];
}
+ /// CHECK-START: int Main.testExitMerge(boolean) load_store_elimination (before)
+ /// CHECK: NewInstance
+ /// CHECK: InstanceFieldSet
+ /// CHECK: InstanceFieldGet
+ /// CHECK: Return
+ /// CHECK: InstanceFieldSet
+ /// CHECK: Throw
+
+ /// CHECK-START: int Main.testExitMerge(boolean) load_store_elimination (after)
+ /// CHECK-NOT: NewInstance
+ /// CHECK-NOT: InstanceFieldSet
+ /// CHECK-NOT: InstanceFieldGet
+ /// CHECK: Return
+ /// CHECK-NOT: InstanceFieldSet
+ /// CHECK: Throw
+ private static int testExitMerge(boolean cond) {
+ TestClass obj = new TestClass();
+ if (cond) {
+ obj.i = 1;
+ return obj.i + 1;
+ } else {
+ obj.i = 2;
+ throw new Error();
+ }
+ }
+
+ /// CHECK-START: int Main.testExitMerge2(boolean) load_store_elimination (before)
+ /// CHECK: NewInstance
+ /// CHECK: InstanceFieldSet
+ /// CHECK: InstanceFieldGet
+ /// CHECK: InstanceFieldSet
+ /// CHECK: InstanceFieldGet
+
+ /// CHECK-START: int Main.testExitMerge2(boolean) load_store_elimination (after)
+ /// CHECK-NOT: NewInstance
+ /// CHECK-NOT: InstanceFieldSet
+ /// CHECK-NOT: InstanceFieldGet
+ private static int testExitMerge2(boolean cond) {
+ TestClass obj = new TestClass();
+ int res;
+ if (cond) {
+ obj.i = 1;
+ res = obj.i + 1;
+ } else {
+ obj.i = 2;
+ res = obj.j + 2;
+ }
+ return res;
+ }
+
static void assertIntEquals(int result, int expected) {
if (expected != result) {
throw new Error("Expected: " + expected + ", found: " + result);
@@ -1039,6 +1089,10 @@
assertIntEquals(testStoreStore().j, 43);
assertIntEquals(testStoreStoreWithDeoptimize(new int[4]), 4);
+ assertIntEquals(testExitMerge(true), 2);
+ assertIntEquals(testExitMerge2(true), 2);
+ assertIntEquals(testExitMerge2(false), 2);
+
int ret = testNoSideEffects(iarray);
assertIntEquals(iarray[0], 101);
assertIntEquals(iarray[1], 102);