diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt index b5a30be3eae..0ec974a7c84 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt @@ -60,9 +60,15 @@ class OptimizationMethodVisitor( RedundantNopsCleanupMethodTransformer() ) - private fun canBeOptimized(node: MethodNode): Boolean { + fun canBeOptimized(node: MethodNode): Boolean { val totalFramesSizeMb = node.instructions.size() * (node.maxLocals + node.maxStack) / (1024 * 1024) return totalFramesSizeMb < MEMORY_LIMIT_BY_METHOD_MB } + + fun canBeOptimizedUsingSourceInterpreter(node: MethodNode): Boolean { + val frameSize = node.maxLocals + node.maxStack + val totalFramesSizeMb = node.instructions.size().toLong() * frameSize * frameSize / (1024 * 1024) + return totalFramesSizeMb < MEMORY_LIMIT_BY_METHOD_MB + } } } 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 6b5af5a2462..5ce708648a9 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 @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.codegen.optimization.boxing +import org.jetbrains.kotlin.codegen.optimization.OptimizationMethodVisitor import org.jetbrains.kotlin.codegen.optimization.common.isLoadOperation import org.jetbrains.kotlin.codegen.optimization.common.isMeaningful import org.jetbrains.kotlin.codegen.optimization.fixStack.top @@ -31,6 +32,7 @@ import java.util.* class PopBackwardPropagationTransformer : MethodTransformer() { override fun transform(internalClassName: String, methodNode: MethodNode) { + if (!OptimizationMethodVisitor.canBeOptimizedUsingSourceInterpreter(methodNode)) return Transformer(methodNode).transform() } @@ -63,7 +65,7 @@ class PopBackwardPropagationTransformer : MethodTransformer() { private val frames by lazy { analyzeMethodBody() } fun transform() { - if (!insns.any { it.isPurePush() }) return + if (insns.none { it.isPop() || it.isPurePush() }) return computeTransformations() for ((insn, transformation) in transformations.entries) { @@ -257,6 +259,9 @@ fun AbstractInsnNode.isPurePush() = opcode in Opcodes.ACONST_NULL .. Opcodes.LDC + 2 || isUnitInstance() +fun AbstractInsnNode.isPop() = + opcode == Opcodes.POP || opcode == Opcodes.POP2 + fun AbstractInsnNode.isUnitInstance() = opcode == Opcodes.GETSTATIC && this is FieldInsnNode && owner == "kotlin/Unit" && name == "INSTANCE"