diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 9dbbe8fa50d..3e979d10abe 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -220,17 +220,7 @@ public class JetControlFlowProcessor { } private void mergeValues(@NotNull List from, @NotNull JetExpression to) { - List values = elementsToValues(from); - switch (values.size()) { - case 0: - break; - case 1: - builder.bindValue(values.get(0), to); - break; - default: - builder.merge(to, values); - break; - } + builder.merge(to, elementsToValues(from)); } private void copyValue(@Nullable JetElement from, @NotNull JetElement to) { diff --git a/compiler/testData/cfg/controlStructures/Finally.instructions b/compiler/testData/cfg/controlStructures/Finally.instructions index 9fd97fcc5e0..78f28d8213d 100644 --- a/compiler/testData/cfg/controlStructures/Finally.instructions +++ b/compiler/testData/cfg/controlStructures/Finally.instructions @@ -11,25 +11,26 @@ L0: 1 2 mark({ try { 1 } finally { 2 } }) mark(try { 1 } finally { 2 }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ 1 })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ 1 })] 3 mark({ 1 }) r(1) -> - 2 jmp(L3 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] + 2 jmp(L3 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] L2 [onExceptionToFinallyBlock]: L4 [start finally]: - 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] r(2) -> L5 [finish finally]: - 2 jmp(error) NEXT:[] + 2 jmp(error) NEXT:[] L3 [skipFinallyToErrorBlock]: - 3 mark({ 2 }) PREV:[jmp(L3 [skipFinallyToErrorBlock])] + 3 mark({ 2 }) PREV:[jmp(L3 [skipFinallyToErrorBlock])] r(2) -> + 2 merge(try { 1 } finally { 2 }|) -> L1: - 1 NEXT:[] + 1 NEXT:[] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== == t2 == fun t2() { @@ -47,7 +48,7 @@ L0: 1 2 mark({ try { 1 if (2 > 3) { return } } finally { 2 } }) mark(try { 1 if (2 > 3) { return } } finally { 2 }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ 1 if (2 > 3) { return } })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ 1 if (2 > 3) { return } })] 3 mark({ 1 if (2 > 3) { return } }) r(1) -> mark(if (2 > 3) { return }) @@ -55,31 +56,33 @@ L0: r(3) -> mark(2 > 3) call(2 > 3, compareTo|, ) -> - jf(L3|) NEXT:[read (Unit), mark({ return })] + jf(L3|) NEXT:[read (Unit), mark({ return })] 4 mark({ return }) L4 [start finally]: 5 mark({ 2 }) r(2) -> L5 [finish finally]: - 4 ret L1 NEXT:[] -- 3 jmp(L6) NEXT:[jmp(L7 [skipFinallyToErrorBlock])] PREV:[] + 4 ret L1 NEXT:[] +- 3 jmp(L6) NEXT:[merge(if (2 > 3) { return }|!) -> ] PREV:[] L3: - read (Unit) PREV:[jf(L3|)] + read (Unit) PREV:[jf(L3|)] L6: - 2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] + merge(if (2 > 3) { return }|!) -> + 2 jmp(L7 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] L2 [onExceptionToFinallyBlock]: - 5 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + 5 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] r(2) -> - 2 jmp(error) NEXT:[] + 2 jmp(error) NEXT:[] L7 [skipFinallyToErrorBlock]: - 5 mark({ 2 }) PREV:[jmp(L7 [skipFinallyToErrorBlock])] + 5 mark({ 2 }) PREV:[jmp(L7 [skipFinallyToErrorBlock])] r(2) -> + 2 merge(try { 1 if (2 > 3) { return } } finally { 2 }|) -> L1: - 1 NEXT:[] PREV:[ret L1, r(2) -> ] + 1 NEXT:[] PREV:[ret L1, merge(try { 1 if (2 > 3) { return } } finally { 2 }|) -> ] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== == t3 == fun t3() { @@ -99,31 +102,32 @@ L0: 1 2 mark({ try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 } }) mark(try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ 1 @l{ () -> if (2 > 3) { return@l } } })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ 1 @l{ () -> if (2 > 3) { return@l } } })] 3 mark({ 1 @l{ () -> if (2 > 3) { return@l } } }) r(1) -> mark(@l{ () -> if (2 > 3) { return@l } }) mark({ () -> if (2 > 3) { return@l } }) - jmp?(L3) NEXT:[r({ () -> if (2 > 3) { return@l } }) -> , d({ () -> if (2 > 3) { return@l } })] - d({ () -> if (2 > 3) { return@l } }) NEXT:[] + jmp?(L3) NEXT:[r({ () -> if (2 > 3) { return@l } }) -> , d({ () -> if (2 > 3) { return@l } })] + d({ () -> if (2 > 3) { return@l } }) NEXT:[] L3: - r({ () -> if (2 > 3) { return@l } }) -> PREV:[jmp?(L3)] - 2 jmp(L8 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] + r({ () -> if (2 > 3) { return@l } }) -> PREV:[jmp?(L3)] + 2 jmp(L8 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] L2 [onExceptionToFinallyBlock]: L9 [start finally]: - 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] r(2) -> L10 [finish finally]: - 2 jmp(error) NEXT:[] + 2 jmp(error) NEXT:[] L8 [skipFinallyToErrorBlock]: - 3 mark({ 2 }) PREV:[jmp(L8 [skipFinallyToErrorBlock])] + 3 mark({ 2 }) PREV:[jmp(L8 [skipFinallyToErrorBlock])] r(2) -> + 2 merge(try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 }|) -> L1: - 1 NEXT:[] + 1 NEXT:[] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, , d({ () -> if (2 > 3) { return@l } })] + PREV:[, , d({ () -> if (2 > 3) { return@l } })] ===================== == anonymous_0 == { () -> @@ -140,20 +144,21 @@ L4: r(3) -> mark(2 > 3) call(2 > 3, compareTo|, ) -> - jf(L6|) NEXT:[read (Unit), mark({ return@l })] + jf(L6|) NEXT:[read (Unit), mark({ return@l })] 6 mark({ return@l }) - ret L5 NEXT:[] -- 5 jmp(L7) NEXT:[ret(*|!) L5] PREV:[] + ret L5 NEXT:[] +- 5 jmp(L7) NEXT:[merge(if (2 > 3) { return@l }|!) -> ] PREV:[] L6: - read (Unit) PREV:[jf(L6|)] + read (Unit) PREV:[jf(L6|)] L7: - 4 ret(*|!) L5 + merge(if (2 > 3) { return@l }|!) -> + 4 ret(*|) L5 L5: - NEXT:[] PREV:[ret L5, ret(*|!) L5] + NEXT:[] PREV:[ret L5, ret(*|) L5] error: - PREV:[] + PREV:[] sink: - PREV:[, ] + PREV:[, ] ===================== == t4 == fun t4() { @@ -201,7 +206,7 @@ L3: 3 4 mark(try { 1 if (2 > 3) { return@l } } finally { 2 }) mark(try { 1 if (2 > 3) { return@l } } finally { 2 }) - jmp?(L5 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ 1 if (2 > 3) { return@l } })] + jmp?(L5 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ 1 if (2 > 3) { return@l } })] 5 mark({ 1 if (2 > 3) { return@l } }) r(1) -> mark(if (2 > 3) { return@l }) @@ -209,32 +214,34 @@ L3: r(3) -> mark(2 > 3) call(2 > 3, compareTo|, ) -> - jf(L6|) NEXT:[read (Unit), mark({ return@l })] + jf(L6|) NEXT:[read (Unit), mark({ return@l })] 6 mark({ return@l }) L7 [start finally]: 7 mark({ 2 }) r(2) -> L8 [finish finally]: - 6 ret L4 NEXT:[] -- 5 jmp(L9) NEXT:[jmp(L10 [skipFinallyToErrorBlock])] PREV:[] + 6 ret L4 NEXT:[] +- 5 jmp(L9) NEXT:[merge(if (2 > 3) { return@l }|!) -> ] PREV:[] L6: - read (Unit) PREV:[jf(L6|)] + read (Unit) PREV:[jf(L6|)] L9: - 4 jmp(L10 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] + merge(if (2 > 3) { return@l }|!) -> + 4 jmp(L10 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] L5 [onExceptionToFinallyBlock]: - 7 mark({ 2 }) PREV:[jmp?(L5 [onExceptionToFinallyBlock])] + 7 mark({ 2 }) PREV:[jmp?(L5 [onExceptionToFinallyBlock])] r(2) -> - 4 jmp(error) NEXT:[] + 4 jmp(error) NEXT:[] L10 [skipFinallyToErrorBlock]: - 7 mark({ 2 }) PREV:[jmp(L10 [skipFinallyToErrorBlock])] + 7 mark({ 2 }) PREV:[jmp(L10 [skipFinallyToErrorBlock])] r(2) -> - 3 ret(*|!) L4 + 4 merge(try { 1 if (2 > 3) { return@l } } finally { 2 }|) -> + 3 ret(*|) L4 L4: - NEXT:[] PREV:[ret L4, ret(*|!) L4] + NEXT:[] PREV:[ret L4, ret(*|) L4] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== == t5 == fun t5() { @@ -277,10 +284,11 @@ L8 [start finally]: r(2) -> L9 [finish finally]: 5 jmp(L3 [loop exit point]) NEXT:[read (Unit)] -- 4 jmp(L10) NEXT:[jmp(L11 [skipFinallyToErrorBlock])] PREV:[] +- 4 jmp(L10) NEXT:[merge(if (2 > 3) { break @l }|!) -> ] PREV:[] L7: read (Unit) PREV:[jf(L7|)] L10: + merge(if (2 > 3) { break @l }|!) -> 3 jmp(L11 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] L6 [onExceptionToFinallyBlock]: 6 mark({ 2 }) PREV:[jmp?(L6 [onExceptionToFinallyBlock])] @@ -289,6 +297,7 @@ L6 [onExceptionToFinallyBlock]: L11 [skipFinallyToErrorBlock]: 6 mark({ 2 }) PREV:[jmp(L11 [skipFinallyToErrorBlock])] r(2) -> + 3 merge(try { 1 if (2 > 3) { break @l } } finally { 2 }|) -> 2 jmp(L2 [loop entry point]) NEXT:[r(true) -> ] L3 [loop exit point]: read (Unit) PREV:[jmp(L3 [loop exit point])] @@ -318,12 +327,12 @@ L0: 1 2 mark({ try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } }) mark(try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l while(true) { 1 if (2 > 3) { break @l } } 5 })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l while(true) { 1 if (2 > 3) { break @l } } 5 })] 3 mark({ @l while(true) { 1 if (2 > 3) { break @l } } 5 }) mark(@l while(true) { 1 if (2 > 3) { break @l } }) L3 [loop entry point]: L6 [condition entry point]: - r(true) -> PREV:[mark(@l while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])] + r(true) -> PREV:[mark(@l while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])] mark(while(true) { 1 if (2 > 3) { break @l } }) magic[VALUE_CONSUMER](true|) -> L5 [body entry point]: @@ -334,33 +343,35 @@ L5 [body entry point]: r(3) -> mark(2 > 3) call(2 > 3, compareTo|, ) -> - jf(L7|) NEXT:[read (Unit), mark({ break @l })] + jf(L7|) NEXT:[read (Unit), mark({ break @l })] 5 mark({ break @l }) - jmp(L4 [loop exit point]) NEXT:[read (Unit)] -- 4 jmp(L8) NEXT:[jmp(L3 [loop entry point])] PREV:[] + jmp(L4 [loop exit point]) NEXT:[read (Unit)] +- 4 jmp(L8) NEXT:[merge(if (2 > 3) { break @l }|!) -> ] PREV:[] L7: - read (Unit) PREV:[jf(L7|)] + read (Unit) PREV:[jf(L7|)] L8: - 3 jmp(L3 [loop entry point]) NEXT:[r(true) -> ] + merge(if (2 > 3) { break @l }|!) -> + 3 jmp(L3 [loop entry point]) NEXT:[r(true) -> ] L4 [loop exit point]: - read (Unit) PREV:[jmp(L4 [loop exit point])] - r(5) -> - 2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] + read (Unit) PREV:[jmp(L4 [loop exit point])] + r(5) -> + 2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] L2 [onExceptionToFinallyBlock]: L10 [start finally]: - 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] - r(2) -> + 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + r(2) -> L11 [finish finally]: - 2 jmp(error) NEXT:[] + 2 jmp(error) NEXT:[] L9 [skipFinallyToErrorBlock]: - 3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])] - r(2) -> + 3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])] + r(2) -> + 2 merge(try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 }|) -> L1: - 1 NEXT:[] + 1 NEXT:[] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== == t7 == fun t7() { @@ -380,12 +391,12 @@ L0: 1 2 mark({ try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 } }) mark(try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l while(true) { 1 if (2 > 3) { break @l } } })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l while(true) { 1 if (2 > 3) { break @l } } })] 3 mark({ @l while(true) { 1 if (2 > 3) { break @l } } }) mark(@l while(true) { 1 if (2 > 3) { break @l } }) L3 [loop entry point]: L6 [condition entry point]: - r(true) -> PREV:[mark(@l while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])] + r(true) -> PREV:[mark(@l while(true) { 1 if (2 > 3) { break @l } }), jmp(L3 [loop entry point])] mark(while(true) { 1 if (2 > 3) { break @l } }) magic[VALUE_CONSUMER](true|) -> L5 [body entry point]: @@ -396,32 +407,34 @@ L5 [body entry point]: r(3) -> mark(2 > 3) call(2 > 3, compareTo|, ) -> - jf(L7|) NEXT:[read (Unit), mark({ break @l })] + jf(L7|) NEXT:[read (Unit), mark({ break @l })] 5 mark({ break @l }) - jmp(L4 [loop exit point]) NEXT:[read (Unit)] -- 4 jmp(L8) NEXT:[jmp(L3 [loop entry point])] PREV:[] + jmp(L4 [loop exit point]) NEXT:[read (Unit)] +- 4 jmp(L8) NEXT:[merge(if (2 > 3) { break @l }|!) -> ] PREV:[] L7: - read (Unit) PREV:[jf(L7|)] + read (Unit) PREV:[jf(L7|)] L8: - 3 jmp(L3 [loop entry point]) NEXT:[r(true) -> ] + merge(if (2 > 3) { break @l }|!) -> + 3 jmp(L3 [loop entry point]) NEXT:[r(true) -> ] L4 [loop exit point]: - read (Unit) PREV:[jmp(L4 [loop exit point])] - 2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] + read (Unit) PREV:[jmp(L4 [loop exit point])] + 2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] L2 [onExceptionToFinallyBlock]: L10 [start finally]: - 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] - r(2) -> + 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + r(2) -> L11 [finish finally]: - 2 jmp(error) NEXT:[] + 2 jmp(error) NEXT:[] L9 [skipFinallyToErrorBlock]: - 3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])] - r(2) -> + 3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])] + r(2) -> + 2 merge(try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 }|!) -> L1: - 1 NEXT:[] + 1 NEXT:[] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== == t8 == fun t8(a : Int) { @@ -473,10 +486,11 @@ L8 [start finally]: r(2) -> L9 [finish finally]: 6 jmp(L4 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|) -> ] -- 5 jmp(L10) NEXT:[jmp(L11 [skipFinallyToErrorBlock])] PREV:[] +- 5 jmp(L10) NEXT:[merge(if (2 > 3) { continue @l }|!) -> ] PREV:[] L7: read (Unit) PREV:[jf(L7|)] L10: + merge(if (2 > 3) { continue @l }|!) -> 4 jmp(L11 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] L6 [onExceptionToFinallyBlock]: 7 mark({ 2 }) PREV:[jmp?(L6 [onExceptionToFinallyBlock])] @@ -485,6 +499,7 @@ L6 [onExceptionToFinallyBlock]: L11 [skipFinallyToErrorBlock]: 7 mark({ 2 }) PREV:[jmp(L11 [skipFinallyToErrorBlock])] r(2) -> + 4 merge(try { 1 if (2 > 3) { continue @l } } finally { 2 }|) -> 3 jmp?(L4 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|) -> , read (Unit)] L2: read (Unit) PREV:[jmp?(L2), jmp?(L4 [loop entry point])] @@ -517,7 +532,7 @@ L0: w(a|) 2 mark({ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } }) mark(try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 })] 3 mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 }) mark(@l for (i in 1..a) { 1 if (2 > 3) { continue @l } }) 4 r(1) -> @@ -526,10 +541,10 @@ L0: call(1..a, rangeTo|, ) -> v(i) L4: - jmp?(L3) NEXT:[read (Unit), magic[LOOP_RANGE_ITERATION](1..a|) -> ] + jmp?(L3) NEXT:[read (Unit), magic[LOOP_RANGE_ITERATION](1..a|) -> ] L5 [loop entry point]: L6 [body entry point]: - magic[LOOP_RANGE_ITERATION](1..a|) -> PREV:[jmp?(L3), jmp(L5 [loop entry point]), jmp?(L5 [loop entry point])] + magic[LOOP_RANGE_ITERATION](1..a|) -> PREV:[jmp?(L3), jmp(L5 [loop entry point]), jmp?(L5 [loop entry point])] w(i|) mark(for (i in 1..a) { 1 if (2 > 3) { continue @l } }) 5 mark({ 1 if (2 > 3) { continue @l } }) @@ -539,33 +554,35 @@ L6 [body entry point]: r(3) -> mark(2 > 3) call(2 > 3, compareTo|, ) -> - jf(L7|) NEXT:[read (Unit), mark({ continue @l })] + jf(L7|) NEXT:[read (Unit), mark({ continue @l })] 6 mark({ continue @l }) - jmp(L5 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|) -> ] -- 5 jmp(L8) NEXT:[jmp?(L5 [loop entry point])] PREV:[] + jmp(L5 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|) -> ] +- 5 jmp(L8) NEXT:[merge(if (2 > 3) { continue @l }|!) -> ] PREV:[] L7: - read (Unit) PREV:[jf(L7|)] + read (Unit) PREV:[jf(L7|)] L8: - 4 jmp?(L5 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|) -> , read (Unit)] + merge(if (2 > 3) { continue @l }|!) -> + 4 jmp?(L5 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|) -> , read (Unit)] L3: - read (Unit) PREV:[jmp?(L3), jmp?(L5 [loop entry point])] - 3 r(5) -> - 2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] + read (Unit) PREV:[jmp?(L3), jmp?(L5 [loop entry point])] + 3 r(5) -> + 2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] L2 [onExceptionToFinallyBlock]: L10 [start finally]: - 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] - r(2) -> + 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + r(2) -> L11 [finish finally]: - 2 jmp(error) NEXT:[] + 2 jmp(error) NEXT:[] L9 [skipFinallyToErrorBlock]: - 3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])] - r(2) -> + 3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])] + r(2) -> + 2 merge(try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 }|) -> L1: - 1 NEXT:[] + 1 NEXT:[] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== == t10 == fun t10(a : Int) { @@ -588,7 +605,7 @@ L0: w(a|) 2 mark({ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 } }) mark(try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ 2 }), mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } })] 3 mark({ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } }) mark(@l for (i in 1..a) { 1 if (2 > 3) { continue @l } }) 4 r(1) -> @@ -597,10 +614,10 @@ L0: call(1..a, rangeTo|, ) -> v(i) L4: - jmp?(L3) NEXT:[read (Unit), magic[LOOP_RANGE_ITERATION](1..a|) -> ] + jmp?(L3) NEXT:[read (Unit), magic[LOOP_RANGE_ITERATION](1..a|) -> ] L5 [loop entry point]: L6 [body entry point]: - magic[LOOP_RANGE_ITERATION](1..a|) -> PREV:[jmp?(L3), jmp(L5 [loop entry point]), jmp?(L5 [loop entry point])] + magic[LOOP_RANGE_ITERATION](1..a|) -> PREV:[jmp?(L3), jmp(L5 [loop entry point]), jmp?(L5 [loop entry point])] w(i|) mark(for (i in 1..a) { 1 if (2 > 3) { continue @l } }) 5 mark({ 1 if (2 > 3) { continue @l } }) @@ -610,32 +627,34 @@ L6 [body entry point]: r(3) -> mark(2 > 3) call(2 > 3, compareTo|, ) -> - jf(L7|) NEXT:[read (Unit), mark({ continue @l })] + jf(L7|) NEXT:[read (Unit), mark({ continue @l })] 6 mark({ continue @l }) - jmp(L5 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|) -> ] -- 5 jmp(L8) NEXT:[jmp?(L5 [loop entry point])] PREV:[] + jmp(L5 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|) -> ] +- 5 jmp(L8) NEXT:[merge(if (2 > 3) { continue @l }|!) -> ] PREV:[] L7: - read (Unit) PREV:[jf(L7|)] + read (Unit) PREV:[jf(L7|)] L8: - 4 jmp?(L5 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|) -> , read (Unit)] + merge(if (2 > 3) { continue @l }|!) -> + 4 jmp?(L5 [loop entry point]) NEXT:[magic[LOOP_RANGE_ITERATION](1..a|) -> , read (Unit)] L3: - read (Unit) PREV:[jmp?(L3), jmp?(L5 [loop entry point])] - 2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] + read (Unit) PREV:[jmp?(L3), jmp?(L5 [loop entry point])] + 2 jmp(L9 [skipFinallyToErrorBlock]) NEXT:[mark({ 2 })] L2 [onExceptionToFinallyBlock]: L10 [start finally]: - 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] - r(2) -> + 3 mark({ 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + r(2) -> L11 [finish finally]: - 2 jmp(error) NEXT:[] + 2 jmp(error) NEXT:[] L9 [skipFinallyToErrorBlock]: - 3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])] - r(2) -> + 3 mark({ 2 }) PREV:[jmp(L9 [skipFinallyToErrorBlock])] + r(2) -> + 2 merge(try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 }|!) -> L1: - 1 NEXT:[] + 1 NEXT:[] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== == t11 == fun t11() { @@ -651,31 +670,32 @@ L0: 1 2 mark({ try { return 1 } finally { return 2 } }) mark(try { return 1 } finally { return 2 }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ return 2 }), mark({ return 1 })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ return 2 }), mark({ return 1 })] 3 mark({ return 1 }) r(1) -> L3 [start finally]: 4 mark({ return 2 }) r(2) -> - ret(*|) L1 NEXT:[] + ret(*|) L1 NEXT:[] L4 [finish finally]: -- 3 ret(*|) L1 NEXT:[] PREV:[] -- 2 jmp(L5 [skipFinallyToErrorBlock]) NEXT:[mark({ return 2 })] PREV:[] +- 3 ret(*|) L1 NEXT:[] PREV:[] +- 2 jmp(L5 [skipFinallyToErrorBlock]) NEXT:[mark({ return 2 })] PREV:[] L2 [onExceptionToFinallyBlock]: - 4 mark({ return 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + 4 mark({ return 2 }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] r(2) -> - ret(*|) L1 NEXT:[] -- 2 jmp(error) NEXT:[] PREV:[] + ret(*|) L1 NEXT:[] +- 2 jmp(error) NEXT:[] PREV:[] L5 [skipFinallyToErrorBlock]: -- 4 mark({ return 2 }) PREV:[] -- r(2) -> PREV:[] -- ret(*|) L1 PREV:[] +- 4 mark({ return 2 }) PREV:[] +- r(2) -> PREV:[] +- ret(*|) L1 NEXT:[] PREV:[] +- 2 merge(try { return 1 } finally { return 2 }|!) -> PREV:[] L1: - 1 NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] + 1 NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] error: - PREV:[] + PREV:[] sink: - PREV:[, ] + PREV:[, ] ===================== == t12 == fun t12() : Int { @@ -691,7 +711,7 @@ L0: 1 2 mark({ try { return 1 } finally { doSmth(3) } }) mark(try { return 1 } finally { doSmth(3) }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ return 1 })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ doSmth(3) }), mark({ return 1 })] 3 mark({ return 1 }) r(1) -> L3 [start finally]: @@ -700,25 +720,26 @@ L3 [start finally]: mark(doSmth(3)) call(doSmth(3), doSmth|) -> L4 [finish finally]: - 3 ret(*|) L1 NEXT:[] -- 2 jmp(L5 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[] + 3 ret(*|) L1 NEXT:[] +- 2 jmp(L5 [skipFinallyToErrorBlock]) NEXT:[mark({ doSmth(3) })] PREV:[] L2 [onExceptionToFinallyBlock]: - 4 mark({ doSmth(3) }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + 4 mark({ doSmth(3) }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] r(3) -> mark(doSmth(3)) call(doSmth(3), doSmth|) -> - 2 jmp(error) NEXT:[] + 2 jmp(error) NEXT:[] L5 [skipFinallyToErrorBlock]: -- 4 mark({ doSmth(3) }) PREV:[] -- r(3) -> PREV:[] -- mark(doSmth(3)) PREV:[] -- call(doSmth(3), doSmth|) -> PREV:[] +- 4 mark({ doSmth(3) }) PREV:[] +- r(3) -> PREV:[] +- mark(doSmth(3)) PREV:[] +- call(doSmth(3), doSmth|) -> PREV:[] +- 2 merge(try { return 1 } finally { doSmth(3) }|!) -> PREV:[] L1: - 1 NEXT:[] PREV:[ret(*|) L1] + 1 NEXT:[] PREV:[ret(*|) L1] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== == t13 == fun t13() : Int { diff --git a/compiler/testData/cfg/controlStructures/Finally.values b/compiler/testData/cfg/controlStructures/Finally.values index 52b9de59dd0..28444560382 100644 --- a/compiler/testData/cfg/controlStructures/Finally.values +++ b/compiler/testData/cfg/controlStructures/Finally.values @@ -7,12 +7,12 @@ fun t1() { } } --------------------- -1 : * NEW: r(1) -> -{ 1 } : * COPY -2 : * NEW: r(2) -> -{ 2 } : * COPY -try { 1 } finally { 2 } : * COPY -{ try { 1 } finally { 2 } } : * COPY +1 : * NEW: r(1) -> +{ 1 } : * COPY +2 : * NEW: r(2) -> +{ 2 } : * COPY +try { 1 } finally { 2 } : * NEW: merge(try { 1 } finally { 2 }|) -> +{ try { 1 } finally { 2 } } : * COPY ===================== == t2 == fun t2() { @@ -26,18 +26,18 @@ fun t2() { } } --------------------- -1 : * NEW: r(1) -> -2 : {<: Comparable} NEW: r(2) -> -3 : Int NEW: r(3) -> -2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> -return !: * -{ return } !: * COPY -if (2 > 3) { return } !: * COPY -{ 1 if (2 > 3) { return } } !: * COPY -2 : * NEW: r(2) -> -{ 2 } : * COPY -try { 1 if (2 > 3) { return } } finally { 2 } !: * COPY -{ try { 1 if (2 > 3) { return } } finally { 2 } } !: * COPY +1 : * NEW: r(1) -> +2 : {<: Comparable} NEW: r(2) -> +3 : Int NEW: r(3) -> +2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> +return !: * +{ return } !: * COPY +if (2 > 3) { return } : * NEW: merge(if (2 > 3) { return }|!) -> +{ 1 if (2 > 3) { return } } : * COPY +2 : * NEW: r(2) -> +{ 2 } : * COPY +try { 1 if (2 > 3) { return } } finally { 2 } : * NEW: merge(try { 1 if (2 > 3) { return } } finally { 2 }|) -> +{ try { 1 if (2 > 3) { return } } finally { 2 } } : * COPY ===================== == t3 == fun t3() { @@ -53,14 +53,14 @@ fun t3() { } } --------------------- -1 : * NEW: r(1) -> -{ () -> if (2 > 3) { return@l } } : * NEW: r({ () -> if (2 > 3) { return@l } }) -> -@l{ () -> if (2 > 3) { return@l } } : * COPY -{ 1 @l{ () -> if (2 > 3) { return@l } } } : * COPY -2 : * NEW: r(2) -> -{ 2 } : * COPY -try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 } : * COPY -{ try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 } } : * COPY +1 : * NEW: r(1) -> +{ () -> if (2 > 3) { return@l } } : * NEW: r({ () -> if (2 > 3) { return@l } }) -> +@l{ () -> if (2 > 3) { return@l } } : * COPY +{ 1 @l{ () -> if (2 > 3) { return@l } } } : * COPY +2 : * NEW: r(2) -> +{ 2 } : * COPY +try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 } : * NEW: merge(try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 }|) -> +{ try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 } } : * COPY ===================== == anonymous_0 == { () -> @@ -69,13 +69,13 @@ try { 1 @l{ () -> if (2 > 3) { return@l } } } finally { 2 } : * COPY } } --------------------- -2 : {<: Comparable} NEW: r(2) -> -3 : Int NEW: r(3) -> -2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> -return@l !: * -{ return@l } !: * COPY -if (2 > 3) { return@l } !: * COPY -if (2 > 3) { return@l } !: * COPY +2 : {<: Comparable} NEW: r(2) -> +3 : Int NEW: r(3) -> +2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> +return@l !: * +{ return@l } !: * COPY +if (2 > 3) { return@l } : Unit NEW: merge(if (2 > 3) { return@l }|!) -> +if (2 > 3) { return@l } : Unit COPY ===================== == t4 == fun t4() { @@ -107,18 +107,18 @@ fun t4() { } } --------------------- -1 : * NEW: r(1) -> -2 : {<: Comparable} NEW: r(2) -> -3 : Int NEW: r(3) -> -2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> -return@l !: * -{ return@l } !: * COPY -if (2 > 3) { return@l } !: * COPY -{ 1 if (2 > 3) { return@l } } !: * COPY -2 : * NEW: r(2) -> -{ 2 } : * COPY -try { 1 if (2 > 3) { return@l } } finally { 2 } !: * COPY -try { 1 if (2 > 3) { return@l } } finally { 2 } !: * COPY +1 : * NEW: r(1) -> +2 : {<: Comparable} NEW: r(2) -> +3 : Int NEW: r(3) -> +2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> +return@l !: * +{ return@l } !: * COPY +if (2 > 3) { return@l } : Unit NEW: merge(if (2 > 3) { return@l }|!) -> +{ 1 if (2 > 3) { return@l } } : Unit COPY +2 : * NEW: r(2) -> +{ 2 } : * COPY +try { 1 if (2 > 3) { return@l } } finally { 2 } : Unit NEW: merge(try { 1 if (2 > 3) { return@l } } finally { 2 }|) -> +try { 1 if (2 > 3) { return@l } } finally { 2 } : Unit COPY ===================== == t5 == fun t5() { @@ -134,23 +134,23 @@ fun t5() { } } --------------------- - : * NEW: magic[VALUE_CONSUMER](true|) -> -true : Boolean NEW: r(true) -> -1 : * NEW: r(1) -> -2 : {<: Comparable} NEW: r(2) -> -3 : Int NEW: r(3) -> -2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> -break @l !: * -{ break @l } !: * COPY -if (2 > 3) { break @l } !: * COPY -{ 1 if (2 > 3) { break @l } } !: * COPY -2 : * NEW: r(2) -> -{ 2 } : * COPY -try { 1 if (2 > 3) { break @l } } finally { 2 } !: * COPY -{ try { 1 if (2 > 3) { break @l } } finally { 2 } } !: * COPY -while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } !: * -@l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } !: * COPY -{ @l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } } !: * COPY + : * NEW: magic[VALUE_CONSUMER](true|) -> +true : Boolean NEW: r(true) -> +1 : * NEW: r(1) -> +2 : {<: Comparable} NEW: r(2) -> +3 : Int NEW: r(3) -> +2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> +break @l !: * +{ break @l } !: * COPY +if (2 > 3) { break @l } : * NEW: merge(if (2 > 3) { break @l }|!) -> +{ 1 if (2 > 3) { break @l } } : * COPY +2 : * NEW: r(2) -> +{ 2 } : * COPY +try { 1 if (2 > 3) { break @l } } finally { 2 } : * NEW: merge(try { 1 if (2 > 3) { break @l } } finally { 2 }|) -> +{ try { 1 if (2 > 3) { break @l } } finally { 2 } } : * COPY +while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } !: * +@l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } !: * COPY +{ @l while(true) { try { 1 if (2 > 3) { break @l } } finally { 2 } } } !: * COPY ===================== == t6 == fun t6() { @@ -167,24 +167,24 @@ fun t6() { } } --------------------- - : * NEW: magic[VALUE_CONSUMER](true|) -> -true : Boolean NEW: r(true) -> -1 : * NEW: r(1) -> -2 : {<: Comparable} NEW: r(2) -> -3 : Int NEW: r(3) -> -2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> -break @l !: * -{ break @l } !: * COPY -if (2 > 3) { break @l } !: * COPY -{ 1 if (2 > 3) { break @l } } !: * COPY -while(true) { 1 if (2 > 3) { break @l } } !: * -@l while(true) { 1 if (2 > 3) { break @l } } !: * COPY -5 : * NEW: r(5) -> -{ @l while(true) { 1 if (2 > 3) { break @l } } 5 } : * COPY -2 : * NEW: r(2) -> -{ 2 } : * COPY -try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } : * COPY -{ try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } } : * COPY + : * NEW: magic[VALUE_CONSUMER](true|) -> +true : Boolean NEW: r(true) -> +1 : * NEW: r(1) -> +2 : {<: Comparable} NEW: r(2) -> +3 : Int NEW: r(3) -> +2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> +break @l !: * +{ break @l } !: * COPY +if (2 > 3) { break @l } : * NEW: merge(if (2 > 3) { break @l }|!) -> +{ 1 if (2 > 3) { break @l } } : * COPY +while(true) { 1 if (2 > 3) { break @l } } !: * +@l while(true) { 1 if (2 > 3) { break @l } } !: * COPY +5 : * NEW: r(5) -> +{ @l while(true) { 1 if (2 > 3) { break @l } } 5 } : * COPY +2 : * NEW: r(2) -> +{ 2 } : * COPY +try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } : * NEW: merge(try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 }|) -> +{ try { @l while(true) { 1 if (2 > 3) { break @l } } 5 } finally { 2 } } : * COPY ===================== == t7 == fun t7() { @@ -200,23 +200,23 @@ fun t7() { } } --------------------- - : * NEW: magic[VALUE_CONSUMER](true|) -> -true : Boolean NEW: r(true) -> -1 : * NEW: r(1) -> -2 : {<: Comparable} NEW: r(2) -> -3 : Int NEW: r(3) -> -2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> -break @l !: * -{ break @l } !: * COPY -if (2 > 3) { break @l } !: * COPY -{ 1 if (2 > 3) { break @l } } !: * COPY -while(true) { 1 if (2 > 3) { break @l } } !: * -@l while(true) { 1 if (2 > 3) { break @l } } !: * COPY -{ @l while(true) { 1 if (2 > 3) { break @l } } } !: * COPY -2 : * NEW: r(2) -> -{ 2 } : * COPY -try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 } !: * COPY -{ try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 } } !: * COPY + : * NEW: magic[VALUE_CONSUMER](true|) -> +true : Boolean NEW: r(true) -> +1 : * NEW: r(1) -> +2 : {<: Comparable} NEW: r(2) -> +3 : Int NEW: r(3) -> +2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> +break @l !: * +{ break @l } !: * COPY +if (2 > 3) { break @l } : * NEW: merge(if (2 > 3) { break @l }|!) -> +{ 1 if (2 > 3) { break @l } } : * COPY +while(true) { 1 if (2 > 3) { break @l } } !: * +@l while(true) { 1 if (2 > 3) { break @l } } !: * COPY +{ @l while(true) { 1 if (2 > 3) { break @l } } } !: * COPY +2 : * NEW: r(2) -> +{ 2 } : * COPY +try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 } : * NEW: merge(try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 }|!) -> +{ try { @l while(true) { 1 if (2 > 3) { break @l } } } finally { 2 } } : * COPY ===================== == t8 == fun t8(a : Int) { @@ -232,26 +232,26 @@ fun t8(a : Int) { } } --------------------- - : Int NEW: magic[FAKE_INITIALIZER](a : Int) -> - : Int NEW: magic[LOOP_RANGE_ITERATION](1..a|) -> -1 : Int NEW: r(1) -> -a : Int NEW: r(a) -> -1..a : {<: Iterable} NEW: call(1..a, rangeTo|, ) -> -1 : * NEW: r(1) -> -2 : {<: Comparable} NEW: r(2) -> -3 : Int NEW: r(3) -> -2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> -continue @l !: * -{ continue @l } !: * COPY -if (2 > 3) { continue @l } !: * COPY -{ 1 if (2 > 3) { continue @l } } !: * COPY -2 : * NEW: r(2) -> -{ 2 } : * COPY -try { 1 if (2 > 3) { continue @l } } finally { 2 } !: * COPY -{ try { 1 if (2 > 3) { continue @l } } finally { 2 } } !: * COPY -for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } !: * -@l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } !: * COPY -{ @l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } } !: * COPY + : Int NEW: magic[FAKE_INITIALIZER](a : Int) -> + : Int NEW: magic[LOOP_RANGE_ITERATION](1..a|) -> +1 : Int NEW: r(1) -> +a : Int NEW: r(a) -> +1..a : {<: Iterable} NEW: call(1..a, rangeTo|, ) -> +1 : * NEW: r(1) -> +2 : {<: Comparable} NEW: r(2) -> +3 : Int NEW: r(3) -> +2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> +continue @l !: * +{ continue @l } !: * COPY +if (2 > 3) { continue @l } : * NEW: merge(if (2 > 3) { continue @l }|!) -> +{ 1 if (2 > 3) { continue @l } } : * COPY +2 : * NEW: r(2) -> +{ 2 } : * COPY +try { 1 if (2 > 3) { continue @l } } finally { 2 } : * NEW: merge(try { 1 if (2 > 3) { continue @l } } finally { 2 }|) -> +{ try { 1 if (2 > 3) { continue @l } } finally { 2 } } : * COPY +for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } !: * +@l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } !: * COPY +{ @l for (i in 1..a) { try { 1 if (2 > 3) { continue @l } } finally { 2 } } } !: * COPY ===================== == t9 == fun t9(a : Int) { @@ -268,27 +268,27 @@ fun t9(a : Int) { } } --------------------- - : Int NEW: magic[FAKE_INITIALIZER](a : Int) -> - : Int NEW: magic[LOOP_RANGE_ITERATION](1..a|) -> -1 : Int NEW: r(1) -> -a : Int NEW: r(a) -> -1..a : {<: Iterable} NEW: call(1..a, rangeTo|, ) -> -1 : * NEW: r(1) -> -2 : {<: Comparable} NEW: r(2) -> -3 : Int NEW: r(3) -> -2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> -continue @l !: * -{ continue @l } !: * COPY -if (2 > 3) { continue @l } !: * COPY -{ 1 if (2 > 3) { continue @l } } !: * COPY -for (i in 1..a) { 1 if (2 > 3) { continue @l } } !: * -@l for (i in 1..a) { 1 if (2 > 3) { continue @l } } !: * COPY -5 : * NEW: r(5) -> -{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } : * COPY -2 : * NEW: r(2) -> -{ 2 } : * COPY -try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } : * COPY -{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } } : * COPY + : Int NEW: magic[FAKE_INITIALIZER](a : Int) -> + : Int NEW: magic[LOOP_RANGE_ITERATION](1..a|) -> +1 : Int NEW: r(1) -> +a : Int NEW: r(a) -> +1..a : {<: Iterable} NEW: call(1..a, rangeTo|, ) -> +1 : * NEW: r(1) -> +2 : {<: Comparable} NEW: r(2) -> +3 : Int NEW: r(3) -> +2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> +continue @l !: * +{ continue @l } !: * COPY +if (2 > 3) { continue @l } : * NEW: merge(if (2 > 3) { continue @l }|!) -> +{ 1 if (2 > 3) { continue @l } } : * COPY +for (i in 1..a) { 1 if (2 > 3) { continue @l } } !: * +@l for (i in 1..a) { 1 if (2 > 3) { continue @l } } !: * COPY +5 : * NEW: r(5) -> +{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } : * COPY +2 : * NEW: r(2) -> +{ 2 } : * COPY +try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } : * NEW: merge(try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 }|) -> +{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } 5 } finally { 2 } } : * COPY ===================== == t10 == fun t10(a : Int) { @@ -304,26 +304,26 @@ fun t10(a : Int) { } } --------------------- - : Int NEW: magic[FAKE_INITIALIZER](a : Int) -> - : Int NEW: magic[LOOP_RANGE_ITERATION](1..a|) -> -1 : Int NEW: r(1) -> -a : Int NEW: r(a) -> -1..a : {<: Iterable} NEW: call(1..a, rangeTo|, ) -> -1 : * NEW: r(1) -> -2 : {<: Comparable} NEW: r(2) -> -3 : Int NEW: r(3) -> -2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> -continue @l !: * -{ continue @l } !: * COPY -if (2 > 3) { continue @l } !: * COPY -{ 1 if (2 > 3) { continue @l } } !: * COPY -for (i in 1..a) { 1 if (2 > 3) { continue @l } } !: * -@l for (i in 1..a) { 1 if (2 > 3) { continue @l } } !: * COPY -{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } !: * COPY -2 : * NEW: r(2) -> -{ 2 } : * COPY -try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 } !: * COPY -{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 } } !: * COPY + : Int NEW: magic[FAKE_INITIALIZER](a : Int) -> + : Int NEW: magic[LOOP_RANGE_ITERATION](1..a|) -> +1 : Int NEW: r(1) -> +a : Int NEW: r(a) -> +1..a : {<: Iterable} NEW: call(1..a, rangeTo|, ) -> +1 : * NEW: r(1) -> +2 : {<: Comparable} NEW: r(2) -> +3 : Int NEW: r(3) -> +2 > 3 : Boolean NEW: call(2 > 3, compareTo|, ) -> +continue @l !: * +{ continue @l } !: * COPY +if (2 > 3) { continue @l } : * NEW: merge(if (2 > 3) { continue @l }|!) -> +{ 1 if (2 > 3) { continue @l } } : * COPY +for (i in 1..a) { 1 if (2 > 3) { continue @l } } !: * +@l for (i in 1..a) { 1 if (2 > 3) { continue @l } } !: * COPY +{ @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } !: * COPY +2 : * NEW: r(2) -> +{ 2 } : * COPY +try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 } : * NEW: merge(try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 }|!) -> +{ try { @l for (i in 1..a) { 1 if (2 > 3) { continue @l } } } finally { 2 } } : * COPY ===================== == t11 == fun t11() { @@ -335,14 +335,14 @@ fun t11() { } } --------------------- -1 : Unit NEW: r(1) -> -return 1 !: * -{ return 1 } !: * COPY -2 : Unit NEW: r(2) -> -return 2 !: * -{ return 2 } !: * COPY -try { return 1 } finally { return 2 } !: * COPY -{ try { return 1 } finally { return 2 } } !: * COPY +1 : Unit NEW: r(1) -> +return 1 !: * +{ return 1 } !: * COPY +2 : Unit NEW: r(2) -> +return 2 !: * +{ return 2 } !: * COPY +try { return 1 } finally { return 2 } : * NEW: merge(try { return 1 } finally { return 2 }|!) -> +{ try { return 1 } finally { return 2 } } : * COPY ===================== == t12 == fun t12() : Int { @@ -354,14 +354,14 @@ fun t12() : Int { } } --------------------- -1 : Int NEW: r(1) -> -return 1 !: * -{ return 1 } !: * COPY -3 : Int NEW: r(3) -> -doSmth(3) : * NEW: call(doSmth(3), doSmth|) -> -{ doSmth(3) } : * COPY -try { return 1 } finally { doSmth(3) } !: * COPY -{ try { return 1 } finally { doSmth(3) } } !: * COPY +1 : Int NEW: r(1) -> +return 1 !: * +{ return 1 } !: * COPY +3 : Int NEW: r(3) -> +doSmth(3) : * NEW: call(doSmth(3), doSmth|) -> +{ doSmth(3) } : * COPY +try { return 1 } finally { doSmth(3) } : * NEW: merge(try { return 1 } finally { doSmth(3) }|!) -> +{ try { return 1 } finally { doSmth(3) } } : * COPY ===================== == t13 == fun t13() : Int { diff --git a/compiler/testData/cfg/controlStructures/FinallyTestCopy.instructions b/compiler/testData/cfg/controlStructures/FinallyTestCopy.instructions index ac3d418a18f..71ec497f556 100644 --- a/compiler/testData/cfg/controlStructures/FinallyTestCopy.instructions +++ b/compiler/testData/cfg/controlStructures/FinallyTestCopy.instructions @@ -304,44 +304,47 @@ L0: w(list|) 2 mark({ try { doSmth() } finally { if(list != null) { } } }) mark(try { doSmth() } finally { if(list != null) { } }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ if(list != null) { } }), mark({ doSmth() })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ if(list != null) { } }), mark({ doSmth() })] 3 mark({ doSmth() }) mark(doSmth()) call(doSmth(), doSmth) -> - 2 jmp(L3 [skipFinallyToErrorBlock]) NEXT:[mark({ if(list != null) { } })] + 2 jmp(L3 [skipFinallyToErrorBlock]) NEXT:[mark({ if(list != null) { } })] L2 [onExceptionToFinallyBlock]: L4 [start finally]: - 3 mark({ if(list != null) { } }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + 3 mark({ if(list != null) { } }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] mark(if(list != null) { }) r(list) -> r(null) -> mark(list != null) call(list != null, equals|, ) -> - jf(L5|) NEXT:[read (Unit), mark({ })] + jf(L5|) NEXT:[read (Unit), mark({ })] 4 mark({ }) read (Unit) - 3 jmp(L6) NEXT:[jmp(error)] + 3 jmp(L6) NEXT:[merge(if(list != null) { }|!) -> ] L5: - read (Unit) PREV:[jf(L5|)] + read (Unit) PREV:[jf(L5|)] L6: + merge(if(list != null) { }|!) -> PREV:[jmp(L6), read (Unit)] L7 [finish finally]: - 2 jmp(error) NEXT:[] PREV:[jmp(L6), read (Unit)] + 2 jmp(error) NEXT:[] L3 [skipFinallyToErrorBlock]: - 3 mark({ if(list != null) { } }) PREV:[jmp(L3 [skipFinallyToErrorBlock])] + 3 mark({ if(list != null) { } }) PREV:[jmp(L3 [skipFinallyToErrorBlock])] mark(if(list != null) { }) r(list) -> r(null) -> mark(list != null) call(list != null, equals|, ) -> - jf(copy L5|) NEXT:[read (Unit), mark({ })] + jf(copy L5|) NEXT:[read (Unit), mark({ })] 4 mark({ }) read (Unit) - 3 jmp(copy L6) NEXT:[] - read (Unit) PREV:[jf(copy L5|)] + 3 jmp(copy L6) NEXT:[merge(if(list != null) { }|!) -> ] + read (Unit) PREV:[jf(copy L5|)] + merge(if(list != null) { }|!) -> PREV:[jmp(copy L6), read (Unit)] + 2 merge(try { doSmth() } finally { if(list != null) { } }|) -> L1: - 1 NEXT:[] PREV:[jmp(copy L6), read (Unit)] + 1 NEXT:[] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== diff --git a/compiler/testData/cfg/controlStructures/FinallyTestCopy.values b/compiler/testData/cfg/controlStructures/FinallyTestCopy.values index 710b3c5e900..aa2bdae0ece 100644 --- a/compiler/testData/cfg/controlStructures/FinallyTestCopy.values +++ b/compiler/testData/cfg/controlStructures/FinallyTestCopy.values @@ -123,15 +123,15 @@ fun doTestCopy4(list: List?) : Int { } } --------------------- - : {<: List?} NEW: magic[FAKE_INITIALIZER](list: List?) -> -doSmth() : * NEW: call(doSmth(), doSmth) -> -{ doSmth() } : * COPY -list : * NEW: r(list) -> -null : * NEW: r(null) -> -list != null : Boolean NEW: call(list != null, equals|, ) -> -{ } !: * -if(list != null) { } !: * COPY -{ if(list != null) { } } !: * COPY -try { doSmth() } finally { if(list != null) { } } : * COPY -{ try { doSmth() } finally { if(list != null) { } } } : * COPY + : {<: List?} NEW: magic[FAKE_INITIALIZER](list: List?) -> +doSmth() : * NEW: call(doSmth(), doSmth) -> +{ doSmth() } : * COPY +list : * NEW: r(list) -> +null : * NEW: r(null) -> +list != null : Boolean NEW: call(list != null, equals|, ) -> +{ } !: * +if(list != null) { } : * NEW: merge(if(list != null) { }|!) -> +{ if(list != null) { } } : * COPY +try { doSmth() } finally { if(list != null) { } } : * NEW: merge(try { doSmth() } finally { if(list != null) { } }|) -> +{ try { doSmth() } finally { if(list != null) { } } } : * COPY ===================== diff --git a/compiler/testData/cfg/controlStructures/If.instructions b/compiler/testData/cfg/controlStructures/If.instructions index 4da8eeabc17..d3b02ff5133 100644 --- a/compiler/testData/cfg/controlStructures/If.instructions +++ b/compiler/testData/cfg/controlStructures/If.instructions @@ -30,32 +30,33 @@ L0: mark("s") r("s") -> w(u|) - 2 jmp(L3) NEXT:[r(u) -> ] + 2 jmp(L3) NEXT:[merge(if (b) { u = "s" }|!) -> ] L2: read (Unit) PREV:[jf(L2|)] L3: - r(u) -> PREV:[jmp(L3), read (Unit)] + merge(if (b) { u = "s" }|!) -> PREV:[jmp(L3), read (Unit)] + r(u) -> mark(doSmth(u)) - call(doSmth(u), doSmth|) -> + 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" })] + 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" }|!, !) -> ] + r("s") -> + w(r|) + 2 jmp(L5) NEXT:[merge(if (b) { r = "s" } else { r = "t" }|!, !) -> ] L4: - 3 mark({ r = "t" }) PREV:[jf(L4|)] + 3 mark({ r = "t" }) PREV:[jf(L4|)] mark("t") - r("t") -> - w(r|) + r("t") -> + w(r|) L5: - 2 merge(if (b) { r = "s" } else { r = "t" }|!, !) -> PREV:[jmp(L5), w(r|)] - r(r) -> + 2 merge(if (b) { r = "s" } else { r = "t" }|!, !) -> PREV:[jmp(L5), w(r|)] + r(r) -> mark(doSmth(r)) - call(doSmth(r), doSmth|) -> + call(doSmth(r), doSmth|) -> L1: 1 NEXT:[] error: @@ -89,26 +90,28 @@ L0: jf(L2|) NEXT:[read (Unit), mark({ return; })] 3 mark({ return; }) ret L1 NEXT:[] -- 2 jmp(L3) NEXT:[r(i) -> ] PREV:[] +- 2 jmp(L3) NEXT:[merge(if (b) { return; }|!) -> ] PREV:[] L2: read (Unit) PREV:[jf(L2|)] L3: - r(i) -> + merge(if (b) { return; }|!) -> + r(i) -> mark(doSmth(i)) - call(doSmth(i), doSmth|) -> + 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; })] + r(i) -> + magic[IS](i is Int|) -> + jf(L4|) NEXT:[read (Unit), mark({ return; })] 3 mark({ return; }) ret L1 NEXT:[] -- 2 jmp(L5) NEXT:[] PREV:[] +- 2 jmp(L5) NEXT:[merge(if (i is Int) { return; }|!) -> ] PREV:[] L4: - read (Unit) PREV:[jf(L4|)] -L1: + read (Unit) PREV:[jf(L4|)] L5: - 1 NEXT:[] PREV:[ret L1, ret L1, read (Unit)] + merge(if (i is Int) { return; }|!) -> +L1: + 1 NEXT:[] PREV:[ret L1, ret L1, merge(if (i is Int) { return; }|!) -> ] error: PREV:[] sink: diff --git a/compiler/testData/cfg/controlStructures/If.values b/compiler/testData/cfg/controlStructures/If.values index e1c083d49fb..6d6ba9735f7 100644 --- a/compiler/testData/cfg/controlStructures/If.values +++ b/compiler/testData/cfg/controlStructures/If.values @@ -21,20 +21,20 @@ b "s" : String NEW: r("s") -> u = "s" !: * { u = "s" } !: * COPY -if (b) { u = "s" } !: * COPY -u : String NEW: r(u) -> -doSmth(u) : * NEW: call(doSmth(u), doSmth|) -> -b : Boolean NEW: r(b) -> -"s" : String NEW: r("s") -> -r = "s" !: * -{ r = "s" } !: * COPY -"t" : String NEW: r("t") -> -r = "t" !: * -{ r = "t" } !: * COPY -if (b) { r = "s" } else { r = "t" } : * NEW: merge(if (b) { r = "s" } else { r = "t" }|!, !) -> -r : String NEW: r(r) -> -doSmth(r) : * NEW: call(doSmth(r), doSmth|) -> -{ var u: String if (b) { u = "s" } doSmth(u) var r: String if (b) { r = "s" } else { r = "t" } doSmth(r) } : * COPY +if (b) { u = "s" } : * NEW: merge(if (b) { u = "s" }|!) -> +u : String NEW: r(u) -> +doSmth(u) : * NEW: call(doSmth(u), doSmth|) -> +b : Boolean NEW: r(b) -> +"s" : String NEW: r("s") -> +r = "s" !: * +{ r = "s" } !: * COPY +"t" : String NEW: r("t") -> +r = "t" !: * +{ r = "t" } !: * COPY +if (b) { r = "s" } else { r = "t" } : * NEW: merge(if (b) { r = "s" } else { r = "t" }|!, !) -> +r : String NEW: r(r) -> +doSmth(r) : * NEW: call(doSmth(r), doSmth|) -> +{ var u: String if (b) { u = "s" } doSmth(u) var r: String if (b) { r = "s" } else { r = "t" } doSmth(r) } : * COPY ===================== == t2 == fun t2(b: Boolean) { @@ -48,20 +48,20 @@ fun t2(b: Boolean) { } } --------------------- - : Boolean NEW: magic[FAKE_INITIALIZER](b: Boolean) -> -3 : Int NEW: r(3) -> -b : Boolean NEW: r(b) -> -return !: * -{ return; } !: * COPY -if (b) { return; } !: * COPY -i : String NEW: r(i) -> -doSmth(i) : * NEW: call(doSmth(i), doSmth|) -> -i : * NEW: r(i) -> -i is Int : Boolean NEW: magic[IS](i is Int|) -> -return !: * -{ return; } !: * COPY -if (i is Int) { return; } !: * COPY -{ val i = 3 if (b) { return; } doSmth(i) if (i is Int) { return; } } !: * COPY + : Boolean NEW: magic[FAKE_INITIALIZER](b: Boolean) -> +3 : Int NEW: r(3) -> +b : Boolean NEW: r(b) -> +return !: * +{ return; } !: * COPY +if (b) { return; } : * NEW: merge(if (b) { return; }|!) -> +i : String NEW: r(i) -> +doSmth(i) : * NEW: call(doSmth(i), doSmth|) -> +i : * NEW: r(i) -> +i is Int : Boolean NEW: magic[IS](i is Int|) -> +return !: * +{ return; } !: * COPY +if (i is Int) { return; } : * NEW: merge(if (i is Int) { return; }|!) -> +{ val i = 3 if (b) { return; } doSmth(i) if (i is Int) { return; } } : * COPY ===================== == doSmth == fun doSmth(s: String) {} diff --git a/compiler/testData/cfg/controlStructures/returnsInWhen.instructions b/compiler/testData/cfg/controlStructures/returnsInWhen.instructions index 7c29d869c8d..fefa40ce995 100644 --- a/compiler/testData/cfg/controlStructures/returnsInWhen.instructions +++ b/compiler/testData/cfg/controlStructures/returnsInWhen.instructions @@ -16,17 +16,18 @@ L0: mark(is Int -> return a) mark(is Int) magic[IS](is Int|) -> - jmp?(L4|) NEXT:[, r(a) -> ] + jmp?(L4|) NEXT:[merge(when(a) { is Int -> return a }|!) -> , r(a) -> ] L3: r(a) -> - ret(*|) L1 NEXT:[] -- jmp(L2) PREV:[] -L1: + ret(*|) L1 NEXT:[] +- jmp(L2) PREV:[] L2: L4: - 1 NEXT:[] PREV:[jmp?(L4|), ret(*|) L1] + merge(when(a) { is Int -> return a }|!) -> PREV:[jmp?(L4|)] +L1: + 1 NEXT:[] PREV:[ret(*|) L1, merge(when(a) { is Int -> return a }|!) -> ] error: - PREV:[] + PREV:[] sink: - PREV:[, ] + PREV:[, ] ===================== diff --git a/compiler/testData/cfg/controlStructures/returnsInWhen.values b/compiler/testData/cfg/controlStructures/returnsInWhen.values index 5d175b30015..309fef86bf1 100644 --- a/compiler/testData/cfg/controlStructures/returnsInWhen.values +++ b/compiler/testData/cfg/controlStructures/returnsInWhen.values @@ -5,11 +5,11 @@ fun illegalWhenBlock(a: Any): Any { } } --------------------- - : {<: Any} NEW: magic[FAKE_INITIALIZER](a: Any) -> -a : * NEW: r(a) -> -is Int : * NEW: magic[IS](is Int|) -> -a : {<: Any} NEW: r(a) -> -return a !: * -when(a) { is Int -> return a } !: * COPY -{ when(a) { is Int -> return a } } !: * COPY + : {<: Any} NEW: magic[FAKE_INITIALIZER](a: Any) -> +a : * NEW: r(a) -> +is Int : * NEW: magic[IS](is Int|) -> +a : {<: Any} NEW: r(a) -> +return a !: * +when(a) { is Int -> return a } : * NEW: merge(when(a) { is Int -> return a }|!) -> +{ when(a) { is Int -> return a } } : * COPY ===================== diff --git a/compiler/testData/cfg/conventions/equals.instructions b/compiler/testData/cfg/conventions/equals.instructions index f0eaabc2a29..31762daf553 100644 --- a/compiler/testData/cfg/conventions/equals.instructions +++ b/compiler/testData/cfg/conventions/equals.instructions @@ -21,12 +21,13 @@ L0: jf(L2|) NEXT:[read (Unit), mark({ })] 3 mark({ }) read (Unit) - 2 jmp(L3) NEXT:[] + 2 jmp(L3) NEXT:[merge(if (a == b) { }|!) -> ] L2: read (Unit) PREV:[jf(L2|)] -L1: L3: - 1 NEXT:[] PREV:[jmp(L3), read (Unit)] + merge(if (a == b) { }|!) -> PREV:[jmp(L3), read (Unit)] +L1: + 1 NEXT:[] error: PREV:[] sink: diff --git a/compiler/testData/cfg/conventions/equals.values b/compiler/testData/cfg/conventions/equals.values index 4445c376026..de40507fc65 100644 --- a/compiler/testData/cfg/conventions/equals.values +++ b/compiler/testData/cfg/conventions/equals.values @@ -10,6 +10,6 @@ a : OR{{<: Any}, {<: Any}} NEW: r(a) -> b : * NEW: r(b) -> a == b : Boolean NEW: call(a == b, equals|, ) -> { } !: * -if (a == b) { } !: * COPY -{ if (a == b) { } } !: * COPY +if (a == b) { } : * NEW: merge(if (a == b) { }|!) -> +{ if (a == b) { } } : * COPY ===================== diff --git a/compiler/testData/cfg/conventions/notEqual.instructions b/compiler/testData/cfg/conventions/notEqual.instructions index a7ca06a80d1..13a4e1ac251 100644 --- a/compiler/testData/cfg/conventions/notEqual.instructions +++ b/compiler/testData/cfg/conventions/notEqual.instructions @@ -20,12 +20,13 @@ L0: jf(L2|) NEXT:[read (Unit), mark({})] 3 mark({}) read (Unit) - 2 jmp(L3) NEXT:[] + 2 jmp(L3) NEXT:[merge(if (a != b) {}|!) -> ] L2: read (Unit) PREV:[jf(L2|)] -L1: L3: - 1 NEXT:[] PREV:[jmp(L3), read (Unit)] + merge(if (a != b) {}|!) -> PREV:[jmp(L3), read (Unit)] +L1: + 1 NEXT:[] error: PREV:[] sink: diff --git a/compiler/testData/cfg/conventions/notEqual.values b/compiler/testData/cfg/conventions/notEqual.values index a563c288b74..5f7d31efe10 100644 --- a/compiler/testData/cfg/conventions/notEqual.values +++ b/compiler/testData/cfg/conventions/notEqual.values @@ -9,6 +9,6 @@ a : OR{{<: Any}, {<: Any}} NEW: r(a) -> b : * NEW: r(b) -> a != b : Boolean NEW: call(a != b, equals|, ) -> {} !: * -if (a != b) {} !: * COPY -{ if (a != b) {} } !: * COPY +if (a != b) {} : * NEW: merge(if (a != b) {}|!) -> +{ if (a != b) {} } : * COPY ===================== diff --git a/compiler/testData/cfg/expressions/LazyBooleans.instructions b/compiler/testData/cfg/expressions/LazyBooleans.instructions index 0053b9b9f25..07e08b4c2d0 100644 --- a/compiler/testData/cfg/expressions/LazyBooleans.instructions +++ b/compiler/testData/cfg/expressions/LazyBooleans.instructions @@ -70,20 +70,22 @@ L9: r(a) -> jf(L10|) NEXT:[read (Unit), r(11) -> ] r(11) -> - jmp(L11) NEXT:[r(12) -> ] + jmp(L11) NEXT:[merge(if (a) 11|) -> ] L10: read (Unit) PREV:[jf(L10|)] L11: - r(12) -> PREV:[jmp(L11), read (Unit)] + 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)] + r(a) -> + jf(L12|) NEXT:[r(13) -> , read (Unit)] read (Unit) - jmp(L13) NEXT:[r(14) -> ] + jmp(L13) NEXT:[merge(if (a) else 13|) -> ] L12: - r(13) -> PREV:[jf(L12|)] + r(13) -> PREV:[jf(L12|)] L13: - r(14) -> PREV:[jmp(L13), r(13) -> ] + merge(if (a) else 13|) -> PREV:[jmp(L13), r(13) -> ] + r(14) -> L1: 1 NEXT:[] error: diff --git a/compiler/testData/cfg/expressions/LazyBooleans.values b/compiler/testData/cfg/expressions/LazyBooleans.values index 77878b6a1f7..bd37944cba0 100644 --- a/compiler/testData/cfg/expressions/LazyBooleans.values +++ b/compiler/testData/cfg/expressions/LazyBooleans.values @@ -42,11 +42,11 @@ if (a || b) 8 else 9 10 : * NEW: r(10) -> a : Boolean NEW: r(a) -> 11 : * NEW: r(11) -> -if (a) 11 : * COPY -12 : * NEW: r(12) -> -a : Boolean NEW: r(a) -> -13 : * NEW: r(13) -> -if (a) else 13 : * COPY -14 : * NEW: r(14) -> -{ 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 } : * COPY +if (a) 11 : * NEW: merge(if (a) 11|) -> +12 : * NEW: r(12) -> +a : Boolean NEW: r(a) -> +13 : * NEW: r(13) -> +if (a) else 13 : * NEW: merge(if (a) else 13|) -> +14 : * NEW: r(14) -> +{ 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 } : * COPY ===================== diff --git a/compiler/testData/cfg/tailCalls/finally.instructions b/compiler/testData/cfg/tailCalls/finally.instructions index 71fae693ed3..7f81127342d 100644 --- a/compiler/testData/cfg/tailCalls/finally.instructions +++ b/compiler/testData/cfg/tailCalls/finally.instructions @@ -11,25 +11,26 @@ L0: 1 2 mark({ try { // do nothing } finally { test() } }) mark(try { // do nothing } finally { test() }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ test() }), mark({ // do nothing })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ test() }), mark({ // do nothing })] 3 mark({ // do nothing }) read (Unit) - 2 jmp(L3 [skipFinallyToErrorBlock]) NEXT:[mark({ test() })] + 2 jmp(L3 [skipFinallyToErrorBlock]) NEXT:[mark({ test() })] L2 [onExceptionToFinallyBlock]: L4 [start finally]: - 3 mark({ test() }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + 3 mark({ test() }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] mark(test()) call(test(), test) -> L5 [finish finally]: - 2 jmp(error) NEXT:[] + 2 jmp(error) NEXT:[] L3 [skipFinallyToErrorBlock]: - 3 mark({ test() }) PREV:[jmp(L3 [skipFinallyToErrorBlock])] + 3 mark({ test() }) PREV:[jmp(L3 [skipFinallyToErrorBlock])] mark(test()) call(test(), test) -> + 2 merge(try { // do nothing } finally { test() }|!) -> L1: - 1 NEXT:[] + 1 NEXT:[] error: - PREV:[jmp(error)] + PREV:[jmp(error)] sink: - PREV:[, ] + PREV:[, ] ===================== diff --git a/compiler/testData/cfg/tailCalls/finally.values b/compiler/testData/cfg/tailCalls/finally.values index 02f1d56b8e4..b15c35b8255 100644 --- a/compiler/testData/cfg/tailCalls/finally.values +++ b/compiler/testData/cfg/tailCalls/finally.values @@ -7,9 +7,9 @@ tailRecursive fun test() : Int { } } --------------------- -{ // do nothing } !: * -test() : * NEW: call(test(), test) -> -{ test() } : * COPY -try { // do nothing } finally { test() } !: * COPY -{ try { // do nothing } finally { test() } } !: * COPY +{ // do nothing } !: * +test() : * NEW: call(test(), test) -> +{ test() } : * COPY +try { // do nothing } finally { test() } : * NEW: merge(try { // do nothing } finally { test() }|!) -> +{ try { // do nothing } finally { test() } } : * COPY ===================== diff --git a/compiler/testData/cfg/tailCalls/finallyWithReturn.instructions b/compiler/testData/cfg/tailCalls/finallyWithReturn.instructions index d5684f7a56c..c9985a45cfc 100644 --- a/compiler/testData/cfg/tailCalls/finallyWithReturn.instructions +++ b/compiler/testData/cfg/tailCalls/finallyWithReturn.instructions @@ -11,27 +11,28 @@ L0: 1 2 mark({ try { // do nothing } finally { return test() } }) mark(try { // do nothing } finally { return test() }) - jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ return test() }), mark({ // do nothing })] + jmp?(L2 [onExceptionToFinallyBlock]) NEXT:[mark({ return test() }), mark({ // do nothing })] 3 mark({ // do nothing }) read (Unit) - 2 jmp(L3 [skipFinallyToErrorBlock]) NEXT:[mark({ return test() })] + 2 jmp(L3 [skipFinallyToErrorBlock]) NEXT:[mark({ return test() })] L2 [onExceptionToFinallyBlock]: L4 [start finally]: - 3 mark({ return test() }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] + 3 mark({ return test() }) PREV:[jmp?(L2 [onExceptionToFinallyBlock])] mark(test()) call(test(), test) -> - ret(*|) L1 NEXT:[] + ret(*|) L1 NEXT:[] L5 [finish finally]: -- 2 jmp(error) NEXT:[] PREV:[] +- 2 jmp(error) NEXT:[] PREV:[] L3 [skipFinallyToErrorBlock]: - 3 mark({ return test() }) PREV:[jmp(L3 [skipFinallyToErrorBlock])] + 3 mark({ return test() }) PREV:[jmp(L3 [skipFinallyToErrorBlock])] mark(test()) call(test(), test) -> - ret(*|) L1 + ret(*|) L1 NEXT:[] +- 2 merge(try { // do nothing } finally { return test() }|!) -> PREV:[] L1: - 1 NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] + 1 NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] error: - PREV:[] + PREV:[] sink: - PREV:[, ] + PREV:[, ] ===================== diff --git a/compiler/testData/cfg/tailCalls/finallyWithReturn.values b/compiler/testData/cfg/tailCalls/finallyWithReturn.values index ad604deb3b5..64005d8310f 100644 --- a/compiler/testData/cfg/tailCalls/finallyWithReturn.values +++ b/compiler/testData/cfg/tailCalls/finallyWithReturn.values @@ -7,10 +7,10 @@ tailRecursive fun test() : Int { } } --------------------- -{ // do nothing } !: * -test() : Int NEW: call(test(), test) -> -return test() !: * -{ return test() } !: * COPY -try { // do nothing } finally { return test() } !: * COPY -{ try { // do nothing } finally { return test() } } !: * COPY +{ // do nothing } !: * +test() : Int NEW: call(test(), test) -> +return test() !: * +{ return test() } !: * COPY +try { // do nothing } finally { return test() } : * NEW: merge(try { // do nothing } finally { return test() }|!) -> +{ try { // do nothing } finally { return test() } } : * COPY ===================== diff --git a/compiler/testData/cfg/tailCalls/sum.instructions b/compiler/testData/cfg/tailCalls/sum.instructions index c76d8ace6fb..4db0ec339a9 100644 --- a/compiler/testData/cfg/tailCalls/sum.instructions +++ b/compiler/testData/cfg/tailCalls/sum.instructions @@ -24,23 +24,24 @@ L0: jf(L2|) NEXT:[read (Unit), r(sum) -> ] r(sum) -> ret(*|) L1 NEXT:[] -- jmp(L3) NEXT:[r(x) -> ] PREV:[] +- jmp(L3) NEXT:[merge(if (x == 0.toLong()) return sum|!) -> ] PREV:[] L2: read (Unit) PREV:[jf(L2|)] L3: - r(x) -> - r(1) -> + merge(if (x == 0.toLong()) return sum|!) -> + r(x) -> + r(1) -> mark(x - 1) - call(x - 1, minus|, ) -> - r(sum) -> - r(x) -> + call(x - 1, minus|, ) -> + r(sum) -> + r(x) -> mark(sum + x) - call(sum + x, plus|, ) -> + call(sum + x, plus|, ) -> mark(sum(x - 1, sum + x)) - call(sum(x - 1, sum + x), sum|, ) -> - ret(*|) L1 + call(sum(x - 1, sum + x), sum|, ) -> + ret(*|) L1 L1: - 1 NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] + 1 NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] error: PREV:[] sink: diff --git a/compiler/testData/cfg/tailCalls/sum.values b/compiler/testData/cfg/tailCalls/sum.values index 6da2309f8f5..429b1f8d430 100644 --- a/compiler/testData/cfg/tailCalls/sum.values +++ b/compiler/testData/cfg/tailCalls/sum.values @@ -13,14 +13,14 @@ toLong() : * x == 0.toLong() : Boolean NEW: call(x == 0.toLong(), equals|, ) -> sum : Long NEW: r(sum) -> return sum !: * -if (x == 0.toLong()) return sum !: * COPY -x : Long NEW: r(x) -> -1 : Int NEW: r(1) -> -x - 1 : Long NEW: call(x - 1, minus|, ) -> -sum : Long NEW: r(sum) -> -x : Long NEW: r(x) -> -sum + x : Long NEW: call(sum + x, plus|, ) -> -sum(x - 1, sum + x) : Long NEW: call(sum(x - 1, sum + x), sum|, ) -> -return sum(x - 1, sum + x) !: * -{ if (x == 0.toLong()) return sum return sum(x - 1, sum + x) } !: * COPY +if (x == 0.toLong()) return sum : * NEW: merge(if (x == 0.toLong()) return sum|!) -> +x : Long NEW: r(x) -> +1 : Int NEW: r(1) -> +x - 1 : Long NEW: call(x - 1, minus|, ) -> +sum : Long NEW: r(sum) -> +x : Long NEW: r(x) -> +sum + x : Long NEW: call(sum + x, plus|, ) -> +sum(x - 1, sum + x) : Long NEW: call(sum(x - 1, sum + x), sum|, ) -> +return sum(x - 1, sum + x) !: * +{ if (x == 0.toLong()) return sum return sum(x - 1, sum + x) } !: * COPY =====================