From b69661df8fb4e98d9ac4fa48f2daa94c0aec2778 Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Fri, 12 Aug 2016 19:41:28 +0300 Subject: [PATCH] Pseudocode and CFG changed after 'let' is resolved correctly. --- .../cfg/deadCode/notLocalReturn.instructions | 46 +++++++++---------- .../cfg/deadCode/notLocalReturn.values | 30 ++++++------ 2 files changed, 37 insertions(+), 39 deletions(-) diff --git a/compiler/testData/cfg/deadCode/notLocalReturn.instructions b/compiler/testData/cfg/deadCode/notLocalReturn.instructions index 90ac0be492b..61cdde38bd5 100644 --- a/compiler/testData/cfg/deadCode/notLocalReturn.instructions +++ b/compiler/testData/cfg/deadCode/notLocalReturn.instructions @@ -98,22 +98,22 @@ L0: d(fun f(x: Any?) = x) NEXT:[] L2 [after local declaration]: mark(null?.let { return }) PREV:[jmp?(L2)] - jf(L5) NEXT:[mark(f(null?.let { return })), mark({ return })] + jf(L5) NEXT:[mark(f(null?.let { return })), r(null) -> ] + r(null) -> mark({ return }) - jmp?(L6) NEXT:[r({ return }) -> , d({ return })] + jmp?(L6) NEXT:[r({ return }) -> , d({ return })] d({ return }) NEXT:[] L6 [after local declaration]: - r({ return }) -> PREV:[jmp?(L6)] - r(null) -> + r({ return }) -> PREV:[jmp?(L6)] mark(let { return }) - magic[UNRESOLVED_CALL](let { return }|, !, ) -> + call(let { return }, let|, ) L5 [result of call]: - mark(f(null?.let { return })) PREV:[jf(L5), magic[UNRESOLVED_CALL](let { return }|, !, ) -> ] - call(f(null?.let { return }), f|) -> + mark(f(null?.let { return })) PREV:[jf(L5), call(let { return }, let|, )] + call(f(null?.let { return }), f|!) -> mark(doSomething()) - call(doSomething(), doSomething) -> + call(doSomething(), doSomething) -> L1: - 1 NEXT:[] PREV:[ret L1, call(doSomething(), doSomething) -> ] + 1 NEXT:[] PREV:[ret L1, call(doSomething(), doSomething) -> ] error: PREV:[] sink: @@ -163,28 +163,28 @@ L0: magic[FAKE_INITIALIZER](x: Any?) -> w(x|) mark(x?.let { return true }) - jf(L2) NEXT:[mark(x?.let { return true } ?: false), mark({ return true })] + jf(L2) NEXT:[mark(x?.let { return true } ?: false), r(x) -> ] + r(x) -> mark({ return true }) - jmp?(L3) NEXT:[r({ return true }) -> , d({ return true })] - d({ return true }) NEXT:[] + jmp?(L3) NEXT:[r({ return true }) -> , d({ return true })] + d({ return true }) NEXT:[] L3 [after local declaration]: - r({ return true }) -> PREV:[jmp?(L3)] - r(x) -> + r({ return true }) -> PREV:[jmp?(L3)] mark(let { return true }) - magic[UNRESOLVED_CALL](let { return true }|, !, ) -> + call(let { return true }, let|, ) L2 [result of call]: - mark(x?.let { return true } ?: false) PREV:[jf(L2), magic[UNRESOLVED_CALL](let { return true }|, !, ) -> ] - jt(L6|) NEXT:[r(false) -> , merge(x?.let { return true } ?: false|, ) -> ] - r(false) -> + mark(x?.let { return true } ?: false) PREV:[jf(L2), call(let { return true }, let|, )] + jt(L6|!) NEXT:[r(false) -> , merge(x?.let { return true } ?: false|!, ) -> ] + r(false) -> L6 [after elvis operator]: - merge(x?.let { return true } ?: false|, ) -> PREV:[jt(L6|), r(false) -> ] - ret(*|) L1 + merge(x?.let { return true } ?: false|!, ) -> PREV:[jt(L6|!), r(false) -> ] + ret(*|) L1 L1: - NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] + NEXT:[] PREV:[ret(*|) L1, ret(*|) L1] error: - PREV:[] + PREV:[] sink: - PREV:[, , d({ return true })] + PREV:[, , d({ return true })] ===================== == anonymous_2 == { diff --git a/compiler/testData/cfg/deadCode/notLocalReturn.values b/compiler/testData/cfg/deadCode/notLocalReturn.values index 51139292ee7..2ab80110922 100644 --- a/compiler/testData/cfg/deadCode/notLocalReturn.values +++ b/compiler/testData/cfg/deadCode/notLocalReturn.values @@ -43,14 +43,13 @@ fun test2() { doSomething() } --------------------- -null : * NEW: r(null) -> -let !: * -{ return } : * NEW: r({ return }) -> -let { return } : * NEW: magic[UNRESOLVED_CALL](let { return }|, !, ) -> -null?.let { return } : * COPY -f(null?.let { return }) : * NEW: call(f(null?.let { return }), f|) -> -doSomething() : * NEW: call(doSomething(), doSomething) -> -{ fun f(x: Any?) = x f(null?.let { return }) // false unreachable here doSomething() } : * COPY +null : Nothing NEW: r(null) -> +{ return } : {<: (Nothing) -> Nothing} NEW: r({ return }) -> +let { return } !: * +null?.let { return } !: * COPY +f(null?.let { return }) : * NEW: call(f(null?.let { return }), f|!) -> +doSomething() : * NEW: call(doSomething(), doSomething) -> +{ fun f(x: Any?) = x f(null?.let { return }) // false unreachable here doSomething() } : * COPY ===================== == f == fun f(x: Any?) = x @@ -70,14 +69,13 @@ fun test3(x: Any?): Boolean = return true } ?: false --------------------- - : * NEW: magic[FAKE_INITIALIZER](x: Any?) -> -x : * NEW: r(x) -> -let !: * -{ return true } : * NEW: r({ return true }) -> -let { return true } : Boolean NEW: magic[UNRESOLVED_CALL](let { return true }|, !, ) -> -x?.let { return true } : Boolean COPY -false : Boolean NEW: r(false) -> -x?.let { return true } ?: false : Boolean NEW: merge(x?.let { return true } ?: false|, ) -> + : * NEW: magic[FAKE_INITIALIZER](x: Any?) -> +x : {<: Any} NEW: r(x) -> +{ return true } : {<: (Any) -> Nothing} NEW: r({ return true }) -> +let { return true } !: * +x?.let { return true } !: * COPY +false : Boolean NEW: r(false) -> +x?.let { return true } ?: false : Boolean NEW: merge(x?.let { return true } ?: false|!, ) -> ===================== == anonymous_2 == {