From fbcb07e3a2d673cd03c933329d2d5200e55fb129 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 23 Aug 2021 13:41:44 +0300 Subject: [PATCH] JVM don't siplify CFG in TemporaryVariablesEliminationTransformer --- .../temporaryVals/TemporaryVals.kt | 5 +- ...emporaryVariablesEliminationTransformer.kt | 57 ------------------- 2 files changed, 1 insertion(+), 61 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/TemporaryVals.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/TemporaryVals.kt index 269e35def71..8ea8cf64499 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/TemporaryVals.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/temporaryVals/TemporaryVals.kt @@ -10,10 +10,7 @@ import org.jetbrains.kotlin.codegen.optimization.common.isStoreOperation import org.jetbrains.kotlin.utils.SmartSet import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type -import org.jetbrains.org.objectweb.asm.tree.AbstractInsnNode -import org.jetbrains.org.objectweb.asm.tree.IincInsnNode -import org.jetbrains.org.objectweb.asm.tree.MethodNode -import org.jetbrains.org.objectweb.asm.tree.VarInsnNode +import org.jetbrains.org.objectweb.asm.tree.* // A temporary val is a local variables that is: 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 56eb070fb57..1f071a12d5d 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 @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.codegen.optimization.temporaryVals -import org.jetbrains.kotlin.codegen.optimization.DeadCodeEliminationMethodTransformer import org.jetbrains.kotlin.codegen.optimization.common.InsnSequence import org.jetbrains.kotlin.codegen.optimization.common.removeUnusedLocalVariables import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer @@ -17,11 +16,8 @@ import kotlin.math.max class TemporaryVariablesEliminationTransformer : MethodTransformer() { private val temporaryValsAnalyzer = TemporaryValsAnalyzer() - private val deadCodeElimination = DeadCodeEliminationMethodTransformer() override fun transform(internalClassName: String, methodNode: MethodNode) { - simplifyControlFlow(methodNode) - val cfg = ControlFlowGraph(methodNode) processLabels(cfg) @@ -209,36 +205,6 @@ class TemporaryVariablesEliminationTransformer : MethodTransformer() { } } - private fun simplifyControlFlow(methodNode: MethodNode) { - val insnList = methodNode.instructions - var needsDCE = false - - for (insn in insnList.toArray()) { - if (insn.opcode == Opcodes.NOP) { - // Remove NOPs not preceded by LABEL or LINENUMBER instructions. - val prev = insn.previous ?: continue - if (prev.type == AbstractInsnNode.LABEL || prev.type == AbstractInsnNode.LINE) continue - - insnList.remove(insn) - continue - } - - if (insn.opcode == Opcodes.GOTO) { - // If we have a GOTO instruction that leads to another GOTO, replace corresponding label. - val jumpInsn = insn as JumpInsnNode - val newLabel = jumpInsn.getFinalLabel() - if (newLabel != jumpInsn.label) { - needsDCE = true - } - jumpInsn.label = newLabel - } - } - - if (needsDCE) { - deadCodeElimination.transform("", methodNode) - } - } - @Suppress("DuplicatedCode") private fun simplifyKnownSafeCallPatterns(cfg: ControlFlowGraph) { val insnList = cfg.methodNode.instructions @@ -361,29 +327,6 @@ class TemporaryVariablesEliminationTransformer : MethodTransformer() { cfg.methodNode.maxStack += maxStackIncrement } - private fun JumpInsnNode.getFinalLabel(): LabelNode { - var label = this.label - var insn = label.next - while (true) { - when { - insn.type == AbstractInsnNode.LABEL || insn.type == AbstractInsnNode.LINE -> { - insn = insn.next ?: break - } - insn.opcode == Opcodes.GOTO -> { - val newLabel = (insn as JumpInsnNode).label - if (newLabel == label) return newLabel - label = newLabel - insn = label.next ?: break - } - insn.opcode == Opcodes.NOP -> { - insn = insn.next ?: break - } - else -> break - } - } - return label - } - private fun AbstractInsnNode.matchOpcodes(vararg opcodes: Int): Boolean { var insn = this for (i in opcodes.indices) {