summaryrefslogtreecommitdiff
path: root/test/639-checker-code-sinking/src/Main.java
diff options
context:
space:
mode:
Diffstat (limited to 'test/639-checker-code-sinking/src/Main.java')
-rw-r--r--test/639-checker-code-sinking/src/Main.java43
1 files changed, 31 insertions, 12 deletions
diff --git a/test/639-checker-code-sinking/src/Main.java b/test/639-checker-code-sinking/src/Main.java
index 8efac92c34..28fa57cfbf 100644
--- a/test/639-checker-code-sinking/src/Main.java
+++ b/test/639-checker-code-sinking/src/Main.java
@@ -100,13 +100,20 @@ public class Main {
}
}
+ // NB It might seem that we'd move the allocation and ifield-set but those are
+ // already moved into the throw block by a combo of partial-LSE and DCE.
+ // Instead all that is actually moved is the LoadClass. Also note the
+ // LoadClass can only be moved since it refers to the 'Main' class itself,
+ // meaning there's no need for any clinit/actual loading.
+ //
/// CHECK-START: void Main.testFieldStores(boolean) code_sinking (before)
/// CHECK: <<Int42:i\d+>> IntConstant 42
+ /// CHECK: begin_block
/// CHECK: <<LoadClass:l\d+>> LoadClass class_name:Main
- /// CHECK: <<NewInstance:l\d+>> NewInstance [<<LoadClass>>]
- /// CHECK: InstanceFieldSet [<<NewInstance>>,<<Int42>>]
/// CHECK: If
/// CHECK: begin_block
+ /// CHECK: <<NewInstance:l\d+>> NewInstance [<<LoadClass>>]
+ /// CHECK: InstanceFieldSet [<<NewInstance>>,<<Int42>>]
/// CHECK: Throw
/// CHECK-START: void Main.testFieldStores(boolean) code_sinking (after)
@@ -114,15 +121,17 @@ public class Main {
/// CHECK-NOT: NewInstance
/// CHECK: If
/// CHECK: begin_block
- /// CHECK: <<Error:l\d+>> LoadClass class_name:java.lang.Error
/// CHECK: <<LoadClass:l\d+>> LoadClass class_name:Main
/// CHECK-NOT: begin_block
/// CHECK: <<NewInstance:l\d+>> NewInstance [<<LoadClass>>]
/// CHECK-NOT: begin_block
/// CHECK: InstanceFieldSet [<<NewInstance>>,<<Int42>>]
/// CHECK-NOT: begin_block
- /// CHECK: NewInstance [<<Error>>]
- /// CHECK: Throw
+ /// CHECK: <<Error:l\d+>> LoadClass class_name:java.lang.Error
+ /// CHECK-NOT: begin_block
+ /// CHECK: <<Throw:l\d+>> NewInstance [<<Error>>]
+ /// CHECK-NOT: begin_block
+ /// CHECK: Throw [<<Throw>>]
public static void testFieldStores(boolean doThrow) {
Main m = new Main();
m.intField = 42;
@@ -306,16 +315,26 @@ public class Main {
}
// Test that we preserve the order of stores.
+ // NB It might seem that we'd move the allocation and ifield-set but those are
+ // already moved into the throw block by a combo of partial-LSE and DCE.
+ // Instead all that is actually moved is the LoadClass. Also note the
+ // LoadClass can only be moved since it refers to the 'Main' class itself,
+ // meaning there's no need for any clinit/actual loading.
+ //
/// CHECK-START: void Main.testStoreStore(boolean) code_sinking (before)
/// CHECK: <<Int42:i\d+>> IntConstant 42
/// CHECK: <<Int43:i\d+>> IntConstant 43
/// CHECK: <<LoadClass:l\d+>> LoadClass class_name:Main
- /// CHECK: <<NewInstance:l\d+>> NewInstance [<<LoadClass>>]
- /// CHECK: InstanceFieldSet [<<NewInstance>>,<<Int42>>]
- /// CHECK: InstanceFieldSet [<<NewInstance>>,<<Int43>>]
/// CHECK: If
/// CHECK: begin_block
+ // Moved to throw block by partial-LSE and DCE.
+ /// CHECK: <<NewInstance:l\d+>> NewInstance [<<LoadClass>>]
+ // These were moved by partial LSE and order of sets is not observable and are
+ // in an arbitrary order.
+ /// CHECK-DAG: InstanceFieldSet [<<NewInstance>>,<<Int42>>]
+ /// CHECK-DAG: InstanceFieldSet [<<NewInstance>>,<<Int43>>]
/// CHECK: Throw
+ /// CHECK-NOT: InstanceFieldSet
/// CHECK-START: void Main.testStoreStore(boolean) code_sinking (after)
/// CHECK: <<Int42:i\d+>> IntConstant 42
@@ -323,17 +342,17 @@ public class Main {
/// CHECK-NOT: NewInstance
/// CHECK: If
/// CHECK: begin_block
- /// CHECK: <<Error:l\d+>> LoadClass class_name:java.lang.Error
/// CHECK: <<LoadClass:l\d+>> LoadClass class_name:Main
- /// CHECK-NOT: begin_block
/// CHECK: <<NewInstance:l\d+>> NewInstance [<<LoadClass>>]
/// CHECK-NOT: begin_block
- /// CHECK: InstanceFieldSet [<<NewInstance>>,<<Int42>>]
+ /// CHECK-DAG: InstanceFieldSet [<<NewInstance>>,<<Int42>>]
+ /// CHECK-DAG: InstanceFieldSet [<<NewInstance>>,<<Int43>>]
/// CHECK-NOT: begin_block
- /// CHECK: InstanceFieldSet [<<NewInstance>>,<<Int43>>]
+ /// CHECK: <<Error:l\d+>> LoadClass class_name:java.lang.Error
/// CHECK-NOT: begin_block
/// CHECK: NewInstance [<<Error>>]
/// CHECK: Throw
+ /// CHECK-NOT: InstanceFieldSet
public static void testStoreStore(boolean doThrow) {
Main m = new Main();
m.intField = 42;