summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/AndNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/AndNode.java2
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter15/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter17a/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter17a/src/main/java/com/seaofnodes/simple/node/AndNode.java2
-rw-r--r--chapter17a/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter17a/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter17a/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter17a/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter17a/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter17a/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter17a/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter17b/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter17b/src/main/java/com/seaofnodes/simple/node/AndNode.java2
-rw-r--r--chapter17b/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter17b/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter17b/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter17b/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter17b/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter17b/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter17b/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/AndNode.java2
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter18/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/AndNode.java2
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter19/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter20/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter21/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter22/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter23/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/OrNode.java2
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter24/src/main/java/com/seaofnodes/simple/node/XorNode.java2
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/DivNode.java4
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/SarNode.java2
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/ShlNode.java2
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/ShrNode.java2
-rw-r--r--chapter25/src/main/java/com/seaofnodes/simple/node/XorNode.java2
118 files changed, 119 insertions, 119 deletions
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 5e54100d..0046bd03 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -40,7 +40,7 @@ public class AddNode extends Node {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 instanceof TypeInteger i && i.isConstant() && i.value()==0 )
+ if( t2 instanceof TypeInteger i && i.isConstant() && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/AndNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/AndNode.java
index 5e51e248..e2729e60 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/AndNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/AndNode.java
@@ -35,7 +35,7 @@ public class AndNode extends Node {
// And of -1. We do not check for (-1&x) because this will already
// canonicalize to (x&-1)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/DivNode.java
index 5c7ba42c..e725ace4 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -30,7 +30,7 @@ public class DivNode extends Node {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type.isConstant() && in(2)._type instanceof TypeInteger i && i.value()==1 )
+ if( in(2)._type.isConstant() && in(2)._type instanceof TypeInteger i && i.value()==1 && in(1)._type instanceof TypeInteger )
return in(1);
return null;
}
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/MulNode.java
index b403c2bf..c16edb4b 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -34,7 +34,7 @@ public class MulNode extends Node {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
- if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 )
+ if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 4088fde6..67585423 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -32,7 +32,7 @@ public class OrNode extends Node {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 31d96ada..6ab7141f 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -33,7 +33,7 @@ public class SarNode extends Node {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 98331d08..999fc7da 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -30,7 +30,7 @@ public class ShlNode extends Node {
Type t2 = rhs._type;
// Shl of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x << 3 << (y ? 1 : 2) ==> x << (y ? 4 : 5)
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 97ffc7cd..b89f5191 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -38,7 +38,7 @@ public class ShrNode extends Node {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/XorNode.java
index 7490032c..720fb8e4 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -32,7 +32,7 @@ public class XorNode extends Node {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/AddNode.java
index b08f749a..5875a73d 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -41,7 +41,7 @@ public class AddNode extends Node {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 instanceof TypeInteger i && i.isConstant() && i.value()==0 )
+ if( t2 instanceof TypeInteger i && i.isConstant() && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/AndNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/AndNode.java
index 1f223bcb..0844f2ea 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/AndNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/AndNode.java
@@ -34,7 +34,7 @@ public class AndNode extends Node {
// And of -1. We do not check for (-1&x) because this will already
// canonicalize to (x&-1)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/DivNode.java
index cd749a03..5b31d216 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -30,7 +30,7 @@ public class DivNode extends Node {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return null;
}
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/MulNode.java
index b403c2bf..c16edb4b 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -34,7 +34,7 @@ public class MulNode extends Node {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
- if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 )
+ if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 5badd015..1f312d10 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -31,7 +31,7 @@ public class OrNode extends Node {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 65151598..2294b879 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -33,7 +33,7 @@ public class SarNode extends Node {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 278c8390..a6f9214f 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -29,7 +29,7 @@ public class ShlNode extends Node {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && add.in(2)._type instanceof TypeInteger c && c.isConstant() ) {
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 70fd630d..2193965b 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -29,7 +29,7 @@ public class ShrNode extends Node {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/XorNode.java
index 0521cc52..dbff90cf 100644
--- a/chapter15/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter15/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -31,7 +31,7 @@ public class XorNode extends Node {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/AddNode.java
index b08f749a..5875a73d 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -41,7 +41,7 @@ public class AddNode extends Node {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 instanceof TypeInteger i && i.isConstant() && i.value()==0 )
+ if( t2 instanceof TypeInteger i && i.isConstant() && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java
index bd03d6cb..d80e25e7 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/AndNode.java
@@ -37,7 +37,7 @@ public class AndNode extends Node {
// And of -1. We do not check for (-1&x) because this will already
// canonicalize to (x&-1)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/DivNode.java
index cd749a03..5b31d216 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -30,7 +30,7 @@ public class DivNode extends Node {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return null;
}
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/MulNode.java
index a9ac07e6..50404922 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -36,7 +36,7 @@ public class MulNode extends Node {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
- if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 )
+ if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 5be31b88..ae54a67d 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -34,7 +34,7 @@ public class OrNode extends Node {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 44233b3d..9f07956c 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -38,7 +38,7 @@ public class SarNode extends Node {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 4d673056..6811d3ac 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -34,7 +34,7 @@ public class ShlNode extends Node {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && add.in(2)._type instanceof TypeInteger c && c.isConstant() && c!=TypeInteger.ZERO ) {
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index bc6881f1..d550f5ca 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -34,7 +34,7 @@ public class ShrNode extends Node {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java
index ef7273b8..5efe23e2 100644
--- a/chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter16/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -34,7 +34,7 @@ public class XorNode extends Node {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter17a/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter17a/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 5eb0b0a3..0f9ecec9 100644
--- a/chapter17a/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter17a/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -42,7 +42,7 @@ public class AddNode extends Node {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 instanceof TypeInteger i && i.isConstant() && i.value()==0 )
+ if( t2 instanceof TypeInteger i && i.isConstant() && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter17a/src/main/java/com/seaofnodes/simple/node/AndNode.java b/chapter17a/src/main/java/com/seaofnodes/simple/node/AndNode.java
index bd03d6cb..d80e25e7 100644
--- a/chapter17a/src/main/java/com/seaofnodes/simple/node/AndNode.java
+++ b/chapter17a/src/main/java/com/seaofnodes/simple/node/AndNode.java
@@ -37,7 +37,7 @@ public class AndNode extends Node {
// And of -1. We do not check for (-1&x) because this will already
// canonicalize to (x&-1)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter17a/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter17a/src/main/java/com/seaofnodes/simple/node/DivNode.java
index cd749a03..5b31d216 100644
--- a/chapter17a/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter17a/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -30,7 +30,7 @@ public class DivNode extends Node {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return null;
}
diff --git a/chapter17a/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter17a/src/main/java/com/seaofnodes/simple/node/MulNode.java
index a9ac07e6..50404922 100644
--- a/chapter17a/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter17a/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -36,7 +36,7 @@ public class MulNode extends Node {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
- if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 )
+ if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter17a/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter17a/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 5be31b88..ae54a67d 100644
--- a/chapter17a/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter17a/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -34,7 +34,7 @@ public class OrNode extends Node {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter17a/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter17a/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 44233b3d..9f07956c 100644
--- a/chapter17a/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter17a/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -38,7 +38,7 @@ public class SarNode extends Node {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter17a/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter17a/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 65dfe684..89d205c5 100644
--- a/chapter17a/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter17a/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -34,7 +34,7 @@ public class ShlNode extends Node {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && add.addDep(this).in(2)._type instanceof TypeInteger c && c.isConstant() && c!=TypeInteger.ZERO ) {
diff --git a/chapter17a/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter17a/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 757fd69e..22b42f3e 100644
--- a/chapter17a/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter17a/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -34,7 +34,7 @@ public class ShrNode extends Node {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter17a/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter17a/src/main/java/com/seaofnodes/simple/node/XorNode.java
index ef7273b8..5efe23e2 100644
--- a/chapter17a/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter17a/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -34,7 +34,7 @@ public class XorNode extends Node {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter17b/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter17b/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 5eb0b0a3..0f9ecec9 100644
--- a/chapter17b/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter17b/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -42,7 +42,7 @@ public class AddNode extends Node {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 instanceof TypeInteger i && i.isConstant() && i.value()==0 )
+ if( t2 instanceof TypeInteger i && i.isConstant() && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter17b/src/main/java/com/seaofnodes/simple/node/AndNode.java b/chapter17b/src/main/java/com/seaofnodes/simple/node/AndNode.java
index bd03d6cb..d80e25e7 100644
--- a/chapter17b/src/main/java/com/seaofnodes/simple/node/AndNode.java
+++ b/chapter17b/src/main/java/com/seaofnodes/simple/node/AndNode.java
@@ -37,7 +37,7 @@ public class AndNode extends Node {
// And of -1. We do not check for (-1&x) because this will already
// canonicalize to (x&-1)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter17b/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter17b/src/main/java/com/seaofnodes/simple/node/DivNode.java
index cd749a03..5b31d216 100644
--- a/chapter17b/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter17b/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -30,7 +30,7 @@ public class DivNode extends Node {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return null;
}
diff --git a/chapter17b/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter17b/src/main/java/com/seaofnodes/simple/node/MulNode.java
index a9ac07e6..50404922 100644
--- a/chapter17b/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter17b/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -36,7 +36,7 @@ public class MulNode extends Node {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
- if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 )
+ if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter17b/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter17b/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 5be31b88..ae54a67d 100644
--- a/chapter17b/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter17b/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -34,7 +34,7 @@ public class OrNode extends Node {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter17b/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter17b/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 44233b3d..9f07956c 100644
--- a/chapter17b/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter17b/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -38,7 +38,7 @@ public class SarNode extends Node {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter17b/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter17b/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 65dfe684..89d205c5 100644
--- a/chapter17b/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter17b/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -34,7 +34,7 @@ public class ShlNode extends Node {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && add.addDep(this).in(2)._type instanceof TypeInteger c && c.isConstant() && c!=TypeInteger.ZERO ) {
diff --git a/chapter17b/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter17b/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 757fd69e..22b42f3e 100644
--- a/chapter17b/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter17b/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -34,7 +34,7 @@ public class ShrNode extends Node {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter17b/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter17b/src/main/java/com/seaofnodes/simple/node/XorNode.java
index ef7273b8..5efe23e2 100644
--- a/chapter17b/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter17b/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -34,7 +34,7 @@ public class XorNode extends Node {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 08c4d356..f88c2175 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -42,7 +42,7 @@ public class AddNode extends Node {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 == TypeInteger.ZERO )
+ if( t2 == TypeInteger.ZERO && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/AndNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/AndNode.java
index 8a85ec59..7cb16c71 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/AndNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/AndNode.java
@@ -37,7 +37,7 @@ public class AndNode extends LogicalNode {
// And of -1. We do not check for (-1&x) because this will already
// canonicalize to (x&-1)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/DivNode.java
index f0ee21e1..70631c0a 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -29,7 +29,7 @@ public class DivNode extends Node {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return null;
}
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index 20220915..66e26163 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -25,7 +25,7 @@ public class MinusNode extends Node {
@Override
public Node idealize() {
// -(-x) is x
- if( in(1) instanceof MinusNode minus )
+ if( in(1) instanceof MinusNode minus && addDep(minus.in(1))._type instanceof TypeInteger )
return minus.in(1);
return null;
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/MulNode.java
index 51dd96cf..2c1ba3de 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -36,7 +36,7 @@ public class MulNode extends Node {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
- if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 )
+ if ( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 5a87ce09..1cd8bafc 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -34,7 +34,7 @@ public class OrNode extends LogicalNode {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 47091fed..d321da42 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -37,7 +37,7 @@ public class SarNode extends LogicalNode {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 2342e7f5..84c19247 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -33,7 +33,7 @@ public class ShlNode extends LogicalNode {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && add.addDep(this).in(2)._type instanceof TypeInteger c && c.isConstant() ) {
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 926bc993..587e1631 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -33,7 +33,7 @@ public class ShrNode extends LogicalNode {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/XorNode.java
index ef022a2c..034e352a 100644
--- a/chapter18/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter18/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -33,7 +33,7 @@ public class XorNode extends LogicalNode {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 3a39ce9b..2dfedbb5 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -42,7 +42,7 @@ public class AddNode extends Node {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 == TypeInteger.ZERO )
+ if( t2 == TypeInteger.ZERO && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/AndNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/AndNode.java
index 8a85ec59..7cb16c71 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/AndNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/AndNode.java
@@ -37,7 +37,7 @@ public class AndNode extends LogicalNode {
// And of -1. We do not check for (-1&x) because this will already
// canonicalize to (x&-1)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==-1 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/DivNode.java
index f0ee21e1..70631c0a 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -29,7 +29,7 @@ public class DivNode extends Node {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return null;
}
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index 20220915..66e26163 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -25,7 +25,7 @@ public class MinusNode extends Node {
@Override
public Node idealize() {
// -(-x) is x
- if( in(1) instanceof MinusNode minus )
+ if( in(1) instanceof MinusNode minus && addDep(minus.in(1))._type instanceof TypeInteger )
return minus.in(1);
return null;
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/MulNode.java
index 104a5581..720f15d7 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -43,7 +43,7 @@ public class MulNode extends Node {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
long c = i.value();
- if( c==1 ) return lhs;
+ if( c==1 ) return lhs._type instanceof TypeInteger ? lhs : null;
if( c==0 ) return Parser.ZERO;
// Mul by a power of 2, +/-1. Bit patterns more complex than this
// are unlikely to win on an X86 vs the normal "imul", and so
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 5a87ce09..1cd8bafc 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -34,7 +34,7 @@ public class OrNode extends LogicalNode {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 47091fed..d321da42 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -37,7 +37,7 @@ public class SarNode extends LogicalNode {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 2342e7f5..84c19247 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -33,7 +33,7 @@ public class ShlNode extends LogicalNode {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && add.addDep(this).in(2)._type instanceof TypeInteger c && c.isConstant() ) {
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 926bc993..587e1631 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -33,7 +33,7 @@ public class ShrNode extends LogicalNode {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/XorNode.java
index ef022a2c..034e352a 100644
--- a/chapter19/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter19/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -33,7 +33,7 @@ public class XorNode extends LogicalNode {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 01cb6bb7..0fc3bad6 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -46,7 +46,7 @@ public class AddNode extends Node {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 == TypeInteger.ZERO )
+ if( t2 == TypeInteger.ZERO && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/DivNode.java
index f0ee21e1..70631c0a 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -29,7 +29,7 @@ public class DivNode extends Node {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return null;
}
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index 20220915..66e26163 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -25,7 +25,7 @@ public class MinusNode extends Node {
@Override
public Node idealize() {
// -(-x) is x
- if( in(1) instanceof MinusNode minus )
+ if( in(1) instanceof MinusNode minus && addDep(minus.in(1))._type instanceof TypeInteger )
return minus.in(1);
return null;
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/MulNode.java
index e9dc6887..ac97725c 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -43,7 +43,7 @@ public class MulNode extends Node {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
long c = i.value();
- if( c==1 ) return lhs;
+ if( c==1 ) return lhs._type instanceof TypeInteger ? lhs : null;
if( c==0 ) return Parser.ZERO;
// Mul by a power of 2, +/-1. Bit patterns more complex than this
// are unlikely to win on an X86 vs the normal "imul", and so
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 5a87ce09..1cd8bafc 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -34,7 +34,7 @@ public class OrNode extends LogicalNode {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 47091fed..d321da42 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -37,7 +37,7 @@ public class SarNode extends LogicalNode {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 2342e7f5..84c19247 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -33,7 +33,7 @@ public class ShlNode extends LogicalNode {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && add.addDep(this).in(2)._type instanceof TypeInteger c && c.isConstant() ) {
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 926bc993..587e1631 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -33,7 +33,7 @@ public class ShrNode extends LogicalNode {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/XorNode.java
index ef022a2c..034e352a 100644
--- a/chapter20/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter20/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -33,7 +33,7 @@ public class XorNode extends LogicalNode {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 663bca6a..62b33ada 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -46,7 +46,7 @@ public class AddNode extends Node {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 == TypeInteger.ZERO )
+ if( t2 == TypeInteger.ZERO && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java
index f0ee21e1..70631c0a 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -29,7 +29,7 @@ public class DivNode extends Node {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return null;
}
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index 20220915..66e26163 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -25,7 +25,7 @@ public class MinusNode extends Node {
@Override
public Node idealize() {
// -(-x) is x
- if( in(1) instanceof MinusNode minus )
+ if( in(1) instanceof MinusNode minus && addDep(minus.in(1))._type instanceof TypeInteger )
return minus.in(1);
return null;
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java
index e9dc6887..ac97725c 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -43,7 +43,7 @@ public class MulNode extends Node {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
long c = i.value();
- if( c==1 ) return lhs;
+ if( c==1 ) return lhs._type instanceof TypeInteger ? lhs : null;
if( c==0 ) return Parser.ZERO;
// Mul by a power of 2, +/-1. Bit patterns more complex than this
// are unlikely to win on an X86 vs the normal "imul", and so
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 5a87ce09..1cd8bafc 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -34,7 +34,7 @@ public class OrNode extends LogicalNode {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 47091fed..d321da42 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -37,7 +37,7 @@ public class SarNode extends LogicalNode {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index ad7d9978..afd20062 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -33,7 +33,7 @@ public class ShlNode extends LogicalNode {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && addDep(add).in(2)._type instanceof TypeInteger c && c.isConstant() ) {
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 926bc993..587e1631 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -33,7 +33,7 @@ public class ShrNode extends LogicalNode {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/XorNode.java
index ef022a2c..034e352a 100644
--- a/chapter21/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter21/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -33,7 +33,7 @@ public class XorNode extends LogicalNode {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 0f472829..3a5528ef 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -32,7 +32,7 @@ public class AddNode extends ArithNode {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 == TypeInteger.ZERO )
+ if( t2 == TypeInteger.ZERO && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/DivNode.java
index 0de1c946..7b5ae16c 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -18,7 +18,7 @@ public class DivNode extends ArithNode {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return super.idealize();
}
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index 89e65254..cd67b8fc 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -25,7 +25,7 @@ public class MinusNode extends Node {
@Override
public Node idealize() {
// -(-x) is x
- if( in(1) instanceof MinusNode minus )
+ if( in(1) instanceof MinusNode minus && addDep(minus.in(1))._type instanceof TypeInteger )
return minus.in(1);
return null;
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/MulNode.java
index debc2c56..6e1dc053 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -32,7 +32,7 @@ public class MulNode extends ArithNode {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
long c = i.value();
- if( c==1 ) return lhs;
+ if( c==1 ) return lhs._type instanceof TypeInteger ? lhs : null;
if( c==0 ) return Parser.ZERO;
// Mul by a power of 2, +/-1. Bit patterns more complex than this
// are unlikely to win on an X86 vs the normal "imul", and so
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 6b48815d..d16dd194 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -23,7 +23,7 @@ public class OrNode extends ArithNode {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 6b8969e3..429be229 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -25,7 +25,7 @@ public class SarNode extends ArithNode {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 60c91fc9..e2951784 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -30,7 +30,7 @@ public class ShlNode extends ArithNode {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && addDep(add).in(2)._type instanceof TypeInteger c && c.isConstant() ) {
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 81dae615..0023431f 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -21,7 +21,7 @@ public class ShrNode extends ArithNode {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/XorNode.java
index cff1706a..75cea98e 100644
--- a/chapter22/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter22/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -23,7 +23,7 @@ public class XorNode extends ArithNode {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/AddNode.java
index c5ba14de..dfc7d7b3 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -29,7 +29,7 @@ public class AddNode extends ArithNode {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 == TypeInteger.ZERO )
+ if( t2 == TypeInteger.ZERO && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/DivNode.java
index 0de1c946..7b5ae16c 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -18,7 +18,7 @@ public class DivNode extends ArithNode {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return super.idealize();
}
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index 0a2348f7..921e6066 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -24,7 +24,7 @@ public class MinusNode extends Node {
@Override
public Node idealize() {
// -(-x) is x
- if( in(1) instanceof MinusNode minus )
+ if( in(1) instanceof MinusNode minus && addDep(minus.in(1))._type instanceof TypeInteger )
return minus.in(1);
return null;
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/MulNode.java
index debc2c56..6e1dc053 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -32,7 +32,7 @@ public class MulNode extends ArithNode {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
long c = i.value();
- if( c==1 ) return lhs;
+ if( c==1 ) return lhs._type instanceof TypeInteger ? lhs : null;
if( c==0 ) return Parser.ZERO;
// Mul by a power of 2, +/-1. Bit patterns more complex than this
// are unlikely to win on an X86 vs the normal "imul", and so
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 6b48815d..d16dd194 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -23,7 +23,7 @@ public class OrNode extends ArithNode {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 6b8969e3..429be229 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -25,7 +25,7 @@ public class SarNode extends ArithNode {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 60c91fc9..e2951784 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -30,7 +30,7 @@ public class ShlNode extends ArithNode {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && addDep(add).in(2)._type instanceof TypeInteger c && c.isConstant() ) {
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 81dae615..0023431f 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -21,7 +21,7 @@ public class ShrNode extends ArithNode {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/XorNode.java
index cff1706a..75cea98e 100644
--- a/chapter23/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter23/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -23,7 +23,7 @@ public class XorNode extends ArithNode {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/AddNode.java
index c7fd4daa..2bbe1053 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -29,7 +29,7 @@ public class AddNode extends ArithNode {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 == TypeInteger.ZERO )
+ if( t2 == TypeInteger.ZERO && lhs._type instanceof TypeInteger )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/DivNode.java
index 0de1c946..7b5ae16c 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -18,7 +18,7 @@ public class DivNode extends ArithNode {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type instanceof TypeInteger )
return in(1);
return super.idealize();
}
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index 900f673f..94c69785 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -24,7 +24,7 @@ public class MinusNode extends Node {
@Override
public Node idealize() {
// -(-x) is x
- if( in(1) instanceof MinusNode minus )
+ if( in(1) instanceof MinusNode minus && addDep(minus.in(1))._type instanceof TypeInteger )
return minus.in(1);
return null;
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/MulNode.java
index debc2c56..6e1dc053 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -32,7 +32,7 @@ public class MulNode extends ArithNode {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
long c = i.value();
- if( c==1 ) return lhs;
+ if( c==1 ) return lhs._type instanceof TypeInteger ? lhs : null;
if( c==0 ) return Parser.ZERO;
// Mul by a power of 2, +/-1. Bit patterns more complex than this
// are unlikely to win on an X86 vs the normal "imul", and so
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/OrNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/OrNode.java
index 6b48815d..d16dd194 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/OrNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/OrNode.java
@@ -23,7 +23,7 @@ public class OrNode extends ArithNode {
// Or of 0. We do not check for (0|x) because this will already
// canonicalize to (x|0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 6b8969e3..429be229 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -25,7 +25,7 @@ public class SarNode extends ArithNode {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 60c91fc9..e2951784 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -30,7 +30,7 @@ public class ShlNode extends ArithNode {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 )
+ if( (shl.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && addDep(add).in(2)._type instanceof TypeInteger c && c.isConstant() ) {
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 81dae615..0023431f 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -21,7 +21,7 @@ public class ShrNode extends ArithNode {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/XorNode.java
index cff1706a..75cea98e 100644
--- a/chapter24/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter24/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -23,7 +23,7 @@ public class XorNode extends ArithNode {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 46607c23..a29ba73b 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -37,7 +37,7 @@ public class AddNode extends ArithNode {
// Add of 0. We do not check for (0+x) because this will already
// canonicalize to (x+0)
- if( t2 == TypeInteger.ZERO )
+ if( t2 == TypeInteger.ZERO && lhs._type.isa(compute()) )
return lhs;
// Add of same to a multiply by 2
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/DivNode.java
index dcc9a27a..f173f0ef 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -22,12 +22,12 @@ public class DivNode extends ArithNode {
@Override
public Node idealize() {
// Div of 1.
- if( in(2)._type == TypeInteger.TRUE )
+ if( in(2)._type == TypeInteger.TRUE && in(1)._type.isa(compute()) )
return in(1);
// Div of constant
if( _mode==2 ) {
- if( in(2)._type == TypeFloat.constant(1.) )
+ if( in(2)._type == TypeFloat.constant(1.) && in(1)._type.isa(compute()) )
return in(1);
if( in(2)._type instanceof TypeFloat f && f.isConstant() )
return new MulNode(in(1),ConstantNode.make(TypeFloat.constant(1.0/f.value())).peephole(),_mode);
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index 023deba2..e84eb611 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -60,7 +60,7 @@ public class MinusNode extends Node implements ModeNode {
@Override
public Node idealize() {
// -(-x) is x
- if( in(1) instanceof MinusNode minus )
+ if( in(1) instanceof MinusNode minus && addDep(minus.in(1))._type.isa(compute()) )
return minus.in(1);
// Can we decide int vs flt?
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/MulNode.java
index e773ed57..bb99cad5 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -35,7 +35,7 @@ public class MulNode extends ArithNode {
// Mul of 1. We do not check for (1*x) because this will already
// canonicalize to (x*1)
long c = i.value();
- if( c==1 ) return lhs;
+ if( c==1 ) return lhs._type.isa(compute()) ? lhs : super.idealize();
if( c==0 ) return CodeGen.CODE.ZERO;
// Mul by a power of 2, +/-1. Bit patterns more complex than this
// are unlikely to win on an X86 vs the normal "imul", and so
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/SarNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/SarNode.java
index 79b7d0e4..737b531f 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/SarNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/SarNode.java
@@ -26,7 +26,7 @@ public class SarNode extends ArithNode {
Type t2 = rhs._type;
// Sar of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && forceInt(lhs) )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && forceInt(lhs) && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >> 3 >> (y ? 1 : 2) ==> x >> (y ? 4 : 5)
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/ShlNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/ShlNode.java
index 1ca0ba3a..f657cf51 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/ShlNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/ShlNode.java
@@ -31,7 +31,7 @@ public class ShlNode extends ArithNode {
if( rhs._type instanceof TypeInteger shl && shl.isConstant() ) {
// Shl of 0.
- if( (shl.value()&63)==0 && forceInt(lhs) )
+ if( (shl.value()&63)==0 && forceInt(lhs) && lhs._type instanceof TypeInteger )
return lhs;
// (x + c) << i => (x << i) + (c << i)
if( lhs instanceof AddNode add && addDep(add).in(2)._type instanceof TypeInteger c && c.isConstant() ) {
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/ShrNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/ShrNode.java
index 7fad6275..e93ea0e8 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/ShrNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/ShrNode.java
@@ -21,7 +21,7 @@ public class ShrNode extends ArithNode {
Type t2 = rhs._type;
// Shr of 0.
- if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && forceInt(lhs) )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && (i.value()&63)==0 && forceInt(lhs) && lhs._type instanceof TypeInteger )
return lhs;
// TODO: x >>> 3 >>> (y ? 1 : 2) ==> x >>> (y ? 4 : 5)
diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/XorNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/XorNode.java
index 2ee816fa..c825f396 100644
--- a/chapter25/src/main/java/com/seaofnodes/simple/node/XorNode.java
+++ b/chapter25/src/main/java/com/seaofnodes/simple/node/XorNode.java
@@ -24,7 +24,7 @@ public class XorNode extends ArithNode {
// Xor of 0. We do not check for (0^x) because this will already
// canonicalize to (x^0)
- if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && forceInt(lhs) )
+ if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 && forceInt(lhs) && lhs._type instanceof TypeInteger )
return lhs;
// Move constants to RHS: con*arg becomes arg*con