From b693b54a2cb3327ec372c981becbdac105ea7d90 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Wed, 5 Jul 2017 15:40:30 +0300 Subject: [PATCH] Fix DUPn_Xm handling in PopBackwardPropagationTransformer DUPn_Xm instructions implicitly depend on elements directly under stack top (which are not "copied", but still required). We can't analyze them precisely now, and should skip methods containing these instructions. Fortunately, we didn't generate these instructions under POP before, but with new range check code generation and constant conditions elimination such combination of instructions becomes possible. --- .../boxing/PopBackwardPropagationTransformer.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/PopBackwardPropagationTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/PopBackwardPropagationTransformer.kt index 5ce708648a9..44bba2a7542 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/PopBackwardPropagationTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/PopBackwardPropagationTransformer.kt @@ -33,9 +33,17 @@ import java.util.* class PopBackwardPropagationTransformer : MethodTransformer() { override fun transform(internalClassName: String, methodNode: MethodNode) { if (!OptimizationMethodVisitor.canBeOptimizedUsingSourceInterpreter(methodNode)) return + if (methodNode.instructions.toArray().any { it.isUnsafeStackInsn() }) return Transformer(methodNode).transform() } + // TODO better stack operations analysis + private fun AbstractInsnNode.isUnsafeStackInsn() = + opcode == Opcodes.DUP_X1 || + opcode == Opcodes.DUP_X2 || + opcode == Opcodes.DUP2_X1 || + opcode == Opcodes.DUP2_X2 + private class Transformer(val methodNode: MethodNode) { private interface Transformation { fun apply(insn: AbstractInsnNode)