From 349c23d0527569284a8bec67f27130c4358e056c Mon Sep 17 00:00:00 2001 From: fuhsnn <66062782+fuhsnn@users.noreply.github.com> Date: Fri, 25 Sep 2026 07:25:49 +0800 Subject: Extend and backport SubNode peephole --- chapter04/README.md | 4 ++++ .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++++++ .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++++++ .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++++++ .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++++++ .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++++++ .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++++++ .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 18 ++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- .../main/java/com/seaofnodes/simple/node/SubNode.java | 19 +++++++++++++++---- 23 files changed, 357 insertions(+), 64 deletions(-) diff --git a/chapter04/README.md b/chapter04/README.md index 2c7f7e9c..07085e80 100644 --- a/chapter04/README.md +++ b/chapter04/README.md @@ -305,6 +305,7 @@ Here is a list of peepholes introduced in this Chapter, more will be introduced | Before | After | Description | |-----------------------|-----------------------|------------------------------------------------| | (arg + 0 ) | arg | Add of zero identity | +| (arg - 0 ) | arg | Sub of zero identity | | (arg * 1 ) | arg | Multiple of one identity | | (con + arg) | (arg + con) | Move constants to right, to encourage folding | | (con * arg) | (arg * con) | Move constants to right, to encourage folding | @@ -312,6 +313,9 @@ Here is a list of peepholes introduced in this Chapter, more will be introduced | ((arg1 + con) + arg2) | ((arg1 + arg2) + con) | Move constants to right, to encourage folding | | (arg + arg) | (arg * 2) | Sum-of-products form | | (arg - arg) | 0 | Sub of same is 0 +| (0 - arg) | (-arg) | Sub from 0 is negation +| (arg1 - (-arg2)) | (arg1 + arg2) | Sub of negation is add +| ((-arg1) - arg2) | -(arg1 + arg2) | Sub from negation is negation of sum | (con / 1) | con | Division by one | (arg == arg) | 1 | Compare of same | (arg != arg) | 0 | Compare of same diff --git a/chapter04/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter04/src/main/java/com/seaofnodes/simple/node/SubNode.java index f5ad663d..304092f4 100644 --- a/chapter04/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter04/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -32,6 +32,25 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + + // x - (-y) is x+y + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); + + // (-x) - y is -(x+y) + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); + return null; } 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 d3fd1c7e..fa777a30 100644 --- a/chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter05/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -32,6 +32,25 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + + // x - (-y) is x+y + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); + + // (-x) - y is -(x+y) + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); + return null; } diff --git a/chapter06/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter06/src/main/java/com/seaofnodes/simple/node/SubNode.java index d3fd1c7e..fa777a30 100644 --- a/chapter06/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter06/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -32,6 +32,25 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + + // x - (-y) is x+y + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); + + // (-x) - y is -(x+y) + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); + return null; } diff --git a/chapter07/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter07/src/main/java/com/seaofnodes/simple/node/SubNode.java index 1ab17b04..650b7856 100644 --- a/chapter07/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter07/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -34,6 +34,25 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + + // x - (-y) is x+y + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); + + // (-x) - y is -(x+y) + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); + return null; } diff --git a/chapter08/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter08/src/main/java/com/seaofnodes/simple/node/SubNode.java index 1ab17b04..650b7856 100644 --- a/chapter08/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter08/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -34,6 +34,25 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + + // x - (-y) is x+y + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); + + // (-x) - y is -(x+y) + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); + return null; } diff --git a/chapter09/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter09/src/main/java/com/seaofnodes/simple/node/SubNode.java index 59cd31f0..8fd6d3ed 100644 --- a/chapter09/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter09/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -37,6 +37,25 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + + // x - (-y) is x+y + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); + + // (-x) - y is -(x+y) + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); + return null; } diff --git a/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java index dfb4744d..8fd6d3ed 100644 --- a/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter10/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -37,13 +37,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/SubNode.java index 76a34e31..e4494a5a 100644 --- a/chapter11/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter11/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -38,13 +38,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java index d8538277..d55cbb4e 100644 --- a/chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter12/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -39,13 +39,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter13/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter13/src/main/java/com/seaofnodes/simple/node/SubNode.java index 4b860c37..d55cbb4e 100644 --- a/chapter13/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter13/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -39,14 +39,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } 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 45c4817c..38e28ba4 100644 --- a/chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter14/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -38,13 +38,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter15/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter15/src/main/java/com/seaofnodes/simple/node/SubNode.java index 9eb30089..a433ca90 100644 --- a/chapter15/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter15/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -37,13 +37,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter16/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter16/src/main/java/com/seaofnodes/simple/node/SubNode.java index 9eb30089..a433ca90 100644 --- a/chapter16/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter16/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -37,13 +37,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter17/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter17/src/main/java/com/seaofnodes/simple/node/SubNode.java index 24499cbc..044d0c62 100644 --- a/chapter17/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter17/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -42,13 +42,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter18/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter18/src/main/java/com/seaofnodes/simple/node/SubNode.java index 357bbc3b..299f33b8 100644 --- a/chapter18/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter18/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -41,13 +41,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter19/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter19/src/main/java/com/seaofnodes/simple/node/SubNode.java index 357bbc3b..299f33b8 100644 --- a/chapter19/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter19/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -41,13 +41,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter20/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter20/src/main/java/com/seaofnodes/simple/node/SubNode.java index 357bbc3b..299f33b8 100644 --- a/chapter20/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter20/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -41,13 +41,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java index 51164dcc..5ba02dc5 100644 --- a/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter21/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -41,13 +41,24 @@ public class SubNode extends Node { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return null; } diff --git a/chapter22/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter22/src/main/java/com/seaofnodes/simple/node/SubNode.java index 8e4f6f79..6dbd55cb 100644 --- a/chapter22/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter22/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -27,13 +27,24 @@ public class SubNode extends ArithNode { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return super.idealize(); } diff --git a/chapter23/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter23/src/main/java/com/seaofnodes/simple/node/SubNode.java index 8e4f6f79..6dbd55cb 100644 --- a/chapter23/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter23/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -27,13 +27,24 @@ public class SubNode extends ArithNode { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return super.idealize(); } diff --git a/chapter24/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter24/src/main/java/com/seaofnodes/simple/node/SubNode.java index 8e4f6f79..6dbd55cb 100644 --- a/chapter24/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter24/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -27,13 +27,24 @@ public class SubNode extends ArithNode { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return super.idealize(); } diff --git a/chapter25/src/main/java/com/seaofnodes/simple/node/SubNode.java b/chapter25/src/main/java/com/seaofnodes/simple/node/SubNode.java index aba1df90..c294ab5c 100644 --- a/chapter25/src/main/java/com/seaofnodes/simple/node/SubNode.java +++ b/chapter25/src/main/java/com/seaofnodes/simple/node/SubNode.java @@ -30,13 +30,24 @@ public class SubNode extends ArithNode { @Override public Node idealize() { + Node lhs = in(1); + Node rhs = in(2); + Type t1 = lhs._type; + Type t2 = rhs._type; + + if( t2.isConstant() && t2 instanceof TypeInteger i && i.value()==0 ) + return lhs; + + if( t1.isConstant() && t1 instanceof TypeInteger i && i.value()==0 ) + return new MinusNode(rhs); + // x - (-y) is x+y - if( in(2) instanceof MinusNode minus ) - return new AddNode(in(1),minus.in(1)); + if( rhs instanceof MinusNode minus ) + return new AddNode(lhs,minus.in(1)); // (-x) - y is -(x+y) - if( in(1) instanceof MinusNode minus ) - return new MinusNode(new AddNode(minus.in(1),in(2)).peephole()); + if( lhs instanceof MinusNode minus ) + return new MinusNode(new AddNode(minus.in(1),rhs).peephole()); return super.idealize(); } -- cgit v1.2.3