summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chapter04/README.md4
-rw-r--r--chapter04/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter06/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter07/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter08/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter09/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter13/src/main/java/com/seaofnodes/simple/node/SubNode.java18
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter17/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/SubNode.java19
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/SubNode.java19
23 files changed, 357 insertions, 64 deletions
diff --git a/chapter04/README.md b/chapter04/README.md
index 2c7f7e9c..07085e80 100644
--- a/chapter04/README.md
+++ b/chapter04/README.md
@@ -305,6 +305,7 @@ Here is a list of peepholes introduced in this Chapter, more will be introduced
| Before | After | Description |
|-----------------------|-----------------------|------------------------------------------------|
| (arg + 0 ) | arg | Add of zero identity |
+| (arg - 0 ) | arg | Sub of zero identity |
| (arg * 1 ) | arg | Multiple of one identity |
| (con + arg) | (arg + con) | Move constants to right, to encourage folding |
| (con * arg) | (arg * con) | Move constants to right, to encourage folding |
@@ -312,6 +313,9 @@ Here is a list of peepholes introduced in this Chapter, more will be introduced
| ((arg1 + con) + arg2) | ((arg1 + arg2) + con) | Move constants to right, to encourage folding |
| (arg + arg) | (arg * 2) | Sum-of-products form |
| (arg - arg) | 0 | Sub of same is 0
+| (0 - arg) | (-arg) | Sub from 0 is negation
+| (arg1 - (-arg2)) | (arg1 + arg2) | Sub of negation is add
+| ((-arg1) - arg2) | -(arg1 + arg2) | Sub from negation is negation of sum
| (con / 1) | con | Division by one
| (arg == arg) | 1 | Compare of same
| (arg != arg) | 0 | Compare of same
diff --git a/chapter04/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter04/src/main/java/com/seaofnodes/simple/node/SubNode.java
index f5ad663d..304092f4 100644
--- a/chapter04/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter04/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -32,6 +32,25 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
+ // x - (-y) is x+y
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
+
+ // (-x) - y is -(x+y)
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
+
return null;
}
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java
index d3fd1c7e..fa777a30 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -32,6 +32,25 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
+ // x - (-y) is x+y
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
+
+ // (-x) - y is -(x+y)
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
+
return null;
}
diff --git a/chapter06/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter06/src/main/java/com/seaofnodes/simple/node/SubNode.java
index d3fd1c7e..fa777a30 100644
--- a/chapter06/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter06/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -32,6 +32,25 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
+ // x - (-y) is x+y
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
+
+ // (-x) - y is -(x+y)
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
+
return null;
}
diff --git a/chapter07/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter07/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 1ab17b04..650b7856 100644
--- a/chapter07/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter07/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -34,6 +34,25 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
+ // x - (-y) is x+y
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
+
+ // (-x) - y is -(x+y)
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
+
return null;
}
diff --git a/chapter08/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter08/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 1ab17b04..650b7856 100644
--- a/chapter08/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter08/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -34,6 +34,25 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
+ // x - (-y) is x+y
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
+
+ // (-x) - y is -(x+y)
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
+
return null;
}
diff --git a/chapter09/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter09/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 59cd31f0..8fd6d3ed 100644
--- a/chapter09/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter09/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -37,6 +37,25 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
+ // x - (-y) is x+y
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
+
+ // (-x) - y is -(x+y)
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
+
return null;
}
diff --git a/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java
index dfb4744d..8fd6d3ed 100644
--- a/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -37,13 +37,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 76a34e31..e4494a5a 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -38,13 +38,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return 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 d8538277..d55cbb4e 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -39,13 +39,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter13/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter13/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 4b860c37..d55cbb4e 100644
--- a/chapter13/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter13/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -39,14 +39,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 45c4817c..38e28ba4 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -38,13 +38,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 9eb30089..a433ca90 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -37,13 +37,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 9eb30089..a433ca90 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -37,13 +37,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter17/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter17/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 24499cbc..044d0c62 100644
--- a/chapter17/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter17/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -42,13 +42,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 357bbc3b..299f33b8 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -41,13 +41,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 357bbc3b..299f33b8 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -41,13 +41,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 357bbc3b..299f33b8 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -41,13 +41,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 51164dcc..5ba02dc5 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -41,13 +41,24 @@ public class SubNode extends Node {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return null;
}
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 8e4f6f79..6dbd55cb 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -27,13 +27,24 @@ public class SubNode extends ArithNode {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return super.idealize();
}
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 8e4f6f79..6dbd55cb 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -27,13 +27,24 @@ public class SubNode extends ArithNode {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return super.idealize();
}
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 8e4f6f79..6dbd55cb 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -27,13 +27,24 @@ public class SubNode extends ArithNode {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return super.idealize();
}
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/SubNode.java
index aba1df90..c294ab5c 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -30,13 +30,24 @@ public class SubNode extends ArithNode {
@Override
public Node idealize() {
+ Node lhs = in(1);
+ Node rhs = in(2);
+ Type t1 = lhs._type;
+ Type t2 = rhs._type;
+
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ return lhs;
+
+ if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 )
+ return new MinusNode(rhs);
+
// x - (-y) is x+y
- if( in(2) instanceof MinusNode minus )
- return new AddNode(in(1),minus.in(1));
+ if( rhs instanceof MinusNode minus )
+ return new AddNode(lhs,minus.in(1));
// (-x) - y is -(x+y)
- if( in(1) instanceof MinusNode minus )
- return new MinusNode(new AddNode(minus.in(1),in(2)).peephole());
+ if( lhs instanceof MinusNode minus )
+ return new MinusNode(new AddNode(minus.in(1),rhs).peephole());
return super.idealize();
}