summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorDibyendu Majumdar <mobile@majumdar.org.uk>2023-10-27 20:35:04 +0100
committerDibyendu Majumdar <mobile@majumdar.org.uk>2024-11-16 15:19:12 -0800
commit1950e4db3f81d5b3ab07add23a1f697f90d3682b (patch)
treeee7492409e58d74520ab555e80d89578341d0863 /src/test
parent1f5078741096dc2fe52a75fb5a25bde8e92e8a31 (diff)
downloadSimple-1950e4db3f81d5b3ab07add23a1f697f90d3682b.tar.gz
Simple-1950e4db3f81d5b3ab07add23a1f697f90d3682b.zip
Chapter 5: If Statement, Phi, and Region
Co-authored-by: Cliff Click <cliffc@acm.org> Co-authored-by: XmiliaH <45106915+XmiliaH@users.noreply.github.com> Co-authored-by: Yichen Yan <oraluben@outlook.com> Co-authored-by: Thalia Archibald <thalia@archibald.dev> Co-authored-by: Tamas Hadhazy <helsgithub15@gmail.com> Co-authored-by: David Rubin <87927264+Rexicon226@users.noreply.github.com>
Diffstat (limited to 'src/test')
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter01Test.java3
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter02Test.java14
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter03Test.java10
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter04Test.java33
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter05Test.java212
5 files changed, 243 insertions, 29 deletions
diff --git a/src/test/java/com/seaofnodes/simple/Chapter01Test.java b/src/test/java/com/seaofnodes/simple/Chapter01Test.java
index 3d568337..547c36f8 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter01Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter01Test.java
@@ -11,8 +11,9 @@ public class Chapter01Test {
@Test
public void testSimpleProgram() {
Parser parser = new Parser("return 1;");
- ReturnNode ret = parser.parse();
+ StopNode stop = parser.parse();
StartNode start = Parser.START;
+ ReturnNode ret = (ReturnNode)stop.in(0);
assertTrue(ret.ctrl() instanceof ProjNode);
Node expr = ret.expr();
diff --git a/src/test/java/com/seaofnodes/simple/Chapter02Test.java b/src/test/java/com/seaofnodes/simple/Chapter02Test.java
index 60ee8874..4085ed7e 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter02Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter02Test.java
@@ -12,7 +12,7 @@ public class Chapter02Test {
public void testParseGrammar() {
Parser parser = new Parser("return 1+2*3+-5;");
Node._disablePeephole = true; // disable peephole so we can observe full graph
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return (1+((2*3)+(-5)));", ret.print());
GraphVisualizer gv = new GraphVisualizer();
System.out.println(gv.generateDotOutput(parser));
@@ -22,42 +22,42 @@ public class Chapter02Test {
@Test
public void testAddPeephole() {
Parser parser = new Parser("return 1+2;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 3;", ret.print());
}
@Test
public void testSubPeephole() {
Parser parser = new Parser("return 1-2;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return -1;", ret.print());
}
@Test
public void testMulPeephole() {
Parser parser = new Parser("return 2*3;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 6;", ret.print());
}
@Test
public void testDivPeephole() {
Parser parser = new Parser("return 6/3;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 2;", ret.print());
}
@Test
public void testMinusPeephole() {
Parser parser = new Parser("return 6/-3;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return -2;", ret.print());
}
@Test
public void testExample() {
Parser parser = new Parser("return 1+2*3+-5;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 2;", ret.print());
GraphVisualizer gv = new GraphVisualizer();
System.out.println(gv.generateDotOutput(parser));
diff --git a/src/test/java/com/seaofnodes/simple/Chapter03Test.java b/src/test/java/com/seaofnodes/simple/Chapter03Test.java
index 950d87fe..407fbe48 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter03Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter03Test.java
@@ -11,21 +11,21 @@ public class Chapter03Test {
@Test
public void testVarDecl() {
Parser parser = new Parser("int a=1; return a;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 1;", ret.print());
}
@Test
public void testVarAdd() {
Parser parser = new Parser("int a=1; int b=2; return a+b;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 3;", ret.print());
}
@Test
public void testVarScope() {
Parser parser = new Parser("int a=1; int b=2; int c=0; { int b=3; c=a+b; } return c;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 4;", ret.print());
}
@@ -33,7 +33,7 @@ public class Chapter03Test {
public void testVarScopeNoPeephole() {
Parser parser = new Parser("int a=1; int b=2; int c=0; { int b=3; c=a+b; #showGraph; } return c; #showGraph;");
Node._disablePeephole = true;
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
Node._disablePeephole = false;
assertEquals("return (1+3);", ret.print());
}
@@ -41,7 +41,7 @@ public class Chapter03Test {
@Test
public void testVarDist() {
Parser parser = new Parser("int x0=1; int y0=2; int x1=3; int y1=4; return (x0-x1)*(x0-x1) + (y0-y1)*(y0-y1); #showGraph;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 8;", ret.print());
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter04Test.java b/src/test/java/com/seaofnodes/simple/Chapter04Test.java
index 9f1535b3..cde23324 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter04Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter04Test.java
@@ -11,49 +11,50 @@ public class Chapter04Test {
@Test
public void testPeephole() {
Parser parser = new Parser("return 1+arg+2; #showGraph;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return (arg+3);", ret.print());
}
@Test
public void testPeephole2() {
Parser parser = new Parser("return (1+arg)+2;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return (arg+3);", ret.print());
}
@Test
public void testAdd0() {
Parser parser = new Parser("return 0+arg;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return arg;", ret.print());
}
@Test
public void testAddAddMul() {
Parser parser = new Parser("return arg+0+arg;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return (arg*2);", ret.print());
}
@Test
public void testPeephole3() {
Parser parser = new Parser("return 1+arg+2+arg+3; #showGraph;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return ((arg*2)+6);", ret.print());
}
@Test
public void testMul1() {
Parser parser = new Parser("return 1*arg;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return arg;", ret.print());
}
@Test
public void testVarArg() {
- Parser parser = new Parser("return arg; #showGraph;", TypeInteger.BOT);
- ReturnNode ret = parser.parse();
+ Parser parser = new Parser("return arg; #showGraph;");
+ StopNode stop = parser.parse();
+ ReturnNode ret = stop.ret();
assertTrue(ret.in(0) instanceof ProjNode);
assertTrue(ret.in(1) instanceof ProjNode);
}
@@ -61,49 +62,49 @@ public class Chapter04Test {
@Test
public void testConstantArg() {
Parser parser = new Parser("return arg; #showGraph;", TypeInteger.constant(2));
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 2;", ret.print());
}
@Test
public void testCompEq() {
Parser parser = new Parser("return 3==3; #showGraph;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 1;", ret.print());
}
@Test
public void testCompEq2() {
Parser parser = new Parser("return 3==4; #showGraph;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 0;", ret.print());
}
@Test
public void testCompNEq() {
Parser parser = new Parser("return 3!=3; #showGraph;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 0;", ret.print());
}
@Test
public void testCompNEq2() {
Parser parser = new Parser("return 3!=4; #showGraph;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return 1;", ret.print());
}
@Test
public void testBug1() {
Parser parser = new Parser("int a=arg+1; int b=a; b=1; return a+2; #showGraph;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return (arg+3);", ret.print());
}
@Test
public void testBug2() {
Parser parser = new Parser("int a=arg+1; a=a; return a; #showGraph;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return (arg+1);", ret.print());
}
@@ -120,7 +121,7 @@ public class Chapter04Test {
@Test
public void testBug4() {
Parser parser = new Parser("return -arg;");
- ReturnNode ret = parser.parse();
+ StopNode ret = parser.parse();
assertEquals("return (-arg);", ret.print());
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter05Test.java b/src/test/java/com/seaofnodes/simple/Chapter05Test.java
new file mode 100644
index 00000000..b5fcbeaf
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/Chapter05Test.java
@@ -0,0 +1,212 @@
+package com.seaofnodes.simple;
+
+import com.seaofnodes.simple.node.*;
+import com.seaofnodes.simple.type.TypeInteger;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class Chapter05Test {
+
+ @Test
+ public void testIfStmt() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+if (arg == 1)
+ a = arg+2;
+else {
+ a = arg-3;
+ #showGraph;
+}
+#showGraph;
+return a;""");
+ StopNode ret = parser.parse(true);
+ assertEquals("return Phi(Region17,(arg+2),(arg-3));", ret.toString());
+ }
+
+ @Test
+ public void testTest() {
+ Parser parser = new Parser(
+"""
+int c = 3;
+int b = 2;
+if (arg == 1) {
+ b = 3;
+ c = 4;
+}
+return c;""", TypeInteger.BOT);
+ StopNode ret = parser.parse(true);
+ assertEquals("return Phi(Region16,4,3);", ret.toString());
+ }
+
+ @Test
+ public void testReturn2() {
+ Parser parser = new Parser(
+"""
+if( arg==1 )
+ return 3;
+else
+ return 4;
+#showGraph;""", TypeInteger.BOT);
+ StopNode stop = parser.parse();
+ assertEquals("Stop[ return 3; return 4; ]", stop.toString());
+ }
+
+ @Test
+ public void testIfMergeB() {
+ Parser parser = new Parser(
+"""
+int a=arg+1;
+int b=0;
+if( arg==1 )
+ b=a;
+else
+ b=a+1;
+return a+b;""");
+ StopNode ret = parser.parse(true);
+ assertEquals("return ((arg*2)+Phi(Region20,2,3));", ret.toString());
+ }
+
+ @Test
+ public void testIfMerge2() {
+ Parser parser = new Parser(
+"""
+int a=arg+1;
+int b=arg+2;
+if( arg==1 )
+ b=b+a;
+else
+ a=b+1;
+return a+b;""");
+ StopNode ret = parser.parse(true);
+ assertEquals("return ((Phi(Region31,(arg*2),arg)+arg)+Phi(Region31,4,5));", ret.toString());
+ }
+
+ @Test
+ public void testMerge3() {
+ Parser parser = new Parser(
+"""
+int a=1;
+if( arg==1 )
+ if( arg==2 )
+ a=2;
+ else
+ a=3;
+else if( arg==3 )
+ a=4;
+else
+ a=5;
+return a;
+#showGraph;""", TypeInteger.BOT);
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Region33,Phi(Region21,2,3),Phi(Region31,4,5));", stop.toString());
+ }
+
+ @Test
+ public void testMerge4() {
+ Parser parser = new Parser(
+"""
+int a=0;
+int b=0;
+if( arg )
+ a=1;
+if( arg==0 )
+ b=2;
+return arg+a+b;
+#showGraph;""", TypeInteger.BOT);
+ StopNode stop = parser.parse();
+ assertEquals("return ((arg+Phi(Region13,1,0))+Phi(Region22,2,0));", stop.toString());
+ }
+
+ @Test
+ public void testMerge5() {
+ Parser parser = new Parser(
+"""
+int a=arg==2;
+if( arg==1 )
+{
+ a=arg==3;
+}
+return a;""");
+ StopNode ret = parser.parse(true);
+ assertEquals("return (arg==Phi(Region16,3,2));", ret.toString());
+ }
+
+ @Test
+ public void testTrue() {
+ StopNode stop = new Parser("return true;").parse();
+ assertEquals("return 1;",stop.toString());
+ }
+
+ @Test
+ public void testHalfDef() {
+ try {
+ new Parser("if( arg==1 ) int b=2; return b;").parse();
+ fail();
+ } catch( RuntimeException e ) {
+ assertEquals("Cannot define a new name on one arm of an if",e.getMessage());
+ }
+ }
+
+ @Test
+ public void testHalfDef2() {
+ try {
+ new Parser("if( arg==1 ) { int b=2; } else { int b=3; } return b;").parse();
+ fail();
+ } catch( RuntimeException e ) {
+ assertEquals("Undefined name 'b'",e.getMessage());
+ }
+ }
+
+ @Test
+ public void testRegress1() {
+ try {
+ new Parser("if(arg==2) int a=1; else int b=2; return a;").parse();
+ fail();
+ } catch( RuntimeException e ) {
+ assertEquals("Cannot define a new name on one arm of an if",e.getMessage());
+ }
+ }
+
+ @Test
+ public void testBadNum() {
+ try {
+ new Parser("return 1-;").parse();
+ fail();
+ } catch( RuntimeException e ) {
+ assertEquals("Syntax error, expected an identifier or expression: ;",e.getMessage());
+ }
+ }
+
+ @Test
+ public void testKeyword1() {
+ try {
+ new Parser("int true=0; return true;").parse();
+ fail();
+ } catch( RuntimeException e ) {
+ assertEquals("Expected an identifier, found 'true'",e.getMessage());
+ }
+ }
+
+ @Test
+ public void testKeyword2() {
+ try {
+ new Parser("int else=arg; if(else) else=2; else else=1; return else;").parse();
+ fail();
+ } catch( RuntimeException e ) {
+ assertEquals("Expected an identifier, found 'else'",e.getMessage());
+ }
+ }
+
+ @Test
+ public void testKeyword3() {
+ try {
+ new Parser("int a=1; ififif(arg)inta=2;return a;").parse();
+ fail();
+ } catch( RuntimeException e ) {
+ assertEquals("Syntax error, expected =: (",e.getMessage());
+ }
+ }
+
+}