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)