summaryrefslogtreecommitdiff
path: root/src/test/java
diff options
context:
space:
mode:
authorDibyendu Majumdar <mobile@majumdar.org.uk>2023-12-03 23:23:04 +0000
committerDibyendu Majumdar <mobile@majumdar.org.uk>2025-02-07 09:12:14 -0800
commitaa41ba58615a3cd1a255344bcdb417a8b9f3206a (patch)
tree78198ada36c5aa1b8bddaaf6b18f61432ac2b428 /src/test/java
parent7176713a6841bb5e293c1df0913310e602878ceb (diff)
downloadSimple-aa41ba58615a3cd1a255344bcdb417a8b9f3206a.tar.gz
Simple-aa41ba58615a3cd1a255344bcdb417a8b9f3206a.zip
Chapter 7: While Statement
Co-authored-by: Cliff Click <cliffc@acm.org> Co-authored-by: Thalia Archibald <thalia@archibald.dev> Co-authored-by: XmiliaH <45106915+XmiliaH@users.noreply.github.com> Co-authored-by: tannal <tannal2409@gmail.com> Co-authored-by: hadha <helsgithub15@gmail.com> Co-authored-by: Tamás Hadházy <85063808+Hels15@users.noreply.github.com> Co-authored-by: Robert Obkircher <robert.obkircher@gmail.com>
Diffstat (limited to 'src/test/java')
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter03Test.java2
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter05Test.java12
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter06Test.java32
-rw-r--r--src/test/java/com/seaofnodes/simple/Chapter07Test.java234
4 files changed, 257 insertions, 23 deletions
diff --git a/src/test/java/com/seaofnodes/simple/Chapter03Test.java b/src/test/java/com/seaofnodes/simple/Chapter03Test.java
index 10b67f5f..1e67cef5 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter03Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter03Test.java
@@ -54,7 +54,7 @@ public class Chapter03Test {
assertEquals("Undefined name 'a'",e.getMessage());
}
}
-
+
@Test
public void testRedeclareVar() {
try {
diff --git a/src/test/java/com/seaofnodes/simple/Chapter05Test.java b/src/test/java/com/seaofnodes/simple/Chapter05Test.java
index 134a8be2..5bb67817 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter05Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter05Test.java
@@ -19,7 +19,7 @@ else {
a = arg-3;
}
return a;""");
- StopNode ret = parser.parse(false);
+ StopNode ret = parser.parse();
assertEquals("return Phi(Region17,(arg+2),(arg-3));", ret.toString());
}
@@ -34,7 +34,7 @@ if (arg == 1) {
c = 4;
}
return c;""", TypeInteger.BOT);
- StopNode ret = parser.parse(false);
+ StopNode ret = parser.parse();
assertEquals("return Phi(Region16,4,3);", ret.toString());
}
@@ -62,7 +62,7 @@ if( arg==1 )
else
b=a+1;
return a+b;""");
- StopNode ret = parser.parse(false);
+ StopNode ret = parser.parse();
assertEquals("return ((arg*2)+Phi(Region20,2,3));", ret.toString());
}
@@ -77,8 +77,8 @@ if( arg==1 )
else
a=b+1;
return a+b;""");
- StopNode ret = parser.parse(false);
- assertEquals("return ((Phi(Region31,(arg*2),arg)+arg)+Phi(Region31,4,5));", ret.toString());
+ StopNode ret = parser.parse();
+ assertEquals("return ((Phi(Region31,(arg*2),arg)+arg)+Phi(Region,4,5));", ret.toString());
}
@Test
@@ -127,7 +127,7 @@ if( arg==1 )
a=arg==3;
}
return a;""");
- StopNode ret = parser.parse(false);
+ StopNode ret = parser.parse();
assertEquals("return (arg==Phi(Region16,3,2));", ret.toString());
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter06Test.java b/src/test/java/com/seaofnodes/simple/Chapter06Test.java
index 44b49d73..00d725bc 100644
--- a/src/test/java/com/seaofnodes/simple/Chapter06Test.java
+++ b/src/test/java/com/seaofnodes/simple/Chapter06Test.java
@@ -15,7 +15,7 @@ public class Chapter06Test {
if( true ) return 2;
return 1;
""");
- StopNode stop = parser.parse(false);
+ StopNode stop = parser.parse();
assertEquals("return 2;", stop.toString());
assertTrue(stop.ret().ctrl() instanceof ProjNode);
}
@@ -29,7 +29,7 @@ if (arg)
a = 2;
return (arg < a) < 3;
""");
- StopNode stop = parser.parse(false);
+ StopNode stop = parser.parse();
assertEquals("return ((arg<Phi(Region12,2,1))<3);", stop.toString());
}
@@ -44,7 +44,7 @@ else
a=3;
return a;
""");
- StopNode stop = parser.parse(false);
+ StopNode stop = parser.parse();
assertEquals("return 2;", stop.toString());
assertTrue(stop.ret().ctrl() instanceof ProjNode);
}
@@ -64,7 +64,7 @@ if( a==2 )
else
b=5;
return b;""", TypeInteger.BOT);
- StopNode stop = parser.parse(false);
+ StopNode stop = parser.parse();
assertEquals("return Phi(Region32,42,5);", stop.toString());
}
@@ -83,7 +83,7 @@ if( arg==2 )
else
b=5;
return b;""", TypeInteger.BOT);
- StopNode stop = parser.parse(false);
+ StopNode stop = parser.parse();
assertEquals("return Phi(Region28,2,5);", stop.toString());
}
@@ -123,7 +123,7 @@ else
a=5;
return a;
""", TypeInteger.constant(1));
- StopNode stop = parser.parse(false);
+ StopNode stop = parser.parse();
assertEquals("return 3;", stop.toString());
}
@@ -143,7 +143,7 @@ else
a=5;
return a;
""", TypeInteger.BOT);
- StopNode stop = parser.parse(false);
+ StopNode stop = parser.parse();
assertEquals("return Phi(Region36,3,Phi(Region34,4,5));", stop.toString());
}
@@ -163,7 +163,7 @@ else
a=5;
return a;
""", TypeInteger.constant(1));
- StopNode stop = parser.parse(false);
+ StopNode stop = parser.parse();
assertEquals("return 3;", stop.toString());
}
@@ -183,7 +183,7 @@ else
a=5;
return a;
""", TypeInteger.constant(3));
- StopNode stop = parser.parse(false);
+ StopNode stop = parser.parse();
assertEquals("return 4;", stop.toString());
}
@@ -199,7 +199,7 @@ if( arg ) {
}
return a+b;
""");
- StopNode ret = parser.parse(false);
+ StopNode ret = parser.parse();
assertEquals("return Phi(Region22,4,1);", ret.toString());
}
@@ -216,7 +216,7 @@ if( arg ) {
}
return a+b;
""", TypeInteger.constant(1));
- StopNode ret = parser.parse(false);
+ StopNode ret = parser.parse();
assertEquals("return 4;", ret.toString());
}
@@ -232,7 +232,7 @@ if( arg ) {
}
return a+b;
""", TypeInteger.constant(0));
- StopNode ret = parser.parse(false);
+ StopNode ret = parser.parse();
assertEquals("return 1;", ret.toString());
}
@@ -250,8 +250,8 @@ if( arg ) {
}
return a+b+c;
""");
- StopNode ret = parser.parse(false);
- assertEquals("return (Phi(Region33,Phi(Region22,2,3),0)+Phi(Region33,3,1));", ret.toString());
+ StopNode ret = parser.parse();
+ assertEquals("return (Phi(Region33,Phi(Region22,2,3),0)+Phi(Region,3,1));", ret.toString());
}
@@ -269,7 +269,7 @@ if( arg ) {
}
return a+b+c;
""", TypeInteger.constant(1));
- StopNode ret = parser.parse(false);
+ StopNode ret = parser.parse();
assertEquals("return 6;", ret.toString());
}
@@ -287,7 +287,7 @@ if( arg ) {
}
return a+b+c;
""", TypeInteger.constant(2));
- StopNode ret = parser.parse(false);
+ StopNode ret = parser.parse();
assertEquals("return 5;", ret.toString());
}
diff --git a/src/test/java/com/seaofnodes/simple/Chapter07Test.java b/src/test/java/com/seaofnodes/simple/Chapter07Test.java
new file mode 100644
index 00000000..189fcf66
--- /dev/null
+++ b/src/test/java/com/seaofnodes/simple/Chapter07Test.java
@@ -0,0 +1,234 @@
+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 Chapter07Test {
+
+ @Test
+ public void testExample() {
+ Parser parser = new Parser(
+ """
+ while(arg < 10) {
+ arg = arg + 1;
+ }
+ return arg;
+ """);
+ Node._disablePeephole = true;
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop6,arg,(Phi_arg+1));", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ Node._disablePeephole = false;
+ }
+
+ @Test
+ public void testRegression() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+if(arg){}else{
+ while(a < 10) {
+ a = a + 1;
+ }
+}
+return a;
+""");
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Region23,1,Phi(Loop11,1,(Phi_a+1)));", stop.toString());
+ }
+
+ @Test
+ public void testWhileNested() {
+ Parser parser = new Parser(
+"""
+int sum = 0;
+int i = 0;
+while(i < arg) {
+ i = i + 1;
+ int j = 0;
+ while( j < arg ) {
+ sum = sum + j;
+ j = j + 1;
+ }
+}
+return sum;
+""");
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop8,0,Phi(Loop21,Phi_sum,(Phi(Loop,0,(Phi_j+1))+Phi_sum)));", stop.toString());
+ }
+
+ @Test
+ public void testWhileScope() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+int b = 2;
+while(a < 10) {
+ if (a == 2) a = 3;
+ else b = 4;
+}
+return b;
+""");
+ Node._disablePeephole = true;
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop8,2,Phi(Region27,Phi_b,4));", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ Node._disablePeephole = false;
+ }
+
+ @Test
+ public void testWhileNestedIfAndInc() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+int b = 2;
+while(a < 10) {
+ if (a == 2) a = 3;
+ else b = 4;
+ b = b + 1;
+ a = a + 1;
+}
+return b;
+""");
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop8,2,(Phi(Region27,Phi_b,4)+1));", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ }
+
+
+ @Test
+ public void testWhile() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+while(a < 10) {
+ a = a + 1;
+ a = a + 2;
+}
+return a;
+""");
+ Node._disablePeephole = true;
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop7,1,((Phi_a+1)+2));", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ Node._disablePeephole = false;
+ }
+
+ @Test
+ public void testWhilePeep() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+while(a < 10) {
+ a = a + 1;
+ a = a + 2;
+}
+return a;
+""");
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop7,1,(Phi_a+3));", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ }
+
+ @Test
+ public void testWhile2() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+while(arg) a = 2;
+return a;
+""");
+ Node._disablePeephole = true;
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop7,1,2);", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ Node._disablePeephole = false;
+ }
+
+ @Test
+ public void testWhile2Peep() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+while(arg) a = 2;
+return a;
+""");
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop7,1,2);", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ }
+
+ @Test
+ public void testWhile3() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+while(a < 10) {
+ int b = a + 1;
+ a = b + 2;
+}
+return a;
+""");
+ Node._disablePeephole = true;
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop7,1,((Phi_a+1)+2));", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ Node._disablePeephole = false;
+ }
+
+ @Test
+ public void testWhile3Peep() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+while(a < 10) {
+ int b = a + 1;
+ a = b + 2;
+}
+return a;
+""");
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop7,1,(Phi_a+3));", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ }
+
+ @Test
+ public void testWhile4() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+int b = 2;
+while(a < 10) {
+ int b = a + 1;
+ a = b + 2;
+}
+return a;
+""");
+ Node._disablePeephole = true;
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop8,1,((Phi_a+1)+2));", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ Node._disablePeephole = false;
+ }
+
+ @Test
+ public void testWhile4Peep() {
+ Parser parser = new Parser(
+"""
+int a = 1;
+int b = 2;
+while(a < 10) {
+ int b = a + 1;
+ a = b + 2;
+}
+return a;
+""");
+ StopNode stop = parser.parse();
+ assertEquals("return Phi(Loop8,1,(Phi_a+3));", stop.toString());
+ assertTrue(stop.ret().ctrl() instanceof ProjNode);
+ }
+
+}