Pseudocode: Generate fake values for Unit/Nothing-typed expressions

This commit is contained in:
Alexey Sedunov
2014-07-23 12:56:21 +04:00
parent 2d3ac9109b
commit 77bbf8f73b
72 changed files with 851 additions and 592 deletions
@@ -143,12 +143,13 @@ L4:
jf(L6|<v2>) NEXT:[read (Unit), mark({ return@l })]
6 mark({ return@l })
ret L5 NEXT:[<END>]
- 5 jmp(L7) NEXT:[<END>] PREV:[]
- 5 jmp(L7) NEXT:[ret(*|!<v3>) L5] PREV:[]
L6:
read (Unit) PREV:[jf(L6|<v2>)]
L5:
L7:
4 <END> NEXT:[<SINK>] PREV:[ret L5, read (Unit)]
4 ret(*|!<v3>) L5
L5:
<END> NEXT:[<SINK>] PREV:[ret L5, ret(*|!<v3>) L5]
error:
<ERROR> PREV:[]
sink:
@@ -227,8 +228,9 @@ L5 [onExceptionToFinallyBlock]:
L10 [skipFinallyToErrorBlock]:
7 mark({ 2 }) PREV:[jmp(L10 [skipFinallyToErrorBlock])]
r(2) -> <v4>
3 ret(*|!<v5>) L4
L4:
3 <END> NEXT:[<SINK>] PREV:[ret L4, r(2) -> <v4>]
<END> NEXT:[<SINK>] PREV:[ret L4, ret(*|!<v5>) L4]
error:
<ERROR> PREV:[jmp(error)]
sink:
@@ -342,17 +344,17 @@ L8:
3 jmp(L3 [loop entry point]) NEXT:[r(true) -> <v0>]
L4 [loop exit point]:
read (Unit) PREV:[jmp(L4 [loop exit point])]
r(5) -> <v6>
r(5) -> <v8>
2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })]
L2 [onExceptionToFinallyBlock]:
L10 [start finally]:
3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])]
r(2) -> <v7>
r(2) -> <v9>
L11 [finish finally]:
2 jmp(error) NEXT:[<ERROR>]
L9 [skipFinallyToErrorBlock]:
3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])]
r(2) -> <v7>
r(2) -> <v9>
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -408,12 +410,12 @@ L4 [loop exit point]:
L2 [onExceptionToFinallyBlock]:
L10 [start finally]:
3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])]
r(2) -> <v6>
r(2) -> <v8>
L11 [finish finally]:
2 jmp(error) NEXT:[<ERROR>]
L9 [skipFinallyToErrorBlock]:
3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])]
r(2) -> <v6>
r(2) -> <v8>
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -547,17 +549,17 @@ L8:
4 jmp?(L5 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|<v3>) -> <v4>, read (Unit)]
L3:
read (Unit) PREV:[jmp?(L3), jmp?(L5 [loop entry point])]
3 r(5) -> <v9>
3 r(5) -> <v11>
2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })]
L2 [onExceptionToFinallyBlock]:
L10 [start finally]:
3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])]
r(2) -> <v10>
r(2) -> <v12>
L11 [finish finally]:
2 jmp(error) NEXT:[<ERROR>]
L9 [skipFinallyToErrorBlock]:
3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])]
r(2) -> <v10>
r(2) -> <v12>
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -622,12 +624,12 @@ L3:
L2 [onExceptionToFinallyBlock]:
L10 [start finally]:
3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])]
r(2) -> <v9>
r(2) -> <v11>
L11 [finish finally]:
2 jmp(error) NEXT:[<ERROR>]
L9 [skipFinallyToErrorBlock]:
3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])]
r(2) -> <v9>
r(2) -> <v11>
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -735,8 +737,8 @@ L0:
1 <START>
2 mark({ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } })
mark(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) })
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ return 1 })]
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ return 1 })]
3 mark({ return 1 })
r(1) -> <v0>
L4 [start finally]:
@@ -745,36 +747,37 @@ L4 [start finally]:
mark(doSmth(3))
call(doSmth(3), doSmth|<v1>) -> <v2>
L5 [finish finally]:
3 ret(*|<v0>) L1 NEXT:[<END>]
- 2 jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[]
3 ret(*|<v0>) L1 NEXT:[<END>]
- 2 jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[]
L2 [onException]:
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v3>
w(e|<v3>)
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v4>
w(e|<v4>)
4 mark({ doSmth(2) })
r(2) -> <v4>
r(2) -> <v5>
mark(doSmth(2))
call(doSmth(2), doSmth|<v4>) -> <v5>
call(doSmth(2), doSmth|<v5>) -> <v6>
3 jmp(L6 [afterCatches])
L6 [afterCatches]:
2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })]
2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })]
L3 [onExceptionToFinallyBlock]:
4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
r(3) -> <v1>
mark(doSmth(3))
call(doSmth(3), doSmth|<v1>) -> <v2>
2 jmp(error) NEXT:[<ERROR>]
2 jmp(error) NEXT:[<ERROR>]
L7 [skipFinallyToErrorBlock]:
4 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])]
4 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])]
r(3) -> <v1>
mark(doSmth(3))
call(doSmth(3), doSmth|<v1>) -> <v2>
2 merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) }|!<v3>, <v6>) -> <v7>
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, call(doSmth(3), doSmth|<v1>) -> <v2>]
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) }|!<v3>, <v6>) -> <v7>]
error:
<ERROR> PREV:[jmp(error)]
<ERROR> PREV:[jmp(error)]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== t14 ==
fun t14() : Int {
@@ -790,27 +793,28 @@ L0:
1 <START>
2 mark({ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } })
mark(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) })
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), mark({ return 1 })]
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), mark({ return 1 })]
3 mark({ return 1 })
r(1) -> <v0>
ret(*|<v0>) L1 NEXT:[<END>]
- 2 jmp(L3 [afterCatches]) NEXT:[<END>] PREV:[]
ret(*|<v0>) L1 NEXT:[<END>]
- 2 jmp(L3 [afterCatches]) NEXT:[merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) }|!<v1>, <v4>) -> <v5>] PREV:[]
L2 [onException]:
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v1>
w(e|<v1>)
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v2>
w(e|<v2>)
4 mark({ doSmth(2) })
r(2) -> <v2>
r(2) -> <v3>
mark(doSmth(2))
call(doSmth(2), doSmth|<v2>) -> <v3>
call(doSmth(2), doSmth|<v3>) -> <v4>
3 jmp(L3 [afterCatches])
L1:
L3 [afterCatches]:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, jmp(L3 [afterCatches])]
2 merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) }|!<v1>, <v4>) -> <v5>
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) }|!<v1>, <v4>) -> <v5>]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== t15 ==
fun t15() : Int {
@@ -829,8 +833,8 @@ L0:
1 <START>
2 mark({ try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } })
mark(try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) })
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ return 1 })]
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ return 1 })]
3 mark({ return 1 })
r(1) -> <v0>
L4 [start finally]:
@@ -839,39 +843,40 @@ L4 [start finally]:
mark(doSmth(3))
call(doSmth(3), doSmth|<v1>) -> <v2>
L5 [finish finally]:
3 ret(*|<v0>) L1 NEXT:[<END>]
- 2 jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[]
3 ret(*|<v0>) L1 NEXT:[<END>]
- 2 jmp(L6 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[]
L2 [onException]:
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v3>
w(e|<v3>)
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v4>
w(e|<v4>)
4 mark({ return 2 })
r(2) -> <v4>
r(2) -> <v5>
mark({ doSmth(3) })
r(3) -> <v1>
mark(doSmth(3))
call(doSmth(3), doSmth|<v1>) -> <v2>
ret(*|<v4>) L1 NEXT:[<END>]
- 3 jmp(L6 [afterCatches]) PREV:[]
ret(*|<v5>) L1 NEXT:[<END>]
- 3 jmp(L6 [afterCatches]) PREV:[]
L6 [afterCatches]:
- 2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[]
- 2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[]
L3 [onExceptionToFinallyBlock]:
4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
4 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
r(3) -> <v1>
mark(doSmth(3))
call(doSmth(3), doSmth|<v1>) -> <v2>
2 jmp(error) NEXT:[<ERROR>]
2 jmp(error) NEXT:[<ERROR>]
L7 [skipFinallyToErrorBlock]:
- 4 mark({ doSmth(3) }) PREV:[]
- r(3) -> <v1> PREV:[]
- mark(doSmth(3)) PREV:[]
- call(doSmth(3), doSmth|<v1>) -> <v2> PREV:[]
- 4 mark({ doSmth(3) }) PREV:[]
- r(3) -> <v1> PREV:[]
- mark(doSmth(3)) PREV:[]
- call(doSmth(3), doSmth|<v1>) -> <v2> PREV:[]
- 2 merge(try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }|!<v3>, !<v6>) -> <v7> PREV:[]
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, ret(*|<v4>) L1]
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v0>) L1, ret(*|<v5>) L1]
error:
<ERROR> PREV:[jmp(error)]
<ERROR> PREV:[jmp(error)]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== t16 ==
fun t16() : Int {
@@ -890,15 +895,15 @@ L0:
1 <START>
2 mark({ try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } })
mark(try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) })
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ doSmth(1) })]
jmp?(L2 [onException]) NEXT:[v(e: UnsupportedOperationException), jmp?(L3 [onExceptionToFinallyBlock])]
jmp?(L3 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ doSmth(1) })]
3 mark({ doSmth(1) })
r(1) -> <v0>
mark(doSmth(1))
call(doSmth(1), doSmth|<v0>) -> <v1>
2 jmp(L4 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])]
2 jmp(L4 [afterCatches]) NEXT:[jmp(L7 [skipFinallyToErrorBlock])]
L2 [onException]:
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
3 v(e: UnsupportedOperationException) PREV:[jmp?(L2 [onException])]
magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v2>
w(e|<v2>)
4 mark({ return 2 })
@@ -909,27 +914,28 @@ L5 [start finally]:
mark(doSmth(3))
call(doSmth(3), doSmth|<v4>) -> <v5>
L6 [finish finally]:
4 ret(*|<v3>) L1 NEXT:[<END>]
- 3 jmp(L4 [afterCatches]) PREV:[]
4 ret(*|<v3>) L1 NEXT:[<END>]
- 3 jmp(L4 [afterCatches]) PREV:[]
L4 [afterCatches]:
2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[jmp(L4 [afterCatches])]
2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[jmp(L4 [afterCatches])]
L3 [onExceptionToFinallyBlock]:
5 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
5 mark({ doSmth(3) }) PREV:[jmp?(L3 [onExceptionToFinallyBlock])]
r(3) -> <v4>
mark(doSmth(3))
call(doSmth(3), doSmth|<v4>) -> <v5>
2 jmp(error) NEXT:[<ERROR>]
2 jmp(error) NEXT:[<ERROR>]
L7 [skipFinallyToErrorBlock]:
5 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])]
5 mark({ doSmth(3) }) PREV:[jmp(L7 [skipFinallyToErrorBlock])]
r(3) -> <v4>
mark(doSmth(3))
call(doSmth(3), doSmth|<v4>) -> <v5>
2 merge(try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }|<v1>, !<v6>) -> <v7>
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v3>) L1, call(doSmth(3), doSmth|<v4>) -> <v5>]
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v3>) L1, merge(try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }|<v1>, !<v6>) -> <v7>]
error:
<ERROR> PREV:[jmp(error)]
<ERROR> PREV:[jmp(error)]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== doSmth ==
fun doSmth(i: Int) {
@@ -26,12 +26,18 @@ fun t2() {
}
}
---------------------
1 <v0>: * NEW: r(1) -> <v0>
2 <v1>: {<: Comparable<Int>} NEW: r(2) -> <v1>
3 <v2>: Int NEW: r(3) -> <v2>
2 > 3 <v3>: Boolean NEW: call(2 > 3, compareTo|<v1>, <v2>) -> <v3>
2 <v4>: * NEW: r(2) -> <v4>
{ 2 } <v4>: * COPY
1 <v0>: * NEW: r(1) -> <v0>
2 <v1>: {<: Comparable<Int>} NEW: r(2) -> <v1>
3 <v2>: Int NEW: r(3) -> <v2>
2 > 3 <v3>: Boolean NEW: call(2 > 3, compareTo|<v1>, <v2>) -> <v3>
return !<v5>: *
{ return } !<v5>: * COPY
if (2 > 3) { return } !<v5>: * COPY
{ 1 if (2 > 3) { return } } !<v5>: * COPY
2 <v4>: * NEW: r(2) -> <v4>
{ 2 } <v4>: * COPY
try { 1 if (2 > 3) { return } } finally { 2 } !<v5>: * COPY
{ try { 1 if (2 > 3) { return } } finally { 2 } } !<v5>: * COPY
=====================
== t3 ==
fun t3() {
@@ -63,9 +69,13 @@ try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 } <v1>: * COPY
}
}
---------------------
2 <v0>: {<: Comparable<Int>} NEW: r(2) -> <v0>
3 <v1>: Int NEW: r(3) -> <v1>
2 > 3 <v2>: Boolean NEW: call(2 > 3, compareTo|<v0>, <v1>) -> <v2>
2 <v0>: {<: Comparable<Int>} NEW: r(2) -> <v0>
3 <v1>: Int NEW: r(3) -> <v1>
2 > 3 <v2>: Boolean NEW: call(2 > 3, compareTo|<v0>, <v1>) -> <v2>
return@l !<v3>: *
{ return@l } !<v3>: * COPY
if (2 > 3) { return@l } !<v3>: * COPY
if (2 > 3) { return@l } !<v3>: * COPY
=====================
== t4 ==
fun t4() {
@@ -97,12 +107,18 @@ fun t4() {
}
}
---------------------
1 <v0>: * NEW: r(1) -> <v0>
2 <v1>: {<: Comparable<Int>} NEW: r(2) -> <v1>
3 <v2>: Int NEW: r(3) -> <v2>
2 > 3 <v3>: Boolean NEW: call(2 > 3, compareTo|<v1>, <v2>) -> <v3>
2 <v4>: * NEW: r(2) -> <v4>
{ 2 } <v4>: * COPY
1 <v0>: * NEW: r(1) -> <v0>
2 <v1>: {<: Comparable<Int>} NEW: r(2) -> <v1>
3 <v2>: Int NEW: r(3) -> <v2>
2 > 3 <v3>: Boolean NEW: call(2 > 3, compareTo|<v1>, <v2>) -> <v3>
return@l !<v5>: *
{ return@l } !<v5>: * COPY
if (2 > 3) { return@l } !<v5>: * COPY
{ 1 if (2 > 3) { return@l } } !<v5>: * COPY
2 <v4>: * NEW: r(2) -> <v4>
{ 2 } <v4>: * COPY
try { 1 if (2 > 3) { return@l } } finally { 2 } !<v5>: * COPY
try { 1 if (2 > 3) { return@l } } finally { 2 } !<v5>: * COPY
=====================
== t5 ==
fun t5() {
@@ -118,14 +134,23 @@ fun t5() {
}
}
---------------------
<v1>: * NEW: magic[VALUE_CONSUMER](true|<v0>) -> <v1>
true <v0>: Boolean NEW: r(true) -> <v0>
1 <v2>: * NEW: r(1) -> <v2>
2 <v3>: {<: Comparable<Int>} NEW: r(2) -> <v3>
3 <v4>: Int NEW: r(3) -> <v4>
2 > 3 <v5>: Boolean NEW: call(2 > 3, compareTo|<v3>, <v4>) -> <v5>
2 <v6>: * NEW: r(2) -> <v6>
{ 2 } <v6>: * COPY
<v1>: * NEW: magic[VALUE_CONSUMER](true|<v0>) -> <v1>
true <v0>: Boolean NEW: r(true) -> <v0>
1 <v2>: * NEW: r(1) -> <v2>
2 <v3>: {<: Comparable<Int>} NEW: r(2) -> <v3>
3 <v4>: Int NEW: r(3) -> <v4>
2 > 3 <v5>: Boolean NEW: call(2 > 3, compareTo|<v3>, <v4>) -> <v5>
break @l !<v7>: *
{ break @l } !<v7>: * COPY
if (2 > 3) { break @l } !<v7>: * COPY
{ 1 if (2 > 3) { break @l } } !<v7>: * COPY
2 <v6>: * NEW: r(2) -> <v6>
{ 2 } <v6>: * COPY
try { 1 if (2 > 3) { break @l } } finally { 2 } !<v7>: * COPY
{ try { 1 if (2 > 3) { break @l } } finally { 2 } } !<v7>: * COPY
while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } !<v8>: *
@l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } !<v8>: * COPY
{ @l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } } !<v8>: * COPY
=====================
== t6 ==
fun t6() {
@@ -148,12 +173,18 @@ true <v0>:
2 <v3>: {<: Comparable<Int>} NEW: r(2) -> <v3>
3 <v4>: Int NEW: r(3) -> <v4>
2 > 3 <v5>: Boolean NEW: call(2 > 3, compareTo|<v3>, <v4>) -> <v5>
5 <v6>: * NEW: r(5) -> <v6>
{ @l while(true) { 1 if (2 > 3) { break @l } } 5 } <v6>: * COPY
2 <v7>: * NEW: r(2) -> <v7>
{ 2 } <v7>: * COPY
try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } <v6>: * COPY
{ try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } } <v6>: * COPY
break @l !<v6>: *
{ break @l } !<v6>: * COPY
if (2 > 3) { break @l } !<v6>: * COPY
{ 1 if (2 > 3) { break @l } } !<v6>: * COPY
while(true) { 1 if (2 > 3) { break @l } } !<v7>: *
@l while(true) { 1 if (2 > 3) { break @l } } !<v7>: * COPY
5 <v8>: * NEW: r(5) -> <v8>
{ @l while(true) { 1 if (2 > 3) { break @l } } 5 } <v8>: * COPY
2 <v9>: * NEW: r(2) -> <v9>
{ 2 } <v9>: * COPY
try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } <v8>: * COPY
{ try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } } <v8>: * COPY
=====================
== t7 ==
fun t7() {
@@ -169,14 +200,23 @@ fun t7() {
}
}
---------------------
<v1>: * NEW: magic[VALUE_CONSUMER](true|<v0>) -> <v1>
true <v0>: Boolean NEW: r(true) -> <v0>
1 <v2>: * NEW: r(1) -> <v2>
2 <v3>: {<: Comparable<Int>} NEW: r(2) -> <v3>
3 <v4>: Int NEW: r(3) -> <v4>
2 > 3 <v5>: Boolean NEW: call(2 > 3, compareTo|<v3>, <v4>) -> <v5>
2 <v6>: * NEW: r(2) -> <v6>
{ 2 } <v6>: * COPY
<v1>: * NEW: magic[VALUE_CONSUMER](true|<v0>) -> <v1>
true <v0>: Boolean NEW: r(true) -> <v0>
1 <v2>: * NEW: r(1) -> <v2>
2 <v3>: {<: Comparable<Int>} NEW: r(2) -> <v3>
3 <v4>: Int NEW: r(3) -> <v4>
2 > 3 <v5>: Boolean NEW: call(2 > 3, compareTo|<v3>, <v4>) -> <v5>
break @l !<v6>: *
{ break @l } !<v6>: * COPY
if (2 > 3) { break @l } !<v6>: * COPY
{ 1 if (2 > 3) { break @l } } !<v6>: * COPY
while(true) { 1 if (2 > 3) { break @l } } !<v7>: *
@l while(true) { 1 if (2 > 3) { break @l } } !<v7>: * COPY
{ @l while(true) { 1 if (2 > 3) { break @l } } } !<v7>: * COPY
2 <v8>: * NEW: r(2) -> <v8>
{ 2 } <v8>: * COPY
try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 } !<v7>: * COPY
{ try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 } } !<v7>: * COPY
=====================
== t8 ==
fun t8(a : Int) {
@@ -192,17 +232,26 @@ fun t8(a : Int) {
}
}
---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](a : Int) -> <v0>
<v4>: Int NEW: magic[LOOP_RANGE_ITERATION](1..a|<v3>) -> <v4>
1 <v1>: Int NEW: r(1) -> <v1>
a <v2>: Int NEW: r(a) -> <v2>
1..a <v3>: {<: Iterable<Int>} NEW: call(1..a, rangeTo|<v1>, <v2>) -> <v3>
1 <v5>: * NEW: r(1) -> <v5>
2 <v6>: {<: Comparable<Int>} NEW: r(2) -> <v6>
3 <v7>: Int NEW: r(3) -> <v7>
2 > 3 <v8>: Boolean NEW: call(2 > 3, compareTo|<v6>, <v7>) -> <v8>
2 <v9>: * NEW: r(2) -> <v9>
{ 2 } <v9>: * COPY
<v0>: Int NEW: magic[FAKE_INITIALIZER](a : Int) -> <v0>
<v4>: Int NEW: magic[LOOP_RANGE_ITERATION](1..a|<v3>) -> <v4>
1 <v1>: Int NEW: r(1) -> <v1>
a <v2>: Int NEW: r(a) -> <v2>
1..a <v3>: {<: Iterable<Int>} NEW: call(1..a, rangeTo|<v1>, <v2>) -> <v3>
1 <v5>: * NEW: r(1) -> <v5>
2 <v6>: {<: Comparable<Int>} NEW: r(2) -> <v6>
3 <v7>: Int NEW: r(3) -> <v7>
2 > 3 <v8>: Boolean NEW: call(2 > 3, compareTo|<v6>, <v7>) -> <v8>
continue @l !<v10>: *
{ continue @l } !<v10>: * COPY
if (2 > 3) { continue @l } !<v10>: * COPY
{ 1 if (2 > 3) { continue @l } } !<v10>: * COPY
2 <v9>: * NEW: r(2) -> <v9>
{ 2 } <v9>: * COPY
try { 1 if (2 > 3) { continue @l } } finally { 2 } !<v10>: * COPY
{ try { 1 if (2 > 3) { continue @l } } finally { 2 } } !<v10>: * COPY
for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } !<v11>: *
@l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } !<v11>: * COPY
{ @l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } } !<v11>: * COPY
=====================
== t9 ==
fun t9(a : Int) {
@@ -228,12 +277,18 @@ a
2 <v6>: {<: Comparable<Int>} NEW: r(2) -> <v6>
3 <v7>: Int NEW: r(3) -> <v7>
2 > 3 <v8>: Boolean NEW: call(2 > 3, compareTo|<v6>, <v7>) -> <v8>
5 <v9>: * NEW: r(5) -> <v9>
{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } <v9>: * COPY
2 <v10>: * NEW: r(2) -> <v10>
{ 2 } <v10>: * COPY
try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } <v9>: * COPY
{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } } <v9>: * COPY
continue @l !<v9>: *
{ continue @l } !<v9>: * COPY
if (2 > 3) { continue @l } !<v9>: * COPY
{ 1 if (2 > 3) { continue @l } } !<v9>: * COPY
for (i in 1..a) { 1 if (2 > 3) { continue @l } } !<v10>: *
@l for (i in 1..a) { 1 if (2 > 3) { continue @l } } !<v10>: * COPY
5 <v11>: * NEW: r(5) -> <v11>
{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } <v11>: * COPY
2 <v12>: * NEW: r(2) -> <v12>
{ 2 } <v12>: * COPY
try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } <v11>: * COPY
{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } } <v11>: * COPY
=====================
== t10 ==
fun t10(a : Int) {
@@ -249,17 +304,26 @@ fun t10(a : Int) {
}
}
---------------------
<v0>: Int NEW: magic[FAKE_INITIALIZER](a : Int) -> <v0>
<v4>: Int NEW: magic[LOOP_RANGE_ITERATION](1..a|<v3>) -> <v4>
1 <v1>: Int NEW: r(1) -> <v1>
a <v2>: Int NEW: r(a) -> <v2>
1..a <v3>: {<: Iterable<Int>} NEW: call(1..a, rangeTo|<v1>, <v2>) -> <v3>
1 <v5>: * NEW: r(1) -> <v5>
2 <v6>: {<: Comparable<Int>} NEW: r(2) -> <v6>
3 <v7>: Int NEW: r(3) -> <v7>
2 > 3 <v8>: Boolean NEW: call(2 > 3, compareTo|<v6>, <v7>) -> <v8>
2 <v9>: * NEW: r(2) -> <v9>
{ 2 } <v9>: * COPY
<v0>: Int NEW: magic[FAKE_INITIALIZER](a : Int) -> <v0>
<v4>: Int NEW: magic[LOOP_RANGE_ITERATION](1..a|<v3>) -> <v4>
1 <v1>: Int NEW: r(1) -> <v1>
a <v2>: Int NEW: r(a) -> <v2>
1..a <v3>: {<: Iterable<Int>} NEW: call(1..a, rangeTo|<v1>, <v2>) -> <v3>
1 <v5>: * NEW: r(1) -> <v5>
2 <v6>: {<: Comparable<Int>} NEW: r(2) -> <v6>
3 <v7>: Int NEW: r(3) -> <v7>
2 > 3 <v8>: Boolean NEW: call(2 > 3, compareTo|<v6>, <v7>) -> <v8>
continue @l !<v9>: *
{ continue @l } !<v9>: * COPY
if (2 > 3) { continue @l } !<v9>: * COPY
{ 1 if (2 > 3) { continue @l } } !<v9>: * COPY
for (i in 1..a) { 1 if (2 > 3) { continue @l } } !<v10>: *
@l for (i in 1..a) { 1 if (2 > 3) { continue @l } } !<v10>: * COPY
{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } !<v10>: * COPY
2 <v11>: * NEW: r(2) -> <v11>
{ 2 } <v11>: * COPY
try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 } !<v10>: * COPY
{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 } } !<v10>: * COPY
=====================
== t11 ==
fun t11() {
@@ -271,8 +335,14 @@ fun t11() {
}
}
---------------------
1 <v0>: {<: Unit} NEW: r(1) -> <v0>
2 <v1>: {<: Unit} NEW: r(2) -> <v1>
1 <v0>: Unit NEW: r(1) -> <v0>
return 1 !<v3>: *
{ return 1 } !<v3>: * COPY
2 <v1>: Unit NEW: r(2) -> <v1>
return 2 !<v2>: *
{ return 2 } !<v2>: * COPY
try { return 1 } finally { return 2 } !<v3>: * COPY
{ try { return 1 } finally { return 2 } } !<v3>: * COPY
=====================
== t12 ==
fun t12() : Int {
@@ -284,10 +354,14 @@ fun t12() : Int {
}
}
---------------------
1 <v0>: Int NEW: r(1) -> <v0>
3 <v1>: Int NEW: r(3) -> <v1>
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
{ doSmth(3) } <v2>: * COPY
1 <v0>: Int NEW: r(1) -> <v0>
return 1 !<v3>: *
{ return 1 } !<v3>: * COPY
3 <v1>: Int NEW: r(3) -> <v1>
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
{ doSmth(3) } <v2>: * COPY
try { return 1 } finally { doSmth(3) } !<v3>: * COPY
{ try { return 1 } finally { doSmth(3) } } !<v3>: * COPY
=====================
== t13 ==
fun t13() : Int {
@@ -302,16 +376,18 @@ fun t13() : Int {
}
}
---------------------
<v3>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v3>
1 <v0>: Int NEW: r(1) -> <v0>
2 <v4>: Int NEW: r(2) -> <v4>
doSmth(2) <v5>: * NEW: call(doSmth(2), doSmth|<v4>) -> <v5>
{ doSmth(2) } <v5>: * COPY
3 <v1>: Int NEW: r(3) -> <v1>
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
{ doSmth(3) } <v2>: * COPY
try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } <v5>: * COPY
{ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } } <v5>: * COPY
<v4>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v4>
1 <v0>: Int NEW: r(1) -> <v0>
return 1 !<v3>: *
{ return 1 } !<v3>: * COPY
2 <v5>: Int NEW: r(2) -> <v5>
doSmth(2) <v6>: * NEW: call(doSmth(2), doSmth|<v5>) -> <v6>
{ doSmth(2) } <v6>: * COPY
3 <v1>: Int NEW: r(3) -> <v1>
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
{ doSmth(3) } <v2>: * COPY
try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } <v7>: * NEW: merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) }|!<v3>, <v6>) -> <v7>
{ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } finally { doSmth(3) } } <v7>: * COPY
=====================
== t14 ==
fun t14() : Int {
@@ -323,13 +399,15 @@ fun t14() : Int {
}
}
---------------------
<v1>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v1>
1 <v0>: Int NEW: r(1) -> <v0>
2 <v2>: Int NEW: r(2) -> <v2>
doSmth(2) <v3>: * NEW: call(doSmth(2), doSmth|<v2>) -> <v3>
{ doSmth(2) } <v3>: * COPY
try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } <v3>: * COPY
{ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } } <v3>: * COPY
<v2>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v2>
1 <v0>: Int NEW: r(1) -> <v0>
return 1 !<v1>: *
{ return 1 } !<v1>: * COPY
2 <v3>: Int NEW: r(2) -> <v3>
doSmth(2) <v4>: * NEW: call(doSmth(2), doSmth|<v3>) -> <v4>
{ doSmth(2) } <v4>: * COPY
try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } <v5>: * NEW: merge(try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) }|!<v1>, <v4>) -> <v5>
{ try { return 1 } catch (e: UnsupportedOperationException) { doSmth(2) } } <v5>: * COPY
=====================
== t15 ==
fun t15() : Int {
@@ -344,12 +422,18 @@ fun t15() : Int {
}
}
---------------------
<v3>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v3>
1 <v0>: Int NEW: r(1) -> <v0>
2 <v4>: Int NEW: r(2) -> <v4>
3 <v1>: Int NEW: r(3) -> <v1>
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
{ doSmth(3) } <v2>: * COPY
<v4>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v4>
1 <v0>: Int NEW: r(1) -> <v0>
return 1 !<v3>: *
{ return 1 } !<v3>: * COPY
2 <v5>: Int NEW: r(2) -> <v5>
return 2 !<v6>: *
{ return 2 } !<v6>: * COPY
3 <v1>: Int NEW: r(3) -> <v1>
doSmth(3) <v2>: * NEW: call(doSmth(3), doSmth|<v1>) -> <v2>
{ doSmth(3) } <v2>: * COPY
try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } <v7>: * NEW: merge(try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }|!<v3>, !<v6>) -> <v7>
{ try { return 1 } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } } <v7>: * COPY
=====================
== t16 ==
fun t16() : Int {
@@ -364,16 +448,18 @@ fun t16() : Int {
}
}
---------------------
<v2>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v2>
1 <v0>: Int NEW: r(1) -> <v0>
doSmth(1) <v1>: * NEW: call(doSmth(1), doSmth|<v0>) -> <v1>
{ doSmth(1) } <v1>: * COPY
2 <v3>: Int NEW: r(2) -> <v3>
3 <v4>: Int NEW: r(3) -> <v4>
doSmth(3) <v5>: * NEW: call(doSmth(3), doSmth|<v4>) -> <v5>
{ doSmth(3) } <v5>: * COPY
try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } <v1>: * COPY
{ try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } } <v1>: * COPY
<v2>: {<: UnsupportedOperationException} NEW: magic[FAKE_INITIALIZER](e: UnsupportedOperationException) -> <v2>
1 <v0>: Int NEW: r(1) -> <v0>
doSmth(1) <v1>: * NEW: call(doSmth(1), doSmth|<v0>) -> <v1>
{ doSmth(1) } <v1>: * COPY
2 <v3>: Int NEW: r(2) -> <v3>
return 2 !<v6>: *
{ return 2 } !<v6>: * COPY
3 <v4>: Int NEW: r(3) -> <v4>
doSmth(3) <v5>: * NEW: call(doSmth(3), doSmth|<v4>) -> <v5>
{ doSmth(3) } <v5>: * COPY
try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } <v7>: * NEW: merge(try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) }|<v1>, !<v6>) -> <v7>
{ try { doSmth(1) } catch (e: UnsupportedOperationException) { return 2 } finally { doSmth(3) } } <v7>: * COPY
=====================
== doSmth ==
fun doSmth(i: Int) {
@@ -110,7 +110,7 @@ L6 [skipFinallyToErrorBlock]:
3 mark({ return 1 }) PREV:[jmp(L6 [skipFinallyToErrorBlock])]
r(1) -> <v5>
ret(*|<v5>) L1 NEXT:[<END>]
- 2 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 }|<v0>, <v2>, <v4>) -> <v6> PREV:[]
- 2 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 }|<v0>, <v2>, <v4>) -> <v7> PREV:[]
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v5>) L1, ret(*|<v5>) L1]
error:
@@ -142,30 +142,30 @@ L0:
2 mark({ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } })
L2 [loop entry point]:
L5 [condition entry point]:
mark(cond()) PREV:[mark({ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } }), jmp(L2 [loop entry point]), jmp(L2 [loop entry point])]
mark(cond()) PREV:[mark({ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } }), jmp(L2 [loop entry point]), jmp(L2 [loop entry point])]
call(cond(), cond) -> <v0>
mark(while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })
jf(L3 [loop exit point]|<v0>) NEXT:[read (Unit), mark({ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })]
jf(L3 [loop exit point]|<v0>) NEXT:[read (Unit), mark({ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })]
L4 [body entry point]:
3 mark({ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } })
mark(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue })
jmp?(L6 [onException]) NEXT:[jmp?(L9 [catch 0]), jmp?(L7 [onExceptionToFinallyBlock])]
jmp?(L7 [onExceptionToFinallyBlock]) NEXT:[mark({ if (cond()) return else continue }), mark({ doSmth() })]
jmp?(L6 [onException]) NEXT:[jmp?(L9 [catch 0]), jmp?(L7 [onExceptionToFinallyBlock])]
jmp?(L7 [onExceptionToFinallyBlock]) NEXT:[mark({ if (cond()) return else continue }), mark({ doSmth() })]
4 mark({ doSmth() })
mark(doSmth())
call(doSmth(), doSmth) -> <v1>
3 jmp(L8 [afterCatches]) NEXT:[jmp(L10 [skipFinallyToErrorBlock])]
3 jmp(L8 [afterCatches]) NEXT:[jmp(L10 [skipFinallyToErrorBlock])]
L6 [onException]:
jmp?(L9 [catch 0]) NEXT:[v(e: Exception), v(e: NullPointerException)] PREV:[jmp?(L6 [onException])]
jmp?(L9 [catch 0]) NEXT:[v(e: Exception), v(e: NullPointerException)] PREV:[jmp?(L6 [onException])]
4 v(e: NullPointerException)
magic[FAKE_INITIALIZER](e: NullPointerException) -> <v2>
w(e|<v2>)
5 mark({ doSmth1() })
mark(doSmth1())
call(doSmth1(), doSmth1) -> <v3>
4 jmp(L8 [afterCatches]) NEXT:[jmp(L10 [skipFinallyToErrorBlock])]
4 jmp(L8 [afterCatches]) NEXT:[jmp(L10 [skipFinallyToErrorBlock])]
L9 [catch 0]:
v(e: Exception) PREV:[jmp?(L9 [catch 0])]
v(e: Exception) PREV:[jmp?(L9 [catch 0])]
magic[FAKE_INITIALIZER](e: Exception) -> <v4>
w(e|<v4>)
5 mark({ doSmth2() })
@@ -173,40 +173,42 @@ L9 [catch 0]:
call(doSmth2(), doSmth2) -> <v5>
4 jmp(L8 [afterCatches])
L8 [afterCatches]:
3 jmp(L10 [skipFinallyToErrorBlock]) NEXT:[mark({ if (cond()) return else continue })] PREV:[jmp(L8 [afterCatches]), jmp(L8 [afterCatches]), jmp(L8 [afterCatches])]
3 jmp(L10 [skipFinallyToErrorBlock]) NEXT:[mark({ if (cond()) return else continue })] PREV:[jmp(L8 [afterCatches]), jmp(L8 [afterCatches]), jmp(L8 [afterCatches])]
L7 [onExceptionToFinallyBlock]:
L11 [start finally]:
4 mark({ if (cond()) return else continue }) PREV:[jmp?(L7 [onExceptionToFinallyBlock])]
4 mark({ if (cond()) return else continue }) PREV:[jmp?(L7 [onExceptionToFinallyBlock])]
mark(if (cond()) return else continue)
mark(cond())
call(cond(), cond) -> <v6>
jf(L12|<v6>) NEXT:[jmp(L2 [loop entry point]), ret L1]
ret L1 NEXT:[<END>]
- jmp(L13) NEXT:[jmp(error)] PREV:[]
jf(L12|<v6>) NEXT:[jmp(L2 [loop entry point]), ret L1]
ret L1 NEXT:[<END>]
- jmp(L13) NEXT:[merge(if (cond()) return else continue|!<v7>, !<v8>) -> <v9>] PREV:[]
L12:
jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[jf(L12|<v6>)]
jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[jf(L12|<v6>)]
L13:
- merge(if (cond()) return else continue|!<v7>, !<v8>) -> <v9> PREV:[]
L14 [finish finally]:
- 3 jmp(error) NEXT:[<ERROR>] PREV:[]
- 3 jmp(error) NEXT:[<ERROR>] PREV:[]
L10 [skipFinallyToErrorBlock]:
4 mark({ if (cond()) return else continue }) PREV:[jmp(L10 [skipFinallyToErrorBlock])]
4 mark({ if (cond()) return else continue }) PREV:[jmp(L10 [skipFinallyToErrorBlock])]
mark(if (cond()) return else continue)
mark(cond())
call(cond(), cond) -> <v6>
jf(copy L12|<v6>) NEXT:[jmp(L2 [loop entry point]), ret L1]
ret L1 NEXT:[<END>]
- jmp(copy L13) NEXT:[merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue }|<v1>, <v3>, <v5>) -> <v7>] PREV:[]
jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[jf(copy L12|<v6>)]
- 3 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue }|<v1>, <v3>, <v5>) -> <v7> PREV:[]
- 2 jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[]
jf(copy L12|<v6>) NEXT:[jmp(L2 [loop entry point]), ret L1]
ret L1 NEXT:[<END>]
- jmp(copy L13) NEXT:[merge(if (cond()) return else continue|!<v7>, !<v8>) -> <v9>] PREV:[]
jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[jf(copy L12|<v6>)]
- merge(if (cond()) return else continue|!<v7>, !<v8>) -> <v9> PREV:[]
- 3 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue }|<v1>, <v3>, <v5>) -> <v10> PREV:[]
- 2 jmp(L2 [loop entry point]) NEXT:[mark(cond())] PREV:[]
L3 [loop exit point]:
read (Unit) PREV:[jf(L3 [loop exit point]|<v0>)]
read (Unit) PREV:[jf(L3 [loop exit point]|<v0>)]
L1:
1 <END> NEXT:[<SINK>] PREV:[ret L1, ret L1, read (Unit)]
1 <END> NEXT:[<SINK>] PREV:[ret L1, ret L1, read (Unit)]
error:
<ERROR> PREV:[]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
== testCopy3 ==
fun testCopy3() {
@@ -276,7 +278,7 @@ L6 [skipFinallyToErrorBlock]:
jf(copy L9 [loop exit point]|<v5>) NEXT:[read (Unit), jmp(copy L8 [loop entry point])]
jmp(copy L8 [loop entry point]) NEXT:[mark(cond())]
read (Unit) PREV:[jf(copy L9 [loop exit point]|<v5>)]
2 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); }|<v0>, <v2>, <v4>) -> <v6>
2 merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); }|<v0>, <v2>, <v4>) -> <v7>
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -39,8 +39,10 @@ doSmth1()
doSmth2() <v4>: * NEW: call(doSmth2(), doSmth2) -> <v4>
{ doSmth2() } <v4>: * COPY
1 <v5>: Int NEW: r(1) -> <v5>
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 } <v6>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 }|<v0>, <v2>, <v4>) -> <v6>
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 } } <v6>: * COPY
return 1 !<v6>: *
{ return 1 } !<v6>: * COPY
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 } <v7>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 }|<v0>, <v2>, <v4>) -> <v7>
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { return 1 } } <v7>: * COPY
=====================
== testCopy2 ==
fun testCopy2() {
@@ -61,18 +63,24 @@ fun testCopy2() {
}
}
---------------------
<v2>: {<: NullPointerException} NEW: magic[FAKE_INITIALIZER](e: NullPointerException) -> <v2>
<v4>: {<: Exception} NEW: magic[FAKE_INITIALIZER](e: Exception) -> <v4>
cond() <v0>: Boolean NEW: call(cond(), cond) -> <v0>
doSmth() <v1>: * NEW: call(doSmth(), doSmth) -> <v1>
{ doSmth() } <v1>: * COPY
doSmth1() <v3>: * NEW: call(doSmth1(), doSmth1) -> <v3>
{ doSmth1() } <v3>: * COPY
doSmth2() <v5>: * NEW: call(doSmth2(), doSmth2) -> <v5>
{ doSmth2() } <v5>: * COPY
cond() <v6>: Boolean NEW: call(cond(), cond) -> <v6>
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } <v7>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue }|<v1>, <v3>, <v5>) -> <v7>
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } <v7>: * COPY
<v2>: {<: NullPointerException} NEW: magic[FAKE_INITIALIZER](e: NullPointerException) -> <v2>
<v4>: {<: Exception} NEW: magic[FAKE_INITIALIZER](e: Exception) -> <v4>
cond() <v0>: Boolean NEW: call(cond(), cond) -> <v0>
doSmth() <v1>: * NEW: call(doSmth(), doSmth) -> <v1>
{ doSmth() } <v1>: * COPY
doSmth1() <v3>: * NEW: call(doSmth1(), doSmth1) -> <v3>
{ doSmth1() } <v3>: * COPY
doSmth2() <v5>: * NEW: call(doSmth2(), doSmth2) -> <v5>
{ doSmth2() } <v5>: * COPY
cond() <v6>: Boolean NEW: call(cond(), cond) -> <v6>
return !<v7>: *
continue !<v8>: *
if (cond()) return else continue <v9>: * NEW: merge(if (cond()) return else continue|!<v7>, !<v8>) -> <v9>
{ if (cond()) return else continue } <v9>: * COPY
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } <v10>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue }|<v1>, <v3>, <v5>) -> <v10>
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } <v10>: * COPY
while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } !<v11>: *
{ while (cond()) { try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { if (cond()) return else continue } } } !<v11>: * COPY
=====================
== testCopy3 ==
fun testCopy3() {
@@ -99,8 +107,10 @@ doSmth1()
doSmth2() <v4>: * NEW: call(doSmth2(), doSmth2) -> <v4>
{ doSmth2() } <v4>: * COPY
cond() <v5>: Boolean NEW: call(cond(), cond) -> <v5>
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); } <v6>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); }|<v0>, <v2>, <v4>) -> <v6>
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); } } <v6>: * COPY
while (cond()) !<v6>: *
{ while (cond()); } !<v6>: * COPY
try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); } <v7>: * NEW: merge(try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); }|<v0>, <v2>, <v4>) -> <v7>
{ try { doSmth() } catch (e: NullPointerException) { doSmth1() } catch (e: Exception) { doSmth2() } finally { while (cond()); } } <v7>: * COPY
=====================
== doTestCopy4 ==
fun doTestCopy4(list: List<String>?) : Int {
@@ -116,9 +126,12 @@ fun doTestCopy4(list: List<String>?) : Int {
<v0>: {<: List<String>?} NEW: magic[FAKE_INITIALIZER](list: List<String>?) -> <v0>
doSmth() <v1>: * NEW: call(doSmth(), doSmth) -> <v1>
{ doSmth() } <v1>: * COPY
list <v2>: * NEW: r(list) -> <v2>
null <v3>: * NEW: r(null) -> <v3>
list <v2>: * NEW: r(list) -> <v2>
null <v3>: * NEW: r(null) -> <v3>
list != null <v4>: Boolean NEW: call(list != null, equals|<v2>, <v3>) -> <v4>
{ } !<v5>: *
if(list != null) { } !<v5>: * COPY
{ if(list != null) { } } !<v5>: * COPY
try { doSmth() } finally { if(list != null) { } } <v1>: * COPY
{ try { doSmth() } finally { if(list != null) { } } } <v1>: * COPY
=====================
@@ -5,13 +5,15 @@ fun t1() {
}
}
---------------------
<v3>: Int NEW: magic[LOOP_RANGE_ITERATION](1..2|<v2>) -> <v3>
1 <v0>: Int NEW: r(1) -> <v0>
2 <v1>: Int NEW: r(2) -> <v1>
1..2 <v2>: {<: Iterable<Int>} NEW: call(1..2, rangeTo|<v0>, <v1>) -> <v2>
i <v4>: Int NEW: r(i) -> <v4>
doSmth(i) <v5>: * NEW: call(doSmth(i), doSmth|<v4>) -> <v5>
{ doSmth(i) } <v5>: * COPY
<v3>: Int NEW: magic[LOOP_RANGE_ITERATION](1..2|<v2>) -> <v3>
1 <v0>: Int NEW: r(1) -> <v0>
2 <v1>: Int NEW: r(2) -> <v1>
1..2 <v2>: {<: Iterable<Int>} NEW: call(1..2, rangeTo|<v0>, <v1>) -> <v2>
i <v4>: Int NEW: r(i) -> <v4>
doSmth(i) <v5>: * NEW: call(doSmth(i), doSmth|<v4>) -> <v5>
{ doSmth(i) } <v5>: * COPY
for (i in 1..2) { doSmth(i) } !<v6>: *
{ for (i in 1..2) { doSmth(i) } } !<v6>: * COPY
=====================
== doSmth ==
fun doSmth(i: Int) {}
@@ -30,31 +30,32 @@ L0:
mark("s")
r("s") -> <v2>
w(u|<v2>)
2 jmp(L3) NEXT:[r(u) -> <v3>]
2 jmp(L3) NEXT:[r(u) -> <v4>]
L2:
read (Unit) PREV:[jf(L2|<v1>)]
L3:
r(u) -> <v3> PREV:[jmp(L3), read (Unit)]
r(u) -> <v4> PREV:[jmp(L3), read (Unit)]
mark(doSmth(u))
call(doSmth(u), doSmth|<v3>) -> <v4>
call(doSmth(u), doSmth|<v4>) -> <v5>
v(var r: String)
mark(if (b) { r = "s" } else { r = "t" })
r(b) -> <v5>
jf(L4|<v5>) NEXT:[mark({ r = "t" }), mark({ r = "s" })]
r(b) -> <v6>
jf(L4|<v6>) NEXT:[mark({ r = "t" }), mark({ r = "s" })]
3 mark({ r = "s" })
mark("s")
r("s") -> <v6>
w(r|<v6>)
2 jmp(L5) NEXT:[r(r) -> <v8>]
L4:
3 mark({ r = "t" }) PREV:[jf(L4|<v5>)]
mark("t")
r("t") -> <v7>
r("s") -> <v7>
w(r|<v7>)
2 jmp(L5) NEXT:[merge(if (b) { r = "s" } else { r = "t" }|!<v8>, !<v10>) -> <v11>]
L4:
3 mark({ r = "t" }) PREV:[jf(L4|<v6>)]
mark("t")
r("t") -> <v9>
w(r|<v9>)
L5:
2 r(r) -> <v8> PREV:[jmp(L5), w(r|<v7>)]
2 merge(if (b) { r = "s" } else { r = "t" }|!<v8>, !<v10>) -> <v11> PREV:[jmp(L5), w(r|<v9>)]
r(r) -> <v12>
mark(doSmth(r))
call(doSmth(r), doSmth|<v8>) -> <v9>
call(doSmth(r), doSmth|<v12>) -> <v13>
L1:
1 <END> NEXT:[<SINK>]
error:
@@ -88,23 +89,23 @@ L0:
jf(L2|<v2>) NEXT:[read (Unit), mark({ return; })]
3 mark({ return; })
ret L1 NEXT:[<END>]
- 2 jmp(L3) NEXT:[r(i) -> <v3>] PREV:[]
- 2 jmp(L3) NEXT:[r(i) -> <v4>] PREV:[]
L2:
read (Unit) PREV:[jf(L2|<v2>)]
L3:
r(i) -> <v3>
r(i) -> <v4>
mark(doSmth(i))
call(doSmth(i), doSmth|<v3>) -> <v4>
call(doSmth(i), doSmth|<v4>) -> <v5>
mark(if (i is Int) { return; })
mark(i is Int)
r(i) -> <v5>
magic[IS](i is Int|<v5>) -> <v6>
jf(L4|<v6>) NEXT:[read (Unit), mark({ return; })]
r(i) -> <v6>
magic[IS](i is Int|<v6>) -> <v7>
jf(L4|<v7>) NEXT:[read (Unit), mark({ return; })]
3 mark({ return; })
ret L1 NEXT:[<END>]
- 2 jmp(L5) NEXT:[<END>] PREV:[]
L4:
read (Unit) PREV:[jf(L4|<v6>)]
read (Unit) PREV:[jf(L4|<v7>)]
L1:
L5:
1 <END> NEXT:[<SINK>] PREV:[ret L1, ret L1, read (Unit)]
@@ -16,17 +16,25 @@ fun t1(b: Boolean) {
doSmth(r)
}
---------------------
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](b: Boolean) -> <v0>
b <v1>: Boolean NEW: r(b) -> <v1>
"s" <v2>: String NEW: r("s") -> <v2>
u <v3>: String NEW: r(u) -> <v3>
doSmth(u) <v4>: * NEW: call(doSmth(u), doSmth|<v3>) -> <v4>
b <v5>: Boolean NEW: r(b) -> <v5>
"s" <v6>: String NEW: r("s") -> <v6>
"t" <v7>: String NEW: r("t") -> <v7>
r <v8>: String NEW: r(r) -> <v8>
doSmth(r) <v9>: * NEW: call(doSmth(r), doSmth|<v8>) -> <v9>
{ var u: String if (b) { u = "s" } doSmth(u) var r: String if (b) { r = "s" } else { r = "t" } doSmth(r) } <v9>: * COPY
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](b: Boolean) -> <v0>
b <v1>: Boolean NEW: r(b) -> <v1>
"s" <v2>: String NEW: r("s") -> <v2>
u = "s" !<v3>: *
{ u = "s" } !<v3>: * COPY
if (b) { u = "s" } !<v3>: * COPY
u <v4>: String NEW: r(u) -> <v4>
doSmth(u) <v5>: * NEW: call(doSmth(u), doSmth|<v4>) -> <v5>
b <v6>: Boolean NEW: r(b) -> <v6>
"s" <v7>: String NEW: r("s") -> <v7>
r = "s" !<v8>: *
{ r = "s" } !<v8>: * COPY
"t" <v9>: String NEW: r("t") -> <v9>
r = "t" !<v10>: *
{ r = "t" } !<v10>: * COPY
if (b) { r = "s" } else { r = "t" } <v11>: * NEW: merge(if (b) { r = "s" } else { r = "t" }|!<v8>, !<v10>) -> <v11>
r <v12>: String NEW: r(r) -> <v12>
doSmth(r) <v13>: * NEW: call(doSmth(r), doSmth|<v12>) -> <v13>
{ var u: String if (b) { u = "s" } doSmth(u) var r: String if (b) { r = "s" } else { r = "t" } doSmth(r) } <v13>: * COPY
=====================
== t2 ==
fun t2(b: Boolean) {
@@ -40,13 +48,20 @@ fun t2(b: Boolean) {
}
}
---------------------
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](b: Boolean) -> <v0>
3 <v1>: Int NEW: r(3) -> <v1>
b <v2>: Boolean NEW: r(b) -> <v2>
i <v3>: String NEW: r(i) -> <v3>
doSmth(i) <v4>: * NEW: call(doSmth(i), doSmth|<v3>) -> <v4>
i <v5>: * NEW: r(i) -> <v5>
i is Int <v6>: Boolean NEW: magic[IS](i is Int|<v5>) -> <v6>
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](b: Boolean) -> <v0>
3 <v1>: Int NEW: r(3) -> <v1>
b <v2>: Boolean NEW: r(b) -> <v2>
return !<v3>: *
{ return; } !<v3>: * COPY
if (b) { return; } !<v3>: * COPY
i <v4>: String NEW: r(i) -> <v4>
doSmth(i) <v5>: * NEW: call(doSmth(i), doSmth|<v4>) -> <v5>
i <v6>: * NEW: r(i) -> <v6>
i is Int <v7>: Boolean NEW: magic[IS](i is Int|<v6>) -> <v7>
return !<v8>: *
{ return; } !<v8>: * COPY
if (i is Int) { return; } !<v8>: * COPY
{ val i = 3 if (b) { return; } doSmth(i) if (i is Int) { return; } } !<v8>: * COPY
=====================
== doSmth ==
fun doSmth(s: String) {}
@@ -44,11 +44,11 @@ L4 [body entry point]:
mark({return})
ret L1 NEXT:[<END>]
L5 [condition entry point]:
- r(0) -> <v0> PREV:[]
- r(1) -> <v1> PREV:[]
- r(0) -> <v1> PREV:[]
- r(1) -> <v2> PREV:[]
- mark(0 > 1) PREV:[]
- call(0 > 1, compareTo|<v0>, <v1>) -> <v2> PREV:[]
- jt(L2 [loop entry point]|<v2>) NEXT:[read (Unit), mark({return})] PREV:[]
- call(0 > 1, compareTo|<v1>, <v2>) -> <v3> PREV:[]
- jt(L2 [loop entry point]|<v3>) NEXT:[read (Unit), mark({return})] PREV:[]
L3 [loop exit point]:
- read (Unit) PREV:[]
L1:
@@ -5,11 +5,13 @@ fun main() {
}
}
---------------------
0 <v0>: {<: Comparable<Int>} NEW: r(0) -> <v0>
1 <v1>: Int NEW: r(1) -> <v1>
0 > 1 <v2>: Boolean NEW: call(0 > 1, compareTo|<v0>, <v1>) -> <v2>
2 <v3>: * NEW: r(2) -> <v3>
{ 2 } <v3>: * COPY
0 <v0>: {<: Comparable<Int>} NEW: r(0) -> <v0>
1 <v1>: Int NEW: r(1) -> <v1>
0 > 1 <v2>: Boolean NEW: call(0 > 1, compareTo|<v0>, <v1>) -> <v2>
2 <v3>: * NEW: r(2) -> <v3>
{ 2 } <v3>: * COPY
while(0 > 1) { 2 } !<v4>: *
{ while(0 > 1) { 2 } } !<v4>: * COPY
=====================
== dowhile ==
fun dowhile() {
@@ -17,7 +19,11 @@ fun dowhile() {
while(0 > 1)
}
---------------------
0 <v0>: {<: Comparable<Int>} NEW: r(0) -> <v0>
1 <v1>: Int NEW: r(1) -> <v1>
0 > 1 <v2>: Boolean NEW: call(0 > 1, compareTo|<v0>, <v1>) -> <v2>
return !<v0>: *
{return} !<v0>: * COPY
0 <v1>: {<: Comparable<Int>} NEW: r(0) -> <v1>
1 <v2>: Int NEW: r(1) -> <v2>
0 > 1 <v3>: Boolean NEW: call(0 > 1, compareTo|<v1>, <v2>) -> <v3>
do {return} while(0 > 1) !<v4>: *
{ do {return} while(0 > 1) } !<v4>: * COPY
=====================
@@ -5,8 +5,11 @@ fun illegalWhenBlock(a: Any): Any {
}
}
---------------------
<v0>: {<: Any} NEW: magic[FAKE_INITIALIZER](a: Any) -> <v0>
a <v1>: * NEW: r(a) -> <v1>
is Int <v2>: * NEW: magic[IS](is Int|<v1>) -> <v2>
a <v3>: {<: Any} NEW: r(a) -> <v3>
<v0>: {<: Any} NEW: magic[FAKE_INITIALIZER](a: Any) -> <v0>
a <v1>: * NEW: r(a) -> <v1>
is Int <v2>: * NEW: magic[IS](is Int|<v1>) -> <v2>
a <v3>: {<: Any} NEW: r(a) -> <v3>
return a !<v4>: *
when(a) { is Int -> return a } !<v4>: * COPY
{ when(a) { is Int -> return a } } !<v4>: * COPY
=====================
@@ -11,7 +11,7 @@ fun foo(a: Number) {
}
---------------------
<v0>: {<: Number} NEW: magic[FAKE_INITIALIZER](a: Number) -> <v0>
a <v1>: * NEW: r(a) -> <v1>
a <v1>: * NEW: r(a) -> <v1>
1 <v2>: * NEW: r(1) -> <v2>
1 <v3>: * NEW: magic[EQUALS_IN_WHEN_CONDITION](1|<v1>, <v2>) -> <v3>
"1" <v4>: {<: String?} NEW: r("1") -> <v4>