== lazyBooleans == fun lazyBooleans(a : Boolean, b : Boolean) : Unit { if (a) { 1 } else { 2 } 3 if (a && b) 5 else 6 7 if (a || b) 8 else 9 10 if (a) 11 12 if (a) else 13 14 } --------------------- L0: 1 v(a : Boolean) magic[FAKE_INITIALIZER](a : Boolean) -> w(a|) v(b : Boolean) magic[FAKE_INITIALIZER](b : Boolean) -> w(b|) 2 mark({ if (a) { 1 } else { 2 } 3 if (a && b) 5 else 6 7 if (a || b) 8 else 9 10 if (a) 11 12 if (a) else 13 14 }) mark(if (a) { 1 } else { 2 }) r(a) -> jf(L2|) NEXT:[mark({ 2 }), mark({ 1 })] 3 mark({ 1 }) r(1) -> 2 jmp(L3) NEXT:[merge(if (a) { 1 } else { 2 }|, ) -> ] L2 [else branch]: 3 mark({ 2 }) PREV:[jf(L2|)] r(2) -> L3 ['if' expression result]: 2 merge(if (a) { 1 } else { 2 }|, ) -> PREV:[jmp(L3), r(2) -> ] r(3) -> mark(if (a && b) 5 else 6) r(a) -> jf(L4|) NEXT:[magic[AND](a && b|, ) -> , r(b) -> ] r(b) -> L4 [result of boolean operation]: magic[AND](a && b|, ) -> PREV:[jf(L4|), r(b) -> ] jf(L5|) NEXT:[r(6) -> , r(5) -> ] r(5) -> jmp(L6) NEXT:[merge(if (a && b) 5 else 6|, ) -> ] L5 [else branch]: r(6) -> PREV:[jf(L5|)] L6 ['if' expression result]: merge(if (a && b) 5 else 6|, ) -> PREV:[jmp(L6), r(6) -> ] r(7) -> mark(if (a || b) 8 else 9) r(a) -> jt(L7|) NEXT:[r(b) -> , magic[OR](a || b|, ) -> ] r(b) -> L7 [result of boolean operation]: magic[OR](a || b|, ) -> PREV:[jt(L7|), r(b) -> ] jf(L8|) NEXT:[r(9) -> , r(8) -> ] r(8) -> jmp(L9) NEXT:[merge(if (a || b) 8 else 9|, ) -> ] L8 [else branch]: r(9) -> PREV:[jf(L8|)] L9 ['if' expression result]: merge(if (a || b) 8 else 9|, ) -> PREV:[jmp(L9), r(9) -> ] r(10) -> mark(if (a) 11) r(a) -> jf(L10|) NEXT:[read (Unit), r(11) -> ] r(11) -> jmp(L11) NEXT:[merge(if (a) 11|) -> ] L10 [else branch]: read (Unit) PREV:[jf(L10|)] L11 ['if' expression result]: merge(if (a) 11|) -> PREV:[jmp(L11), read (Unit)] r(12) -> mark(if (a) else 13) r(a) -> jf(L12|) NEXT:[r(13) -> , read (Unit)] read (Unit) jmp(L13) NEXT:[merge(if (a) else 13|) -> ] L12 [else branch]: r(13) -> PREV:[jf(L12|)] L13 ['if' expression result]: merge(if (a) else 13|) -> PREV:[jmp(L13), r(13) -> ] r(14) -> L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] =====================