diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/SimpleBoundedValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/SimpleBoundedValue.kt index 11b0f02a391..378f429ea9c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/range/SimpleBoundedValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/range/SimpleBoundedValue.kt @@ -52,8 +52,14 @@ class SimpleBoundedValue( ) : this(codegen, rangeCall, lowBound, true, highBound, true) override fun putHighLow(v: InstructionAdapter, type: Type) { - lowBound.put(type, v) - highBound.put(type, v) - AsmUtil.swap(v, type, type) + if (!lowBound.canHaveSideEffects() || !highBound.canHaveSideEffects()) { + highBound.put(type, v) + lowBound.put(type, v) + } + else { + lowBound.put(type, v) + highBound.put(type, v) + AsmUtil.swap(v, type, type) + } } } \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeText/ranges/noSwap2ForConstLongRangeTo.kt b/compiler/testData/codegen/bytecodeText/ranges/noSwap2ForConstLongRangeTo.kt new file mode 100644 index 00000000000..a83b6e80e77 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/ranges/noSwap2ForConstLongRangeTo.kt @@ -0,0 +1,7 @@ +// WITH_RUNTIME + +fun test(a: Long) = a in 1L .. 10L + +// One DUP2_X2 generated for 'in' operator, +// no DUP2_X2 generated for range on stack. +// 1 DUP2_X2 \ 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 12586c52328..6333953f1f0 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -1912,6 +1912,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/ranges/inUntil.kt"); doTest(fileName); } + + @TestMetadata("noSwap2ForConstLongRangeTo.kt") + public void testNoSwap2ForConstLongRangeTo() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/ranges/noSwap2ForConstLongRangeTo.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/codegen/bytecodeText/statements")