summaryrefslogtreecommitdiff
path: root/chapter23/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'chapter23/src/main/java/com')
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/LoadNode.java5
1 files changed, 3 insertions, 2 deletions
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index 06226df0..ad478d55 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -103,8 +103,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 &&
- // Array access control must not be moved across the merge.
- in(0)==null &&
+ // 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