summaryrefslogtreecommitdiff
path: root/chapter20/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'chapter20/src/main/java/com')
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/LoadNode.java3
1 files changed, 3 insertions, 0 deletions
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index b9905912..9b86c696 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -143,6 +143,9 @@ public class LoadNode extends MemOpNode {
// else ptr.x = e1; : e1;
// val = ptr.x; ptr.x = val;
if( mem() instanceof MemPhiNode memphi && memphi.region()._type == Type.CONTROL && memphi.nIns()== 3 &&
+ // Retain control on both copies only if it dominates both paths.
+ // The Region itself, or a later range check, cannot move to its inputs.
+ (in(0)==null || cfg0().domLCA(memphi.region().idom(this),this)==cfg0()) &&
// Offset can be hoisted
off() instanceof ConstantNode &&
// Pointer can be hoisted