summaryrefslogtreecommitdiff
path: root/chapter05
diff options
context:
space:
mode:
Diffstat (limited to 'chapter05')
-rw-r--r--chapter05/README.md4
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/AddNode.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/BoolNode.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/DivNode.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/MinusNode.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/MulNode.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/NotNode.java2
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/PhiNode.java5
-rw-r--r--chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java2
9 files changed, 15 insertions, 8 deletions
diff --git a/chapter05/README.md b/chapter05/README.md
index 7337da33..2732066e 100644
--- a/chapter05/README.md
+++ b/chapter05/README.md
@@ -83,6 +83,10 @@ one for each of the control inputs to that `Region`. The result computed by a
control input to the `Region` can be active at a time, and the `Phi` passes
through the data value from the matching input.[^1]
+Its type is the meet of its data-input types. Two different integer constants
+merge to `TypeInteger.BOT`: the value is unknown, but it is still an integer.
+Integer arithmetic likewise retains an integer result type when it cannot fold.
+
#### `RegionNode`
In this Sea of Nodes, there is an embedded Control Flow Graph - and like a
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/AddNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/AddNode.java
index 0600222a..2772c4c5 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/AddNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/AddNode.java
@@ -23,7 +23,7 @@ public class AddNode extends Node {
return TypeInteger.constant(i0.value()+i1.value());
return i0.meet(i1);
}
- return Type.BOTTOM;
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/BoolNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/BoolNode.java
index f5db6574..87acc6cc 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/BoolNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/BoolNode.java
@@ -29,7 +29,7 @@ abstract public class BoolNode extends Node {
return TypeInteger.constant(doOp(i0.value(), i1.value()) ? 1 : 0);
return i0.meet(i1);
}
- return Type.BOTTOM;
+ return TypeInteger.BOT;
}
abstract boolean doOp(long lhs, long rhs);
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/DivNode.java
index 1bb04be7..f80f092d 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/DivNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/DivNode.java
@@ -25,7 +25,7 @@ public class DivNode extends Node {
: TypeInteger.constant(i0.value()/i1.value());
return i0.meet(i1);
}
- return Type.BOTTOM;
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/MinusNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/MinusNode.java
index b83c41a5..ad6e513a 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/MinusNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/MinusNode.java
@@ -18,7 +18,7 @@ public class MinusNode extends Node {
public Type compute() {
if (in(1)._type instanceof TypeInteger i0)
return i0.isConstant() ? TypeInteger.constant(-i0.value()) : i0;
- return Type.BOTTOM;
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/MulNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/MulNode.java
index 46ee6058..b1d9e44a 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/MulNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/MulNode.java
@@ -23,7 +23,7 @@ public class MulNode extends Node {
return TypeInteger.constant(i0.value()*i1.value());
return i0.meet(i1);
}
- return Type.BOTTOM;
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/NotNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/NotNode.java
index 83c63244..6a56ff64 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/NotNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/NotNode.java
@@ -18,7 +18,7 @@ public class NotNode extends Node {
public Type compute() {
if( in(1)._type instanceof TypeInteger i0 )
return i0.isConstant() ? TypeInteger.constant(i0.value()==0 ? 1 : 0) : i0;
- return Type.BOTTOM;
+ return TypeInteger.BOT;
}
@Override
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/PhiNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/PhiNode.java
index 95c0fdf9..b3b5462d 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/PhiNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/PhiNode.java
@@ -24,7 +24,10 @@ public class PhiNode extends Node {
@Override
public Type compute() {
- return Type.BOTTOM;
+ Type t = in(1)._type;
+ for( int i=2; i<nIns(); i++ )
+ t = t.meet(in(i)._type);
+ return t;
}
@Override
diff --git a/chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java
index 2e170273..d3fd1c7e 100644
--- a/chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java
+++ b/chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java
@@ -27,7 +27,7 @@ public class SubNode extends Node {
return TypeInteger.constant(i0.value()-i1.value());
return i0.meet(i1);
}
- return Type.BOTTOM;
+ return TypeInteger.BOT;
}
@Override