summaryrefslogtreecommitdiff
path: root/chapter14/src/main/java/com/seaofnodes
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-08-16 15:13:41 -0700
committerThalia Archibald <thalia@archibald.dev>2024-09-07 10:54:48 -0700
commit2af636382e865b93250270e903499cfd28eb6052 (patch)
treeeb7118751450891ceeff4e14e1f5411039884960 /chapter14/src/main/java/com/seaofnodes
parentbb4e3e01b5ec1e2cfbd3d6e274750e34542d72f0 (diff)
downloadSimple-2af636382e865b93250270e903499cfd28eb6052.tar.gz
Simple-2af636382e865b93250270e903499cfd28eb6052.zip
Correct constant fold with ranges for most primitives
Diffstat (limited to 'chapter14/src/main/java/com/seaofnodes')
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/AddNode.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/MinusNode.java4
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/NotNode.java3
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/type/TypeFloat.java8
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/type/TypeInteger.java6
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java2
9 files changed, 17 insertions, 14 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 32059b0d..d2dfce16 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -26,7 +26,7 @@ public class AddNode extends Node {
if (i0.isConstant() && i1.isConstant())
return TypeInteger.constant(i0.value()+i1.value());
}
- return in(1)._type.meet(in(2)._type);
+ return TypeInteger.BOT;
}
@Override
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 a3845d89..329c5824 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -28,7 +28,7 @@ public class DivNode extends Node {
? TypeInteger.ZERO
: TypeInteger.constant(i0.value()/i1.value());
}
- return in(1)._type.meet(in(2)._type);
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index ae8e9e1b..6e3b82e9 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -20,8 +20,8 @@ public class MinusNode extends Node {
@Override
public Type compute() {
- if (in(1)._type instanceof TypeInteger i0)
- return i0.isConstant() ? TypeInteger.constant(-i0.value()) : i0;
+ if( in(1)._type instanceof TypeInteger i0 )
+ return i0==TypeInteger.BOT ? TypeInteger.BOT : TypeInteger.make(-i0._max,-i0._min);
return TypeInteger.TOP.meet(in(1)._type);
}
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 8c8a6e0a..f5166a66 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -26,7 +26,7 @@ public class MulNode extends Node {
if (i0.isConstant() && i1.isConstant())
return TypeInteger.constant(i0.value()*i1.value());
}
- return in(1)._type.meet(in(2)._type);
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/NotNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/NotNode.java
index 3cf69520..b3c77c45 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/NotNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/NotNode.java
@@ -20,8 +20,9 @@ public class NotNode extends Node {
@Override
public Type compute() {
Type t0 = in(1)._type;
+ if( t0.isHigh() ) return TypeInteger.BOOL.dual();
switch( t0 ) {
- case TypeInteger i0: return i0.isConstant() ? TypeInteger.constant(i0.value()==0 ? 1 : 0) : i0;
+ case TypeInteger i0: return i0._max < 0 || i0._min > 0 ? TypeInteger.FALSE : (i0==TypeInteger.ZERO ? TypeInteger.TRUE : TypeInteger.BOT);
case TypeFloat i0: return i0.isConstant() ? TypeInteger.constant(i0.value()==0 ? 1 : 0) : i0;
case TypeMemPtr p0:
// top->top, bot->bot, null->1, *void->0, not-null ptr->0, ptr/nil->bot
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 33b6a162..5e91ae53 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -27,7 +27,7 @@ public class SubNode extends Node {
if (i0.isConstant() && i1.isConstant())
return TypeInteger.constant(i0.value()-i1.value());
}
- return in(1)._type.meet(in(2)._type);
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/type/TypeFloat.java b/chapter14/src/main/java/com/seaofnodes/simple/type/TypeFloat.java
index 738aebc9..0932a202 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/type/TypeFloat.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/type/TypeFloat.java
@@ -57,11 +57,9 @@ public class TypeFloat extends Type {
return sb.append("Int");
}
- @Override
- public boolean isHighOrConst() { return _is_con || _con==0; }
-
- @Override
- public boolean isConstant() { return _is_con; }
+ @Override public boolean isHigh() { return this==TOP; }
+ @Override public boolean isHighOrConst() { return _is_con || _con==0; }
+ @Override public boolean isConstant() { return _is_con; }
public double value() { return _con; }
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/type/TypeInteger.java b/chapter14/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
index 7aac62ec..d3f9b66e 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/type/TypeInteger.java
@@ -9,10 +9,12 @@ public class TypeInteger extends Type {
public final static TypeInteger TOP = make(false, 0);
public final static TypeInteger BOT = make(false, 1);
- public final static TypeInteger BOOL= make(0,1);
public final static TypeInteger ZERO= make(0,0);
+ public final static TypeInteger U1 = make(0,1);
+ public final static TypeInteger BOOL= U1;
public final static TypeInteger FALSE=ZERO;
public final static TypeInteger TRUE= make(1,1);
+ public final static TypeInteger U8 = make(0,255);
/**
* Describes an integer *range* - everything from min to max; both min and
@@ -32,7 +34,7 @@ public class TypeInteger extends Type {
public static TypeInteger constant(long con) { return make(true, con); }
- public static void gather(ArrayList<Type> ts) { ts.add(ZERO); ts.add(BOT); }
+ public static void gather(ArrayList<Type> ts) { ts.add(ZERO); ts.add(BOT); ts.add(U1); ts.add(U8); }
// FIXME this display format is problematic
// In visualizer '#' gets prepended if its a constant
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java b/chapter14/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
index 1ad65611..565e15a4 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/type/TypeMemPtr.java
@@ -53,6 +53,8 @@ public class TypeMemPtr extends Type {
}
@Override public TypeMemPtr makeInit() { return NULLPTR; }
+ @Override public boolean isHigh() { return this==TOP; }
+
@Override
int hash() { return (_obj==null ? 0xDEADBEEF : _obj.hashCode()) ^ (_nil ? 1024 : 0); }