diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/FastPopBackwardPropagationTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/FastPopBackwardPropagationTransformer.kt index 8822821e60c..f4965652015 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/FastPopBackwardPropagationTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/FastPopBackwardPropagationTransformer.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.codegen.optimization.boxing +import org.jetbrains.kotlin.codegen.optimization.common.findPreviousOrNull import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode @@ -34,9 +35,9 @@ class FastPopBackwardPropagationTransformer : MethodTransformer() { val insns = methodNode.instructions.toArray() - for (i in 1 until insns.size) { + forInsn@ for (i in 1 until insns.size) { val insn = insns[i] - val prev = insns[i - 1] + val prev = insn.findPreviousOrNull { it.opcode != Opcodes.NOP } ?: continue@forInsn when (insn.opcode) { Opcodes.POP -> { @@ -52,7 +53,7 @@ class FastPopBackwardPropagationTransformer : MethodTransformer() { toRemove.add(prev) } else if (i > 1) { - val prev2 = insns[i - 2] + val prev2 = prev.findPreviousOrNull { it.opcode != Opcodes.NOP } ?: continue@forInsn if (prev.isEliminatedByPop() && prev2.isEliminatedByPop()) { toReplaceWithNop.add(insn) toRemove.add(prev) diff --git a/compiler/testData/codegen/bytecodeText/coercionToUnitOptimization/inRangeCheckWithConst.kt b/compiler/testData/codegen/bytecodeText/coercionToUnitOptimization/inRangeCheckWithConst.kt new file mode 100644 index 00000000000..b2a20820ea2 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/coercionToUnitOptimization/inRangeCheckWithConst.kt @@ -0,0 +1,7 @@ +// WITH_RUNTIME + +fun testPrimitiveArray(ints: IntArray) = + 10 in ints.indices + +// 0 DUP +// 0 POP \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java index f8d59044bea..c384ab31f36 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -770,6 +770,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/bytecodeText/coercionToUnitOptimization"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("inRangeCheckWithConst.kt") + public void testInRangeCheckWithConst() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/coercionToUnitOptimization/inRangeCheckWithConst.kt"); + doTest(fileName); + } + @TestMetadata("kt14360.kt") public void testKt14360() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/coercionToUnitOptimization/kt14360.kt");