summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCliff Click <cliffc@acm.org>2024-07-26 14:56:40 +0300
committerDibyendu Majumdar <dibyendumajumdar@users.noreply.github.com>2024-08-05 23:28:33 +0100
commit5c48e9fde3185710892815af3adc992585486a24 (patch)
treed69f4b33f96cdab0314ad98ef4e9fba9638aa701
parentaced58bb64ae52f82276ac48ff28737d54130223 (diff)
downloadSimple-5c48e9fde3185710892815af3adc992585486a24.tar.gz
Simple-5c48e9fde3185710892815af3adc992585486a24.zip
missing null check
-rw-r--r--chapter12/src/main/java/com/seaofnodes/simple/node/PhiNode.java2
-rw-r--r--chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java121
2 files changed, 121 insertions, 2 deletions
diff --git a/chapter12/src/main/java/com/seaofnodes/simple/node/PhiNode.java b/chapter12/src/main/java/com/seaofnodes/simple/node/PhiNode.java
index 535db980..ebed8dd1 100644
--- a/chapter12/src/main/java/com/seaofnodes/simple/node/PhiNode.java
+++ b/chapter12/src/main/java/com/seaofnodes/simple/node/PhiNode.java
@@ -103,7 +103,7 @@ public class PhiNode extends Node {
if( region().idom(this) instanceof IfNode iff && iff.pred().addDep(this)==val ) {
// Must walk the idom on the null side to make sure we hit False.
CFGNode idom = (CFGNode)region().in(nullx);
- while( idom.in(0) != iff ) idom = idom.idom();
+ while( idom.nIns() > 0 && idom.in(0) != iff ) idom = idom.idom();
if( idom instanceof CProjNode proj && proj._idx==1 )
return val;
}
diff --git a/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java b/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java
index 92ed9031..a41fae91 100644
--- a/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java
+++ b/chapter12/src/test/java/com/seaofnodes/simple/Chapter12Test.java
@@ -13,7 +13,126 @@ public class Chapter12Test {
public void testJig() {
Parser parser = new Parser(
"""
-return 3.14
+arg=0;
+struct fxaV1Ic3 {
+}
+fxaV1Ic3 tKRUMAeM=new fxaV1Ic3;
+tKRUMAeM=tKRUMAeM;
+while(2>0*-0<-arg<=false) if(-arg) if(-arg<=(-arg)) {
+ arg=(-arg);
+ while(false) {
+ }
+ {
+ {}
+ while(arg<arg>=(false/97)) break;
+ break;
+ }
+ }
+int eKG4lqt=-arg<--1<=----2;
+eKG4lqt=-6;
+int arg=--(--false<--0)<eKG4lqt>5;
+eKG4lqt=-0;
+{
+ tKRUMAeM=new fxaV1Ic3;
+ arg=-(-arg);
+ flt erpUhf=0.9873326;
+ {
+ while(-false*arg-eKG4lqt!=58) if(----eKG4lqt) erpUhf=-0.84418744/erpUhf;
+ else if(48>=eKG4lqt<=1/14----eKG4lqt) break;
+ else break;
+ erpUhf=(erpUhf)--0.35600418*--(erpUhf);
+ if(-0/-eKG4lqt>=eKG4lqt---arg-arg) {
+ if(--arg+7+--arg) {
+ }
+ else while(-1) erpUhf=erpUhf;
+ tKRUMAeM=(tKRUMAeM);
+ int rwPI=-eKG4lqt<=-(eKG4lqt+true);
+ }
+ if(false<=---8==--(false!=--arg)>=2) {
+ return ---erpUhf==erpUhf;
+ }
+ erpUhf=-erpUhf;
+ }
+ {
+ int U=-10+-----0!=eKG4lqt+25-13<-arg--eKG4lqt>=--arg;
+ while(U<-0+(---true<=eKG4lqt<=-50>=false)) {
+ U=U+-U!=-12<--(--43>=(false));
+ if((eKG4lqt)>(---U*eKG4lqt<=0!=--arg)/-U) {
+ erpUhf=-erpUhf+-erpUhf;
+ if(-(--U)!=--arg+U>---arg>=true*-(--40!=-eKG4lqt<U+--6)) while(6/---U>=--1-62) erpUhf=-----(--0.87431<erpUhf>=-0.04622048<-0.7782522)-erpUhf*0.8976203+-0.26186156>erpUhf<0.23554772!=-0.37699592;
+ }
+ {
+ int Su5Ap9KHJ=-U;
+ while(Su5Ap9KHJ<---U) {
+ Su5Ap9KHJ=Su5Ap9KHJ+32+---eKG4lqt;
+ }
+ }
+ if(-true--2) {
+ tKRUMAeM=new fxaV1Ic3;
+ while(true>U) continue;
+ }
+ else {
+ fxaV1Ic3? DN8J9B=tKRUMAeM;
+ flt eKG4lqt=0.17164475<erpUhf;
+ {
+ if(!DN8J9B)DN8J9B=null;
+ else arg=U;
+ }
+ {
+ int CEdri=-U>12!=-arg;
+ while(CEdri<CEdri) {
+ CEdri=CEdri+--51;
+ if(!DN8J9B)erpUhf=--eKG4lqt;
+ }
+ }
+ U=-0;
+ }
+ fxaV1Ic3 RDAPoRG=tKRUMAeM;
+ {
+ int eKG4lqt=arg!=---U;
+ while(eKG4lqt<arg*----(-eKG4lqt==--U*-U)>=false-5==-arg) {
+ eKG4lqt=eKG4lqt+-----arg;
+ while(U) {
+ while(15*-----4) U=--arg;
+ int gQqFyu1=--eKG4lqt;
+ }
+ {
+ int RDAPoRG=arg*0<--false;
+ while(RDAPoRG<--arg) {
+ RDAPoRG=RDAPoRG+--eKG4lqt;
+ eKG4lqt=--U;
+ }
+ }
+ if(14==arg<-3-true) while(2<=----false<=arg) return -erpUhf;
+ else arg=U;
+ if(-U) {
+ break;
+ }
+ {
+ if(2>eKG4lqt/arg!=--false<=--eKG4lqt) continue;
+ else erpUhf=-0.6544298;
+ eKG4lqt=--0==---U>=U*eKG4lqt==arg-arg;
+ if(-eKG4lqt) break;
+ else break;
+ }
+ }
+ }
+ fxaV1Ic3? o0a0L;
+ arg=--eKG4lqt;
+ break;
+ }
+ }
+ if(-((-arg)<=eKG4lqt)) while(--eKG4lqt) arg=---eKG4lqt!=5<-eKG4lqt;
+ else return -arg;
+ if(30) eKG4lqt=16>=-----arg!=-true<(eKG4lqt);
+ flt l=0.17984325*-0.88223094;
+ flt lg97e=l>-(--0.017727911==0.9812363)-(erpUhf!=-----0.19494736);
+ erpUhf=--erpUhf!=---0.3488902;
+ int DW=eKG4lqt==---eKG4lqt;
+ if(DW*7<25*-22!=----96!=-2) return ---erpUhf;
+ else return -DW/-arg;
+}
+//return 3.14;
""");
StopNode stop = parser.parse(false).iterate(false);
assertEquals("return 3.14;", stop.toString());