diff options
| author | Cliff Click <cliffc@acm.org> | 2026-10-19 09:33:28 -0700 |
|---|---|---|
| committer | Cliff Click <cliffc@acm.org> | 2026-10-19 09:33:28 -0700 |
| commit | ef8d9c4630db6af79c25526c8e80c54a48df4e39 (patch) | |
| tree | c21474ceab3af7d8661ae93f7fc49002d96fcd43 /chapter16/src/main | |
| parent | 300d2a9c3672acacc8bdd8d5370a424651a00571 (diff) | |
| download | Simple-ef8d9c4630db6af79c25526c8e80c54a48df4e39.tar.gz Simple-ef8d9c4630db6af79c25526c8e80c54a48df4e39.zip | |
Fix memory on Load splitting up
Diffstat (limited to 'chapter16/src/main')
| -rw-r--r-- | chapter16/src/main/java/com/seaofnodes/simple/Parser.java | 2 | ||||
| -rw-r--r-- | chapter16/src/main/java/com/seaofnodes/simple/node/LoadNode.java | 3 |
2 files changed, 4 insertions, 1 deletions
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/Parser.java b/chapter16/src/main/java/com/seaofnodes/simple/Parser.java index 41a3fcaa..b4cfaaf3 100644 --- a/chapter16/src/main/java/com/seaofnodes/simple/Parser.java +++ b/chapter16/src/main/java/com/seaofnodes/simple/Parser.java @@ -910,7 +910,7 @@ public class Parser { // Arrays include control, as a proxy for a safety range check // Structs don't need this; they only need a NPE check which is // done via the type system. - //if( base.isAry() ) load.setDef(0,ctrl()); + if( base.isAry() ) load.setDef(0,ctrl()); return parsePostfix(load.peephole()); } diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/LoadNode.java index 8d604b28..ab53aa6a 100644 --- a/chapter16/src/main/java/com/seaofnodes/simple/node/LoadNode.java +++ b/chapter16/src/main/java/com/seaofnodes/simple/node/LoadNode.java @@ -122,6 +122,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()) && off() instanceof ConstantNode ) { // Profit on RHS/Loop backedge if( profit(memphi,2) || |
