summaryrefslogtreecommitdiff
path: root/chapter18
diff options
context:
space:
mode:
Diffstat (limited to 'chapter18')
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/IfNode.java1
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/LoadNode.java5
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java5
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/PhiNode.java2
4 files changed, 7 insertions, 6 deletions
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/IfNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/IfNode.java
index c49ee662..eafcdf5b 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/IfNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/IfNode.java
@@ -34,6 +34,7 @@ public class IfNode extends CFGNode implements MultiNode {
// If the If node is not reachable then neither is any following Proj
if (ctrl()._type != Type.CONTROL && ctrl()._type != Type.BOTTOM )
return TypeTuple.IF_NEITHER;
+ if( _disablePeephole ) return TypeTuple.IF_BOTH;
Node pred = pred();
Type t = pred._type;
// High types mean NEITHER side is reachable.
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index 7c5a0e66..eee5169d 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -166,8 +166,9 @@ public class LoadNode extends MemOpNode {
private boolean profit(PhiNode phi, int idx) {
Node px = phi.in(idx);
if( px==null ) return false;
- if( px._type instanceof TypeMem mem && mem._t.isHighOrConst() ) { px.addDep(this); return true; }
- if( px instanceof StoreNode st1 && ptr()==st1.ptr() && off()==st1.off() ) { px.addDep(this); return true; }
+ if( px._type instanceof TypeMem mem && mem._t.isHighOrConst() ) return true;
+ if( px instanceof StoreNode st1 && ptr()==st1.ptr() && off()==st1.off() ) return true;
+ px.addDep(this);
return false;
}
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java
index 61d99ed1..8a08853c 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/MemMergeNode.java
@@ -113,8 +113,7 @@ public class MemMergeNode extends Node {
for( int i = 2; i < len; i++)
if( alias(i) != that.alias(i) ) { // No need for redundant Phis
// If we are in lazy phi mode we need to a lookup
- // by name as it will trigger a phi creation
- //Var v = _vars.at(i);
+ // by alias as it will trigger a phi creation
Node lhs = this._mem(i,null);
Node rhs = that._mem(i,null);
alias(i, new PhiNode(Parser.memName(i), lhs._type.glb().meet(rhs._type.glb()), r, lhs, rhs).peephole());
@@ -124,7 +123,7 @@ public class MemMergeNode extends Node {
// Fill in the backedge of any inserted Phis
void _endLoopMem( ScopeNode scope, MemMergeNode back, MemMergeNode exit ) {
Node exit_def = exit.alias(1);
- for( int i=1; i<back.nIns(); i++ ) {
+ for( int i=1; i<nIns(); i++ ) {
if( in(i) instanceof PhiNode phi && phi.region()==scope.ctrl() ) {
assert phi.in(2)==null;
phi.setDef(2,back.in(i)==scope ? phi : back.in(i)); // Fill backedge
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/PhiNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/PhiNode.java
index 4dae6f36..9aed8287 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/PhiNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/PhiNode.java
@@ -124,7 +124,7 @@ public class PhiNode extends Node {
if( r.idom(this).addDep(this) instanceof IfNode iff && iff.pred().addDep(this)==val ) {
// Must walk the idom on the null side to make sure we hit False.
CFGNode idom = (CFGNode)r.in(nullx);
- while( idom.nIns() > 0 && idom.in(0) != iff ) idom = idom.idom();
+ while( idom != null && idom.nIns() > 0 && idom.in(0) != iff ) idom = idom.idom();
if( idom instanceof CProjNode proj && proj._idx==1 )
return val;
}