Use Intrinsics#compare when specializing compareTo for ints
This commit is contained in:
+2
-13
@@ -453,19 +453,8 @@ class RedundantBoxingMethodTransformer : MethodTransformer() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
else -> {
|
else -> {
|
||||||
// Can't fuse with branching instruction.
|
// Can't fuse with branching instruction. Use Intrinsics#compare(int, int).
|
||||||
// Trick: convert I, I on stack to L, L and use LCMP.
|
set(insn, MethodInsnNode(Opcodes.INVOKESTATIC, "kotlin/jvm/internal/Intrinsics", "compare", "(II)I", false))
|
||||||
// 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)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
fun box(): String {
|
||||||
|
val a: Any = 1
|
||||||
|
val b: Any = 42
|
||||||
|
val test = (a as Comparable<Any>).compareTo(b)
|
||||||
|
if (test != -1) return "Fail: $test"
|
||||||
|
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0 compareTo
|
||||||
|
// 1 Intrinsics.compare
|
||||||
@@ -479,6 +479,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
|
|||||||
doTest(fileName);
|
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")
|
@TestMetadata("kClassInAnnotation.kt")
|
||||||
public void testKClassInAnnotation() throws Exception {
|
public void testKClassInAnnotation() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/boxingOptimization/kClassInAnnotation.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/boxingOptimization/kClassInAnnotation.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user