== t1 == fun t1(b: Boolean) { var u: String if (b) { u = "s" } doSmth(u) var r: String if (b) { r = "s" } else { r = "t" } doSmth(r) } --------------------- L0: 1 v(b: Boolean) magic[FAKE_INITIALIZER](b: Boolean) -> w(b|) 2 mark({ var u: String if (b) { u = "s" } doSmth(u) var r: String if (b) { r = "s" } else { r = "t" } doSmth(r) }) v(var u: String) mark(if (b) { u = "s" }) r(b) -> jf(L2|) NEXT:[read (Unit), mark({ u = "s" })] 3 mark({ u = "s" }) mark("s") r("s") -> w(u|) 2 jmp(L3) NEXT:[merge(if (b) { u = "s" }|!) -> ] L2 [else branch]: read (Unit) PREV:[jf(L2|)] L3 ['if' expression result]: merge(if (b) { u = "s" }|!) -> PREV:[jmp(L3), read (Unit)] r(u) -> mark(doSmth(u)) call(doSmth(u), doSmth|) -> v(var r: String) mark(if (b) { r = "s" } else { r = "t" }) r(b) -> jf(L4|) NEXT:[mark({ r = "t" }), mark({ r = "s" })] 3 mark({ r = "s" }) mark("s") r("s") -> w(r|) 2 jmp(L5) NEXT:[merge(if (b) { r = "s" } else { r = "t" }|!, !) -> ] L4 [else branch]: 3 mark({ r = "t" }) PREV:[jf(L4|)] mark("t") r("t") -> w(r|) L5 ['if' expression result]: 2 merge(if (b) { r = "s" } else { r = "t" }|!, !) -> PREV:[jmp(L5), w(r|)] r(r) -> mark(doSmth(r)) call(doSmth(r), doSmth|) -> L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] ===================== == t2 == fun t2(b: Boolean) { val i = 3 if (b) { return; } doSmth(i) if (i is Int) { return; } } --------------------- L0: 1 v(b: Boolean) magic[FAKE_INITIALIZER](b: Boolean) -> w(b|) 2 mark({ val i = 3 if (b) { return; } doSmth(i) if (i is Int) { return; } }) v(val i = 3) r(3) -> w(i|) mark(if (b) { return; }) r(b) -> jf(L2|) NEXT:[read (Unit), mark({ return; })] 3 mark({ return; }) ret L1 NEXT:[] - 2 jmp(L3) NEXT:[merge(if (b) { return; }|!) -> ] PREV:[] L2 [else branch]: read (Unit) PREV:[jf(L2|)] L3 ['if' expression result]: merge(if (b) { return; }|!) -> r(i) -> mark(doSmth(i)) call(doSmth(i), doSmth|) -> mark(if (i is Int) { return; }) mark(i is Int) r(i) -> magic[IS](i is Int|) -> jf(L4|) NEXT:[read (Unit), mark({ return; })] 3 mark({ return; }) ret L1 NEXT:[] - 2 jmp(L5) NEXT:[merge(if (i is Int) { return; }|!) -> ] PREV:[] L4 [else branch]: read (Unit) PREV:[jf(L4|)] L5 ['if' expression result]: merge(if (i is Int) { return; }|!) -> L1: 1 NEXT:[] PREV:[ret L1, ret L1, merge(if (i is Int) { return; }|!) -> ] error: PREV:[] sink: PREV:[, ] ===================== == doSmth == fun doSmth(s: String) {} --------------------- L0: 1 v(s: String) magic[FAKE_INITIALIZER](s: String) -> w(s|) 2 mark({}) read (Unit) L1: 1 NEXT:[] error: PREV:[] sink: PREV:[, ] =====================