summaryrefslogtreecommitdiff
path: root/chapter12/src/main
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-07-24 21:34:16 +0300
committerDibyendu Majumdar <dibyendumajumdar@users.noreply.github.com>2024-08-05 23:28:33 +0100
commita0d2771819f04b609ba0ea9c664471587e4754d5 (patch)
tree252b12957a18bf7bc393899ea03463f303e3f967 /chapter12/src/main
parent1135eb1fc15c97aa5ef300721a034e24cf980052 (diff)
downloadSimple-a0d2771819f04b609ba0ea9c664471587e4754d5.tar.gz
Simple-a0d2771819f04b609ba0ea9c664471587e4754d5.zip
minor FP bugs
Fix bug AddF+0, SubF+0 Fix bug flipping EQ sides.
Diffstat (limited to 'chapter12/src/main')
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/.#Parser.java1
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/Parser.java6
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/AddFNode.java8
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java6
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/SubFNode.java8
5 files changed, 12 insertions, 17 deletions
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/.#Parser.java b/chapter12/src/main/java/com/seaofnodes/simple/.#Parser.java
deleted file mode 100644
index 57c63c60..00000000
--- a/chapter12/src/main/java/com/seaofnodes/simple/.#Parser.java
+++ /dev/null
@@ -1 +0,0 @@
-cliffc@CLIFF-CLICK-LAP.9640:1721544010 \ No newline at end of file
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/Parser.java b/chapter12/src/main/java/com/seaofnodes/simple/Parser.java
index 6f8e41c6..f4108461 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/Parser.java
@@ -508,8 +508,9 @@ public class Parser {
else break;
// Peepholes can fire, but lhs is already "hooked", kept alive
op.setDef(idx,parseAddition());
- op = op.widen();
- lhs = op.peephole();
+ Node fop = op.widen();
+ lhs = fop.peephole();
+ op.kill();
if( negate ) // Extra negate for !=
lhs = new NotNode(lhs).peephole();
}
@@ -840,6 +841,7 @@ public class Parser {
boolean isNumber(char ch) {return Character.isDigit(ch);}
+ // Return a constant Type, either TypeInteger or TypeFloat
private Type parseNumber() {
int old = _position;
int len = isLongOrDouble();
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/AddFNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/AddFNode.java
index cc416be7..e5a2440c 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/AddFNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/AddFNode.java
@@ -32,12 +32,10 @@ public class AddFNode extends Node {
@Override
public Node idealize() {
Node lhs = in(1);
- Node rhs = in(2);
- Type t1 = lhs._type;
- Type t2 = rhs._type;
+ Type t2 = in(2)._type;
- // Add of 1.
- if ( t2.isConstant() && t2 instanceof TypeFloat i && i.value()==1 )
+ // Add of 1.
+ if ( t2.isConstant() && t2 instanceof TypeFloat i && i.value()==0 )
return lhs;
return null;
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java
index 1d3a1031..a8515bcb 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java
@@ -54,11 +54,9 @@ abstract public class BoolNode extends Node {
if( this instanceof EQ ) {
if( !(in(2) instanceof ConstantNode) ) {
// con==noncon becomes noncon==con
- if( in(1) instanceof ConstantNode )
- return new EQ(in(2),in(1));
+ if( in(1) instanceof ConstantNode || in(1)._nid > in(2)._nid )
// Equals sorts by NID otherwise: non.high == non.low becomes non.low == non.high
- else if( in(1)._nid > in(2)._nid )
- return new EQ(in(2),in(1));
+ return in(1)._type instanceof TypeFloat ? new EQF(in(2),in(1)) : new EQ(in(2),in(1));
}
// Equals X==0 becomes a !X
if( (in(2)._type == TypeInteger.ZERO || in(2)._type == TypeMemPtr.NULLPTR) )
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/SubFNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/SubFNode.java
index aa2553f8..682930e0 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/SubFNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/SubFNode.java
@@ -32,12 +32,10 @@ public class SubFNode extends Node {
@Override
public Node idealize() {
Node lhs = in(1);
- Node rhs = in(2);
- Type t1 = lhs._type;
- Type t2 = rhs._type;
+ Type t2 = in(2)._type;
- // Sub of 1.
- if ( t2.isConstant() && t2 instanceof TypeFloat i && i.value()==1 )
+ // Sub of 1.
+ if ( t2.isConstant() && t2 instanceof TypeFloat i && i.value()==0 )
return lhs;
return null;