summaryrefslogtreecommitdiff
path: root/chapter12
diff options
context:
space:
mode:
Diffstat (limited to 'chapter12')
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/DivNode.java7
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java8
2 files changed, 10 insertions, 5 deletions
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/DivNode.java
index a3845d89..e0c95019 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -32,7 +32,12 @@ public class DivNode extends Node {
}
@Override
- public Node idealize() { return null; }
+ public Node idealize() {
+ // Div of 1.
+ if( in(2)._type.isConstant() && in(2)._type instanceof TypeInteger i && i.value()==1 )
+ return in(1);
+ return null;
+ }
@Override Node copy(Node lhs, Node rhs) { return new DivNode(lhs,rhs); }
@Override Node copyF() { return new DivFNode(null,null); }
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 33b6a162..8bebe774 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -27,15 +27,15 @@ public class SubNode extends Node {
if (i0.isConstant() && i1.isConstant())
return TypeInteger.constant(i0.value()-i1.value());
}
+ // Sub of same is 0
+ if( in(1)==in(2) )
+ return TypeInteger.ZERO;
+
return in(1)._type.meet(in(2)._type);
}
@Override
public Node idealize() {
- // Sub of same is 0
- if( in(1)==in(2) )
- return Parser.ZERO;
-
// x - (-y) is x+y
if( in(2) instanceof MinusNode minus )
return new AddNode(in(1),minus.in(1));