CFG exhaustive when else instruction for KT-8700

This commit is contained in:
Mikhail Glukhikh
2015-12-14 16:08:01 +03:00
committed by Mikhail Glukhikh
parent 697228eae0
commit b805ce06c2
25 changed files with 446 additions and 51 deletions
@@ -18,29 +18,29 @@ L0:
mark(true)
r(true) -> <v2>
magic[EQUALS_IN_WHEN_CONDITION](true|<v1>, <v2>) -> <v3>
jmp?(L4|<v3>) NEXT:[mark(false -> return 0), r(1) -> <v4>]
jmp?(L4|<v3>) NEXT:[mark(false -> return 0), r(1) -> <v4>]
L3 ['when' entry body]:
r(1) -> <v4>
ret(*|<v4>) L1 NEXT:[<END>]
- jmp(L2) NEXT:[merge(when (flag) { true -> return 1 false -> return 0 }|!<v8>, !<v9>) -> <v10>] PREV:[]
ret(*|<v4>) L1 NEXT:[<END>]
- jmp(L2) NEXT:[merge(when (flag) { true -> return 1 false -> return 0 }|!<v9>, !<v10>) -> <v11>] PREV:[]
L4 [next 'when' entry]:
mark(false -> return 0) PREV:[jmp?(L4|<v3>)]
mark(false -> return 0) PREV:[jmp?(L4|<v3>)]
mark(false)
r(false) -> <v5>
magic[EQUALS_IN_WHEN_CONDITION](false|<v1>, <v5>) -> <v6>
jmp?(L6|<v6>) NEXT:[jmp(error), r(0) -> <v7>]
jmp?(L6|<v6>) NEXT:[magic[EXHAUSTIVE_WHEN_ELSE](when (flag) { true -> return 1 false -> return 0 }) -> <v8>, r(0) -> <v7>]
L5 ['when' entry body]:
r(0) -> <v7>
ret(*|<v7>) L1 NEXT:[<END>]
- jmp(L2) NEXT:[merge(when (flag) { true -> return 1 false -> return 0 }|!<v8>, !<v9>) -> <v10>] PREV:[]
ret(*|<v7>) L1 NEXT:[<END>]
- jmp(L2) NEXT:[merge(when (flag) { true -> return 1 false -> return 0 }|!<v9>, !<v10>) -> <v11>] PREV:[]
L6 [next 'when' entry]:
jmp(error) NEXT:[<ERROR>] PREV:[jmp?(L6|<v6>)]
magic[EXHAUSTIVE_WHEN_ELSE](when (flag) { true -> return 1 false -> return 0 }) -> <v8> PREV:[jmp?(L6|<v6>)]
L2 [after 'when' expression]:
- merge(when (flag) { true -> return 1 false -> return 0 }|!<v8>, !<v9>) -> <v10> PREV:[]
- merge(when (flag) { true -> return 1 false -> return 0 }|!<v9>, !<v10>) -> <v11>
L1:
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v4>) L1, ret(*|<v7>) L1]
1 <END> NEXT:[<SINK>] PREV:[ret(*|<v4>) L1, ret(*|<v7>) L1]
error:
<ERROR> PREV:[jmp(error)]
<ERROR> PREV:[]
sink:
<SINK> PREV:[<ERROR>, <END>]
<SINK> PREV:[<ERROR>, <END>]
=====================
@@ -7,15 +7,16 @@ fun foo(flag: Boolean): Int {
}
---------------------
<v0>: Boolean NEW: magic[FAKE_INITIALIZER](flag: Boolean) -> <v0>
<v8>: * NEW: magic[EXHAUSTIVE_WHEN_ELSE](when (flag) { true -> return 1 false -> return 0 }) -> <v8>
flag <v1>: * NEW: r(flag) -> <v1>
true <v2>: * NEW: r(true) -> <v2>
true <v3>: * NEW: magic[EQUALS_IN_WHEN_CONDITION](true|<v1>, <v2>) -> <v3>
1 <v4>: Int NEW: r(1) -> <v4>
return 1 !<v8>: *
return 1 !<v9>: *
false <v5>: * NEW: r(false) -> <v5>
false <v6>: * NEW: magic[EQUALS_IN_WHEN_CONDITION](false|<v1>, <v5>) -> <v6>
0 <v7>: Int NEW: r(0) -> <v7>
return 0 !<v9>: *
when (flag) { true -> return 1 false -> return 0 } <v10>: * NEW: merge(when (flag) { true -> return 1 false -> return 0 }|!<v8>, !<v9>) -> <v10>
{ when (flag) { true -> return 1 false -> return 0 } } <v10>: * COPY
return 0 !<v10>: *
when (flag) { true -> return 1 false -> return 0 } <v11>: * NEW: merge(when (flag) { true -> return 1 false -> return 0 }|!<v9>, !<v10>) -> <v11>
{ when (flag) { true -> return 1 false -> return 0 } } <v11>: * COPY
=====================