From a0d2771819f04b609ba0ea9c664471587e4754d5 Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Wed, 24 Jul 2024 21:34:16 +0300 Subject: minor FP bugs Fix bug AddF+0, SubF+0 Fix bug flipping EQ sides. --- chapter12/src/main/java/com/seaofnodes/simple/.#Parser.java | 1 - chapter12/src/main/java/com/seaofnodes/simple/Parser.java | 6 ++++-- chapter12/src/main/java/com/seaofnodes/simple/node/AddFNode.java | 8 +++----- chapter12/src/main/java/com/seaofnodes/simple/node/BoolNode.java | 6 ++---- chapter12/src/main/java/com/seaofnodes/simple/node/SubFNode.java | 8 +++----- 5 files changed, 12 insertions(+), 17 deletions(-) delete mode 100644 chapter12/src/main/java/com/seaofnodes/simple/.#Parser.java (limited to 'chapter12/src/main') 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; -- cgit v1.2.3