From c1a5ce6e6186b9f0845b6f0c8490b3f4e4cea467 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 20 Jul 2021 17:40:09 +0300 Subject: [PATCH] JVM skip redundant boxing optimization in methods without boxing --- .../kotlin/codegen/optimization/boxing/BoxedBasicValue.kt | 2 +- .../optimization/boxing/RedundantBoxingMethodTransformer.kt | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxedBasicValue.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxedBasicValue.kt index 3224938157a..2a6f2f30af7 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxedBasicValue.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/BoxedBasicValue.kt @@ -56,7 +56,7 @@ class TaintedBoxedValue(private val boxedBasicValue: CleanBoxedValue) : BoxedBas class BoxedValueDescriptor( - private val boxedType: Type, + boxedType: Type, val boxingInsn: AbstractInsnNode, val progressionIterator: ProgressionIteratorBasicValue?, val generationState: GenerationState diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt index 46646e36112..5844d1f8e0c 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/boxing/RedundantBoxingMethodTransformer.kt @@ -38,6 +38,10 @@ import java.util.* class RedundantBoxingMethodTransformer(private val generationState: GenerationState) : MethodTransformer() { override fun transform(internalClassName: String, node: MethodNode) { + val insns = node.instructions.toArray() + if (insns.none { it.isBoxing(generationState) || it.isMethodInsnWith(Opcodes.INVOKEINTERFACE) { name == "next" } }) + return + val interpreter = RedundantBoxingInterpreter(node.instructions, generationState) val frames = analyze(internalClassName, node, interpreter)