Skip NOP instructions in fast pop backward propagation

This commit is contained in:
Dmitry Petrov
2017-06-30 18:23:43 +03:00
parent 36cbc0defd
commit 614d90d6ef
3 changed files with 17 additions and 3 deletions
@@ -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)
@@ -0,0 +1,7 @@
// WITH_RUNTIME
fun testPrimitiveArray(ints: IntArray) =
10 in ints.indices
// 0 DUP
// 0 POP
@@ -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");