diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/FastAnalyzer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/FastAnalyzer.kt index c261e86e53c..4a172d3c77b 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/FastAnalyzer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/FastAnalyzer.kt @@ -103,9 +103,9 @@ abstract class FastAnalyzer, F : Frame>( } } - protected fun processControlFlowEdge(current: F, insnNode: AbstractInsnNode, jump: Int) { + private fun processControlFlowEdge(current: F, insnNode: AbstractInsnNode, jump: Int, canReuse: Boolean = false) { if (visitControlFlowEdge(insnNode, jump)) { - mergeControlFlowEdge(jump, current) + mergeControlFlowEdge(jump, current, canReuse) } } @@ -148,6 +148,10 @@ abstract class FastAnalyzer, F : Frame>( } } + protected fun visitNopInsn(insnNode: AbstractInsnNode, current: F, insn: Int) { + processControlFlowEdge(current, insnNode, insn + 1, canReuse = true) + } + private fun visitOpInsn(insnNode: AbstractInsnNode, current: F, insn: Int) { processControlFlowEdge(current, insnNode, insn + 1) } diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/FastMethodAnalyzer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/FastMethodAnalyzer.kt index 1a4e2b97640..05b82218ee5 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/FastMethodAnalyzer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/common/FastMethodAnalyzer.kt @@ -77,7 +77,7 @@ class FastMethodAnalyzer insnType == AbstractInsnNode.FRAME || insnOpcode == Opcodes.NOP ) { - mergeControlFlowEdge(insnIndex + 1, currentlyAnalyzing, canReuse = true) + visitNopInsn(insnNode, currentlyAnalyzing, insnIndex) } else { current.init(currentlyAnalyzing).execute(insnNode, interpreter) visitMeaningfulInstruction(insnNode, insnType, insnOpcode, current, insnIndex) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FastStackAnalyzer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FastStackAnalyzer.kt index 680c90b5dd0..a12e78a6238 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FastStackAnalyzer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/fixStack/FastStackAnalyzer.kt @@ -36,7 +36,8 @@ package org.jetbrains.kotlin.codegen.optimization.fixStack import org.jetbrains.kotlin.codegen.optimization.common.FastAnalyzer import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.tree.* +import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode +import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.analysis.Frame import org.jetbrains.org.objectweb.asm.tree.analysis.Interpreter import org.jetbrains.org.objectweb.asm.tree.analysis.Value @@ -66,7 +67,11 @@ internal open class FastStackAnalyzer>( current: F, handler: F, ) { - if (insnType == AbstractInsnNode.LABEL || insnType == AbstractInsnNode.LINE || insnType == AbstractInsnNode.FRAME) { + if (insnType == AbstractInsnNode.LABEL || + insnType == AbstractInsnNode.LINE || + insnType == AbstractInsnNode.FRAME || + insnOpcode == Opcodes.NOP + ) { visitNopInsn(insnNode, currentlyAnalyzing, insnIndex) } else { current.init(currentlyAnalyzing) @@ -88,10 +93,6 @@ internal open class FastStackAnalyzer>( } } - private fun visitNopInsn(insnNode: AbstractInsnNode, f: F, insn: Int) { - processControlFlowEdge(f, insnNode, insn + 1) - } - override fun mergeControlFlowEdge(dest: Int, frame: F, canReuse: Boolean) { val oldFrame = getFrame(dest) val changes = when { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/FastStoreLoadAnalyzer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/FastStoreLoadAnalyzer.kt index 7c7954495e3..4708c8788bc 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/FastStoreLoadAnalyzer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/FastStoreLoadAnalyzer.kt @@ -79,8 +79,12 @@ class FastStoreLoadAnalyzer( current: StoreLoadFrame, handler: StoreLoadFrame, ) { - if (insnType == AbstractInsnNode.LABEL || insnType == AbstractInsnNode.LINE || insnType == AbstractInsnNode.FRAME) { - mergeControlFlowEdge(insnIndex + 1, currentlyAnalyzing) + if (insnType == AbstractInsnNode.LABEL || + insnType == AbstractInsnNode.LINE || + insnType == AbstractInsnNode.FRAME || + insnOpcode == Opcodes.NOP + ) { + visitNopInsn(insnNode, currentlyAnalyzing, insnIndex) } else { current.init(currentlyAnalyzing).execute(insnNode, interpreter) visitMeaningfulInstruction(insnNode, insnType, insnOpcode, current, insnIndex)