summaryrefslogtreecommitdiff
path: root/chapter24/src/main/java/com
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2026-10-05 11:30:22 -0700
committerCliff Click <cliffc@acm.org>2026-10-05 11:30:22 -0700
commit3b8ad2977ef3911aed7c681037e4640dca59749b (patch)
treea5abc5de804f060ec127e11409563cd85b375691 /chapter24/src/main/java/com
parent9ec90998c7a968c18338c6ca4eddcb553f610169 (diff)
downloadSimple-3b8ad2977ef3911aed7c681037e4640dca59749b.tar.gz
Simple-3b8ad2977ef3911aed7c681037e4640dca59749b.zip
Require matching types to use algebraic identies
Fixes some bugs `flit x; return x ^ 0;` should give an error instead of returning the plain `x`
Diffstat (limited to 'chapter24/src/main/java/com')
-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
9 files changed, 9 insertions, 9 deletions
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