From cc885f9b24be46d84f4ba8e78a066174f3e010c6 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Tue, 28 Sep 2021 18:03:17 +0300 Subject: [PATCH] JVM don't remove NOP starting a try-catch block --- .../TemporaryVariablesEliminationTransformer.kt | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/TemporaryVariablesEliminationTransformer.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/TemporaryVariablesEliminationTransformer.kt index 8c5ba89e5b0..b842a1e754f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/TemporaryVariablesEliminationTransformer.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/TemporaryVariablesEliminationTransformer.kt @@ -37,7 +37,6 @@ class TemporaryVariablesEliminationTransformer(private val state: GenerationStat methodNode.removeUnusedLocalVariables() } - private fun simplifyTrivialInstructions(methodNode: MethodNode) { val insnList = methodNode.instructions for (insn in insnList.toArray()) { @@ -61,12 +60,14 @@ class TemporaryVariablesEliminationTransformer(private val state: GenerationStat } } } + val tcbStartLabels = methodNode.tryCatchBlocks.mapTo(HashSet()) { it.start } for (insn in insnList.toArray()) { // Remove NOPs immediately preceded or immediately followed by an instruction that does something // - not a LINENUMBER, not a LABEL, and not a FRAME. if (insn.opcode == Opcodes.NOP) { - val next = insn.next val prev = insn.previous + if (prev in tcbStartLabels) continue + val next = insn.next if (next != null && next.isMeaningful || prev != null && prev.isMeaningful) { insnList.remove(insn) }