summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-09-12 10:11:51 -0700
committerCliff Click <cliffc@acm.org>2024-09-12 12:04:37 -0700
commitce4c47a5bec87ca404fbb49a2d91f34ab6f4e545 (patch)
tree8cfddded5827858d444915c97b8da42faa0e642f
parent180e0612d0395ad23f7b5782e799c05a145734c7 (diff)
downloadSimple-ce4c47a5bec87ca404fbb49a2d91f34ab6f4e545.tar.gz
Simple-ce4c47a5bec87ca404fbb49a2d91f34ab6f4e545.zip
Fix GCM of CSE stores
Stop CSE of stores. Backports to ch11,12,13,14
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java4
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/Parser.java4
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/LoadNode.java2
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/MemOpNode.java8
-rw-r--r--chapter11/src/main/java/com/seaofnodes/simple/node/StoreNode.java4
-rw-r--r--chapter11/src/test/java/com/seaofnodes/simple/Chapter11Test.java21
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/Parser.java4
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/LoadNode.java2
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/MemOpNode.java8
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/StoreNode.java4
-rw-r--r--chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java17
-rw-r--r--chapter13/src/main/java/com/seaofnodes/simple/Parser.java4
-rw-r--r--chapter13/src/main/java/com/seaofnodes/simple/node/LoadNode.java2
-rw-r--r--chapter13/src/main/java/com/seaofnodes/simple/node/MemOpNode.java9
-rw-r--r--chapter13/src/main/java/com/seaofnodes/simple/node/StoreNode.java6
-rw-r--r--chapter13/src/test/java/com/seaofnodes/simple/Chapter11Test.java17
-rw-r--r--chapter13/src/test/java/com/seaofnodes/simple/Chapter13Test.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/Parser.java4
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/LoadNode.java2
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/MemOpNode.java9
-rw-r--r--chapter14/src/main/java/com/seaofnodes/simple/node/StoreNode.java6
-rw-r--r--chapter14/src/test/java/com/seaofnodes/simple/Chapter11Test.java17
-rw-r--r--chapter14/src/test/java/com/seaofnodes/simple/Chapter13Test.java2
23 files changed, 104 insertions, 54 deletions
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java b/chapter11/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
index 054a489c..14540d46 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/GlobalCodeMotion.java
@@ -120,7 +120,7 @@ public abstract class GlobalCodeMotion {
ns[i].setDef(0,late[i]);
}
- // Forwards post-order pass. Schedule all outputs first, then draw a
+ // Forwards post-order pass. Schedule all outputs first, then draw an
// idom-tree line from the LCA of uses to the early schedule. Schedule is
// legal anywhere on this line; pick the most control-dependent (largest
// idepth) in the shallowest loop nest.
@@ -154,7 +154,7 @@ public abstract class GlobalCodeMotion {
if( n instanceof LoadNode load )
lca = find_anti_dep(lca,load,early,late);
- // Walk up from the LCA to the early, looking for best place. This is
+ // Walk up from the LCA to the early, looking for best place. This is the
// lowest execution frequency, approximated by least loop depth and
// deepest control flow.
CFGNode best = lca;
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/Parser.java b/chapter11/src/main/java/com/seaofnodes/simple/Parser.java
index e614d463..e367f499 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/Parser.java
@@ -601,7 +601,7 @@ public class Parser {
Node n = new NewNode(TypeMemPtr.make(obj), ctrl()).peephole().keep();
int alias = START._aliasStarts.get(obj._name);
for( Field field : obj._fields ) {
- memAlias(alias, new StoreNode(field._fname, alias, memAlias(alias), n, ZERO).peephole());
+ memAlias(alias, new StoreNode(field._fname, alias, ctrl(), memAlias(alias), n, ZERO).peephole());
alias++;
}
return n.unkeep();
@@ -639,7 +639,7 @@ public class Parser {
if( peek('=') ) _lexer._position--;
else {
Node val = parseExpression();
- memAlias(alias, new StoreNode(name, alias, memAlias(alias), expr, val).peephole());
+ memAlias(alias, new StoreNode(name, alias, ctrl(), memAlias(alias), expr, val).peephole());
return expr; // "obj.a = expr" returns the expression while updating memory
}
}
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index 4ed06da4..296237f4 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -21,7 +21,7 @@ public class LoadNode extends MemOpNode {
* @param memPtr The ptr to the struct from where we load a field
*/
public LoadNode(String name, int alias, Type glb, Node memSlice, Node memPtr) {
- super(name, alias, memSlice, memPtr);
+ super(name, alias, null, memSlice, memPtr);
_declaredType = glb;
}
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/MemOpNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
index 7f8d060a..551d2aa9 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
@@ -12,15 +12,11 @@ public abstract class MemOpNode extends Node {
public final String _name;
public final int _alias;
- public MemOpNode(String name, int alias, Node memSlice, Node memPtr) {
- super(null, memSlice, memPtr);
+ public MemOpNode(String name, int alias, Node... nodes) {
+ super(nodes);
_name = name;
_alias = alias;
}
- public MemOpNode(String name, int alias, Node memSlice, Node memPtr, Node value) {
- this(name, alias, memSlice, memPtr);
- addDef(value);
- }
public Node mem() { return in(1); }
public Node ptr() { return in(2); }
diff --git a/chapter11/src/main/java/com/seaofnodes/simple/node/StoreNode.java b/chapter11/src/main/java/com/seaofnodes/simple/node/StoreNode.java
index 7c41e767..db8e2ce6 100644
--- a/chapter11/src/main/java/com/seaofnodes/simple/node/StoreNode.java
+++ b/chapter11/src/main/java/com/seaofnodes/simple/node/StoreNode.java
@@ -17,8 +17,8 @@ public class StoreNode extends MemOpNode {
* @param memPtr The ptr to the struct where we will store a value
* @param value Value to be stored
*/
- public StoreNode(String name, int alias, Node memSlice, Node memPtr, Node value) {
- super(name, alias, memSlice, memPtr, value);
+ public StoreNode(String name, int alias, Node ctrl, Node memSlice, Node memPtr, Node value) {
+ super(name, alias, ctrl, memSlice, memPtr, value);
}
@Override
diff --git a/chapter11/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter11/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index 9b05d66c..d1c0ac1d 100644
--- a/chapter11/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter11/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -496,7 +496,7 @@ return v;
@Test
public void testExample2() {
Parser parser = new Parser(
- """
+ """
struct S { int f; }
S v = new S;
int i = arg;
@@ -507,8 +507,25 @@ while (arg > 0) {
arg = arg - 1;
}
return v;
- """);
+""");
StopNode stop = parser.parse(false).iterate(true);
//assertEquals("return new S;", stop.toString());
}
+
+ @Test
+ public void testSplit() {
+ Parser parser = new Parser(
+ """
+struct S { int f; }
+S s = new S;
+if( arg==0 ) s.f = 1;
+else if (arg == 1) s.f = 1;
+return s.f;
+""");
+ StopNode stop = parser.parse(false).iterate(true);
+ assertEquals("return Phi(Region35,1,Phi(Region33,1,0));", stop.toString());
+ assertEquals(1L, Evaluator.evaluate(stop, 0));
+ assertEquals(1L, Evaluator.evaluate(stop, 1));
+ assertEquals(0L, Evaluator.evaluate(stop, 2));
+ }
}
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/Parser.java b/chapter12/src/main/java/com/seaofnodes/simple/Parser.java
index e919449f..1a223726 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/Parser.java
@@ -584,7 +584,7 @@ public class Parser {
Node n = new NewNode(TypeMemPtr.make(obj), ctrl()).peephole().keep();
int alias = START._aliasStarts.get(obj._name);
for( Field field : obj._fields ) {
- memAlias(alias, new StoreNode(field._fname, alias, memAlias(alias), n, ZERO).peephole());
+ memAlias(alias, new StoreNode(field._fname, alias, ctrl(), memAlias(alias), n, ZERO).peephole());
alias++;
}
return n.unkeep();
@@ -623,7 +623,7 @@ public class Parser {
if( peek('=') ) _lexer._position--;
else {
Node val = parseExpression();
- memAlias(alias, new StoreNode(name, alias, memAlias(alias), expr, val).peephole());
+ memAlias(alias, new StoreNode(name, alias, ctrl(), memAlias(alias), expr, val).peephole());
return expr; // "obj.a = expr" returns the expression while updating memory
}
}
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index 95d49662..244a0919 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -21,7 +21,7 @@ public class LoadNode extends MemOpNode {
* @param memPtr The ptr to the struct from where we load a field
*/
public LoadNode(String name, int alias, Type glb, Node memSlice, Node memPtr) {
- super(name, alias, memSlice, memPtr);
+ super(name, alias, null, memSlice, memPtr);
_declaredType = glb;
}
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/MemOpNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
index 7f8d060a..551d2aa9 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
@@ -12,15 +12,11 @@ public abstract class MemOpNode extends Node {
public final String _name;
public final int _alias;
- public MemOpNode(String name, int alias, Node memSlice, Node memPtr) {
- super(null, memSlice, memPtr);
+ public MemOpNode(String name, int alias, Node... nodes) {
+ super(nodes);
_name = name;
_alias = alias;
}
- public MemOpNode(String name, int alias, Node memSlice, Node memPtr, Node value) {
- this(name, alias, memSlice, memPtr);
- addDef(value);
- }
public Node mem() { return in(1); }
public Node ptr() { return in(2); }
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/StoreNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/StoreNode.java
index 7c41e767..db8e2ce6 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/StoreNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/StoreNode.java
@@ -17,8 +17,8 @@ public class StoreNode extends MemOpNode {
* @param memPtr The ptr to the struct where we will store a value
* @param value Value to be stored
*/
- public StoreNode(String name, int alias, Node memSlice, Node memPtr, Node value) {
- super(name, alias, memSlice, memPtr, value);
+ public StoreNode(String name, int alias, Node ctrl, Node memSlice, Node memPtr, Node value) {
+ super(name, alias, ctrl, memSlice, memPtr, value);
}
@Override
diff --git a/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index 6c1f7938..dfb1786b 100644
--- a/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter12/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -511,4 +511,21 @@ return v;
StopNode stop = parser.parse(false).iterate(true);
//assertEquals("return new S;", stop.toString());
}
+
+ @Test
+ public void testSplit() {
+ Parser parser = new Parser(
+ """
+struct S { int f; }
+S s = new S;
+if( arg==0 ) s.f = 1;
+else if (arg == 1) s.f = 1;
+return s.f;
+""");
+ StopNode stop = parser.parse(false).iterate(true);
+ assertEquals("return Phi(Region35,1,Phi(Region33,1,0));", stop.toString());
+ assertEquals(1L, Evaluator.evaluate(stop, 0));
+ assertEquals(1L, Evaluator.evaluate(stop, 1));
+ assertEquals(0L, Evaluator.evaluate(stop, 2));
+ }
}
diff --git a/chapter13/src/main/java/com/seaofnodes/simple/Parser.java b/chapter13/src/main/java/com/seaofnodes/simple/Parser.java
index f04bf5c3..53448e4d 100644
--- a/chapter13/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter13/src/main/java/com/seaofnodes/simple/Parser.java
@@ -598,7 +598,7 @@ public class Parser {
Node n = new NewNode(TypeMemPtr.make(obj), ctrl()).peephole().keep();
int alias = START._aliasStarts.get(obj._name);
for( Field field : obj._fields ) {
- memAlias(alias, new StoreNode(field._fname, alias, field._type, memAlias(alias), n, new ConstantNode(field._type.makeInit()).peephole(),true).peephole());
+ memAlias(alias, new StoreNode(field._fname, alias, field._type, ctrl(), memAlias(alias), n, new ConstantNode(field._type.makeInit()).peephole(),true).peephole());
alias++;
}
return n.unkeep();
@@ -640,7 +640,7 @@ public class Parser {
else {
Node val = parseExpression();
Type glb = base._fields[idx]._type;
- memAlias(alias, new StoreNode(name, alias,glb, memAlias(alias), expr, val, false).peephole());
+ memAlias(alias, new StoreNode(name, alias,glb, ctrl(), memAlias(alias), expr, val, false).peephole());
return expr; // "obj.a = expr" returns the expression while updating memory
}
}
diff --git a/chapter13/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter13/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index 4e1421fa..a033a7cf 100644
--- a/chapter13/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter13/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -19,7 +19,7 @@ public class LoadNode extends MemOpNode {
* @param memPtr The ptr to the struct from where we load a field
*/
public LoadNode(String name, int alias, Type glb, Node memSlice, Node memPtr) {
- super(name, alias, glb, memSlice, memPtr);
+ super(name, alias, glb, null, memSlice, memPtr);
}
@Override public String label() { return _name; }
diff --git a/chapter13/src/main/java/com/seaofnodes/simple/node/MemOpNode.java b/chapter13/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
index bc8e46d3..95319c24 100644
--- a/chapter13/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
+++ b/chapter13/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
@@ -14,16 +14,11 @@ public abstract class MemOpNode extends Node {
public final Type _declaredType;
- public MemOpNode(String name, int alias, Type glb, Node memSlice, Node memPtr) {
- super(null, memSlice, memPtr);
+ public MemOpNode(String name, int alias, Type glb, Node... nodes ) {
+ super(nodes);
_name = name;
_alias = alias;
_declaredType = glb;
-
- }
- public MemOpNode(String name, int alias, Type glb, Node memSlice, Node memPtr, Node value) {
- this(name, alias, glb, memSlice, memPtr);
- addDef(value);
}
public Node mem() { return in(1); }
diff --git a/chapter13/src/main/java/com/seaofnodes/simple/node/StoreNode.java b/chapter13/src/main/java/com/seaofnodes/simple/node/StoreNode.java
index 44a14be1..57e8b3ad 100644
--- a/chapter13/src/main/java/com/seaofnodes/simple/node/StoreNode.java
+++ b/chapter13/src/main/java/com/seaofnodes/simple/node/StoreNode.java
@@ -19,12 +19,12 @@ public class StoreNode extends MemOpNode {
* @param memPtr The ptr to the struct where we will store a value
* @param value Value to be stored
*/
- public StoreNode(String name, int alias, Type glb, Node memSlice, Node memPtr, Node value, boolean init) {
- super(name, alias, glb, memSlice, memPtr, value);
+ public StoreNode(String name, int alias, Type glb, Node ctrl, Node memSlice, Node memPtr, Node value, boolean init) {
+ super(name, alias, glb, ctrl, memSlice, memPtr, value);
_init = init;
}
- @Override public String label() { return "ST"+_name; }
+ @Override public String label() { return "." +_name+"="; }
@Override public String glabel() { return "." +_name+"="; }
@Override public boolean isMem() { return true; }
diff --git a/chapter13/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter13/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index e367184c..a47bf471 100644
--- a/chapter13/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter13/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -511,4 +511,21 @@ return v;
StopNode stop = parser.parse(false).iterate(true);
//assertEquals("return new S;", stop.toString());
}
+
+ @Test
+ public void testSplit() {
+ Parser parser = new Parser(
+ """
+struct S { int f; }
+S s = new S;
+if( arg==0 ) s.f = 1;
+else if (arg == 1) s.f = 1;
+return s.f;
+""");
+ StopNode stop = parser.parse(false).iterate(true);
+ assertEquals("return Phi(Region37,1,Phi(Region35,1,0));", stop.toString());
+ assertEquals(1L, Evaluator.evaluate(stop, 0));
+ assertEquals(1L, Evaluator.evaluate(stop, 1));
+ assertEquals(0L, Evaluator.evaluate(stop, 2));
+ }
}
diff --git a/chapter13/src/test/java/com/seaofnodes/simple/Chapter13Test.java b/chapter13/src/test/java/com/seaofnodes/simple/Chapter13Test.java
index f7d4d5a8..a58ad583 100644
--- a/chapter13/src/test/java/com/seaofnodes/simple/Chapter13Test.java
+++ b/chapter13/src/test/java/com/seaofnodes/simple/Chapter13Test.java
@@ -35,7 +35,7 @@ while( arg ) {
return head.next.i;
""");
try { parser.parse(true).iterate(true); fail(); }
- catch( Exception e ) { assertEquals("Might be null accessing 'i'",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Might be null accessing 'next'",e.getMessage()); }
}
@Test
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/Parser.java b/chapter14/src/main/java/com/seaofnodes/simple/Parser.java
index bea06a19..417f4295 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/Parser.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/Parser.java
@@ -668,7 +668,7 @@ public class Parser {
Node n = new NewNode(TypeMemPtr.make(obj), ctrl()).peephole().keep();
int alias = START._aliasStarts.get(obj._name);
for( Field field : obj._fields ) {
- memAlias(alias, new StoreNode(field._fname, alias, field._type, memAlias(alias), n, new ConstantNode(field._type.makeInit()).peephole(),true).peephole());
+ memAlias(alias, new StoreNode(field._fname, alias, field._type, ctrl(), memAlias(alias), n, new ConstantNode(field._type.makeInit()).peephole(),true).peephole());
alias++;
}
return n.unkeep();
@@ -712,7 +712,7 @@ public class Parser {
Type glb = base._fields[idx]._type;
// Auto-truncate when storing to narrow fields
val = zsMask(val,glb);
- memAlias(alias, new StoreNode(name, alias,glb, memAlias(alias), expr, val, false).peephole());
+ memAlias(alias, new StoreNode(name, alias,glb, ctrl(), memAlias(alias), expr, val, false).peephole());
return expr; // "obj.a = expr" returns the expression while updating memory
}
}
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/LoadNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/LoadNode.java
index 4e1421fa..a033a7cf 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/LoadNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/LoadNode.java
@@ -19,7 +19,7 @@ public class LoadNode extends MemOpNode {
* @param memPtr The ptr to the struct from where we load a field
*/
public LoadNode(String name, int alias, Type glb, Node memSlice, Node memPtr) {
- super(name, alias, glb, memSlice, memPtr);
+ super(name, alias, glb, null, memSlice, memPtr);
}
@Override public String label() { return _name; }
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/MemOpNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
index bc8e46d3..76564db0 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/MemOpNode.java
@@ -14,16 +14,11 @@ public abstract class MemOpNode extends Node {
public final Type _declaredType;
- public MemOpNode(String name, int alias, Type glb, Node memSlice, Node memPtr) {
- super(null, memSlice, memPtr);
+ public MemOpNode(String name, int alias, Type glb, Node... nodes) {
+ super(nodes);
_name = name;
_alias = alias;
_declaredType = glb;
-
- }
- public MemOpNode(String name, int alias, Type glb, Node memSlice, Node memPtr, Node value) {
- this(name, alias, glb, memSlice, memPtr);
- addDef(value);
}
public Node mem() { return in(1); }
diff --git a/chapter14/src/main/java/com/seaofnodes/simple/node/StoreNode.java b/chapter14/src/main/java/com/seaofnodes/simple/node/StoreNode.java
index 44a14be1..57e8b3ad 100644
--- a/chapter14/src/main/java/com/seaofnodes/simple/node/StoreNode.java
+++ b/chapter14/src/main/java/com/seaofnodes/simple/node/StoreNode.java
@@ -19,12 +19,12 @@ public class StoreNode extends MemOpNode {
* @param memPtr The ptr to the struct where we will store a value
* @param value Value to be stored
*/
- public StoreNode(String name, int alias, Type glb, Node memSlice, Node memPtr, Node value, boolean init) {
- super(name, alias, glb, memSlice, memPtr, value);
+ public StoreNode(String name, int alias, Type glb, Node ctrl, Node memSlice, Node memPtr, Node value, boolean init) {
+ super(name, alias, glb, ctrl, memSlice, memPtr, value);
_init = init;
}
- @Override public String label() { return "ST"+_name; }
+ @Override public String label() { return "." +_name+"="; }
@Override public String glabel() { return "." +_name+"="; }
@Override public boolean isMem() { return true; }
diff --git a/chapter14/src/test/java/com/seaofnodes/simple/Chapter11Test.java b/chapter14/src/test/java/com/seaofnodes/simple/Chapter11Test.java
index 3b9cac7d..ca0db829 100644
--- a/chapter14/src/test/java/com/seaofnodes/simple/Chapter11Test.java
+++ b/chapter14/src/test/java/com/seaofnodes/simple/Chapter11Test.java
@@ -511,4 +511,21 @@ return v;
StopNode stop = parser.parse(false).iterate(true);
//assertEquals("return new S;", stop.toString());
}
+
+ @Test
+ public void testSplit() {
+ Parser parser = new Parser(
+ """
+struct S { int f; }
+S s = new S;
+if( arg==0 ) s.f = 1;
+else if (arg == 1) s.f = 1;
+return s.f;
+""");
+ StopNode stop = parser.parse(false).iterate(true);
+ assertEquals("return Phi(Region37,1,Phi(Region35,1,0));", stop.toString());
+ assertEquals(1L, Evaluator.evaluate(stop, 0));
+ assertEquals(1L, Evaluator.evaluate(stop, 1));
+ assertEquals(0L, Evaluator.evaluate(stop, 2));
+ }
}
diff --git a/chapter14/src/test/java/com/seaofnodes/simple/Chapter13Test.java b/chapter14/src/test/java/com/seaofnodes/simple/Chapter13Test.java
index f9aa3016..11ab5621 100644
--- a/chapter14/src/test/java/com/seaofnodes/simple/Chapter13Test.java
+++ b/chapter14/src/test/java/com/seaofnodes/simple/Chapter13Test.java
@@ -35,7 +35,7 @@ while( arg ) {
return head.next.i;
""");
try { parser.parse(true).iterate(true); fail(); }
- catch( Exception e ) { assertEquals("Might be null accessing 'i'",e.getMessage()); }
+ catch( Exception e ) { assertEquals("Might be null accessing 'next'",e.getMessage()); }
}
@Test