diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/Util.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/Util.kt index f43dac7351e..565cbdc2d2d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/Util.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/Util.kt @@ -51,7 +51,7 @@ fun MethodNode.prepareForEmitting() { // local variables with live ranges starting after last meaningful instruction lead to VerifyError localVariables = localVariables.filter { lv -> - InsnSequence(lv.start, instructions.getLast()).any { insn -> + InsnSequence(lv.start, lv.end).any { insn -> insn.isMeaningful } } diff --git a/compiler/testData/checkLocalVariablesTable/catchClause.kt b/compiler/testData/checkLocalVariablesTable/catchClause.kt index 0c76d23638a..0ccbddc6be5 100644 --- a/compiler/testData/checkLocalVariablesTable/catchClause.kt +++ b/compiler/testData/checkLocalVariablesTable/catchClause.kt @@ -1,7 +1,8 @@ class A { fun foo() { try { - val a = 1 + var a = 1 + a++ } catch(e : Throwable) { diff --git a/compiler/testData/checkLocalVariablesTable/inlineLambdaWithItParam.kt b/compiler/testData/checkLocalVariablesTable/inlineLambdaWithItParam.kt index 3363a458b7a..7957e769367 100644 --- a/compiler/testData/checkLocalVariablesTable/inlineLambdaWithItParam.kt +++ b/compiler/testData/checkLocalVariablesTable/inlineLambdaWithItParam.kt @@ -6,6 +6,7 @@ class A { fun foo() { inlineFun ({ var zzz = it; + zzz++ }) } } diff --git a/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt b/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt index 2654aa11666..4a676161142 100644 --- a/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt +++ b/compiler/testData/checkLocalVariablesTable/inlineLambdaWithParam.kt @@ -8,6 +8,7 @@ class A { fun foo() { inlineFun ({ l -> var zzz = l; + zzz++ }, 11) } } diff --git a/compiler/testData/checkLocalVariablesTable/inlineSimple.kt b/compiler/testData/checkLocalVariablesTable/inlineSimple.kt index 472a8771b2e..c70300b0aa1 100644 --- a/compiler/testData/checkLocalVariablesTable/inlineSimple.kt +++ b/compiler/testData/checkLocalVariablesTable/inlineSimple.kt @@ -7,6 +7,7 @@ class A { var s = 1; inlineFun ({ var zzz = 2; + zzz++ }) } } diff --git a/compiler/testData/checkLocalVariablesTable/inlineSimpleChain.kt b/compiler/testData/checkLocalVariablesTable/inlineSimpleChain.kt index 94d4432cea4..1c36a039497 100644 --- a/compiler/testData/checkLocalVariablesTable/inlineSimpleChain.kt +++ b/compiler/testData/checkLocalVariablesTable/inlineSimpleChain.kt @@ -7,9 +7,11 @@ class A { var s = 0; inlineFun { var z = 1; + z++ inlineFun { var zz2 = 2; + zz2++ } } } diff --git a/compiler/testData/codegen/box/deadCodeElimination/intersectingVariableRange.kt b/compiler/testData/codegen/box/deadCodeElimination/intersectingVariableRange.kt new file mode 100644 index 00000000000..4d685fb2a0c --- /dev/null +++ b/compiler/testData/codegen/box/deadCodeElimination/intersectingVariableRange.kt @@ -0,0 +1,13 @@ +fun box(): String { + try { + return "OK" + if (1 == 1) { + val z = 2 + } + if (3 == 3) { + val z = 4 + } + } finally { + + } +} diff --git a/compiler/testData/codegen/box/deadCodeElimination/intersectingVariableRangeInFinally.kt b/compiler/testData/codegen/box/deadCodeElimination/intersectingVariableRangeInFinally.kt new file mode 100644 index 00000000000..071bd50aa47 --- /dev/null +++ b/compiler/testData/codegen/box/deadCodeElimination/intersectingVariableRangeInFinally.kt @@ -0,0 +1,12 @@ +fun box(): String { + try { + return "OK" + } finally { + if (1 == 1) { + val z = 2 + } + if (3 == 3) { + val z = 4 + } + } +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index 189244ff67f..5e8f510f727 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -2180,6 +2180,27 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { } } + @TestMetadata("compiler/testData/codegen/box/deadCodeElimination") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class DeadCodeElimination extends AbstractBlackBoxCodegenTest { + public void testAllFilesPresentInDeadCodeElimination() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/deadCodeElimination"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("intersectingVariableRange.kt") + public void testIntersectingVariableRange() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/deadCodeElimination/intersectingVariableRange.kt"); + doTest(fileName); + } + + @TestMetadata("intersectingVariableRangeInFinally.kt") + public void testIntersectingVariableRangeInFinally() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/deadCodeElimination/intersectingVariableRangeInFinally.kt"); + doTest(fileName); + } + } + @TestMetadata("compiler/testData/codegen/box/defaultArguments") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)