diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt index b84af353a2d..ce884efaf2f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt @@ -453,19 +453,8 @@ class RedundantBoxingMethodTransformer : MethodTransformer() { } else -> { - // Can't fuse with branching instruction. - // Trick: convert I, I on stack to L, L and use LCMP. - // This is more compact than explicit branching. - // TODO Generate 'java.lang.Integer#compare(int, int)' in targets >= JVM 1.7 - - // Initial stack: I1 I2 - insertBefore(insn, InsnNode(Opcodes.SWAP)) // I2 I1 - insertBefore(insn, InsnNode(Opcodes.I2L)) // L2 I1 - insertBefore(insn, InsnNode(Opcodes.DUP2_X1)) // L2 I1 L2 - insertBefore(insn, InsnNode(Opcodes.POP2)) // I1 L2 - insertBefore(insn, InsnNode(Opcodes.I2L)) // L1 L2 - insertBefore(insn, InsnNode(Opcodes.LCMP)) // compare(L1, L2) - remove(insn) + // Can't fuse with branching instruction. Use Intrinsics#compare(int, int). + set(insn, MethodInsnNode(Opcodes.INVOKESTATIC, "kotlin/jvm/internal/Intrinsics", "compare", "(II)I", false)) } } } diff --git a/compiler/testData/codegen/bytecodeText/boxingOptimization/intCompareTo.kt b/compiler/testData/codegen/bytecodeText/boxingOptimization/intCompareTo.kt new file mode 100644 index 00000000000..665a591931f --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/boxingOptimization/intCompareTo.kt @@ -0,0 +1,11 @@ +fun box(): String { + val a: Any = 1 + val b: Any = 42 + val test = (a as Comparable).compareTo(b) + if (test != -1) return "Fail: $test" + + return "OK" +} + +// 0 compareTo +// 1 Intrinsics.compare \ 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 03573ed329b..3dfb1fda03a 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeTextTestGenerated.java @@ -479,6 +479,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { doTest(fileName); } + @TestMetadata("intCompareTo.kt") + public void testIntCompareTo() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/boxingOptimization/intCompareTo.kt"); + doTest(fileName); + } + @TestMetadata("kClassInAnnotation.kt") public void testKClassInAnnotation() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/boxingOptimization/kClassInAnnotation.kt");