From bf532684539409496de39686612b71afb428bdad Mon Sep 17 00:00:00 2001 From: Ivan Kylchik Date: Tue, 5 Sep 2023 16:44:58 +0200 Subject: [PATCH] [JVM] Move `computeExceptionHandlers` into base `FastAnalyzer` --- .../optimization/common/FastAnalyzer.kt | 35 +++++++++++++++++++ .../optimization/common/FastMethodAnalyzer.kt | 23 +----------- .../fixStack/FastStackAnalyzer.kt | 16 ++------- .../temporaryVals/FastStoreLoadAnalyzer.kt | 24 +------------ 4 files changed, 39 insertions(+), 59 deletions(-) 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 18d93dd0f01..6799f4957dc 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 @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.codegen.optimization.common +import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.tree.* import org.jetbrains.org.objectweb.asm.tree.analysis.Frame @@ -47,6 +48,40 @@ abstract class FastAnalyzer, F: Frame>( protected fun AbstractInsnNode.indexOf() = method.instructions.indexOf(this) + protected fun computeExceptionHandlers(m: MethodNode, forEachInsn: Boolean = true) { + for (tcb in m.tryCatchBlocks) { + if (forEachInsn) computeExceptionHandlersForEachInsn(tcb) else computeExceptionHandlerFast(tcb) + } + } + + private fun computeExceptionHandlersForEachInsn(tcb: TryCatchBlockNode) { + var current: AbstractInsnNode = tcb.start + val end = tcb.end + + while (current != end) { + if (current.isMeaningful) { + val currentIndex = current.indexOf() + var insnHandlers: MutableList? = handlers[currentIndex] + if (insnHandlers == null) { + insnHandlers = SmartList() + handlers[currentIndex] = insnHandlers + } + insnHandlers.add(tcb) + } + current = current.next + } + } + + private fun computeExceptionHandlerFast(tcb: TryCatchBlockNode) { + val start = tcb.start.indexOf() + var insnHandlers: MutableList? = handlers[start] + if (insnHandlers == null) { + insnHandlers = ArrayList() + handlers[start] = insnHandlers + } + insnHandlers.add(tcb) + } + protected fun F.dump(): String { return buildString { append("{\n") 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 7fb2d0dbc55..a8a73d7fcf4 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 @@ -34,7 +34,6 @@ package org.jetbrains.kotlin.codegen.optimization.common import org.jetbrains.kotlin.codegen.inline.insnText -import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.tree.* @@ -67,7 +66,7 @@ open class FastMethodAnalyzer if (nInsns == 0) return frames checkAssertions() - computeExceptionHandlersForEachInsn(method) + computeExceptionHandlers(method) val isTcbStart = BooleanArray(nInsns) for (tcb in method.tryCatchBlocks) { @@ -195,26 +194,6 @@ open class FastMethodAnalyzer } } - private fun computeExceptionHandlersForEachInsn(m: MethodNode) { - for (tcb in m.tryCatchBlocks) { - var current: AbstractInsnNode = tcb.start - val end = tcb.end - - while (current != end) { - if (current.isMeaningful) { - val currentIndex = current.indexOf() - var insnHandlers: MutableList? = handlers[currentIndex] - if (insnHandlers == null) { - insnHandlers = SmartList() - handlers[currentIndex] = insnHandlers - } - insnHandlers.add(tcb) - } - current = current.next - } - } - } - /** * Updates frame at the index [dest] with its old value if provided and previous control flow node frame [frame]. * Reuses old frame when possible and when [canReuse] is true. 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 61f58bada06..6785b8189ba 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 @@ -71,7 +71,8 @@ internal open class FastStackAnalyzer( checkAssertions() - computeExceptionEdges() + // Don't have to visit same exception handler multiple times - we care only about stack state at TCB start. + computeExceptionHandlers(method, forEachInsn = false) val current = newFrame(method.maxLocals, method.maxStack) val handler = newFrame(method.maxLocals, method.maxStack) @@ -188,19 +189,6 @@ internal open class FastStackAnalyzer( mergeControlFlowEdge(0, current) } - private fun computeExceptionEdges() { - for (tcb in method.tryCatchBlocks) { - // Don't have to visit same exception handler multiple times - we care only about stack state at TCB start. - val start = tcb.start.indexOf() - var insnHandlers: MutableList? = handlers[start] - if (insnHandlers == null) { - insnHandlers = ArrayList() - handlers[start] = insnHandlers - } - insnHandlers.add(tcb) - } - } - private fun mergeControlFlowEdge(dest: Int, frame: Frame) { val destFrame = frames[dest] if (destFrame == null) { 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 1281fa74de3..1c81edb1c35 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 @@ -35,8 +35,6 @@ package org.jetbrains.kotlin.codegen.optimization.temporaryVals import org.jetbrains.kotlin.codegen.inline.insnText import org.jetbrains.kotlin.codegen.optimization.common.FastAnalyzer -import org.jetbrains.kotlin.codegen.optimization.common.isMeaningful -import org.jetbrains.kotlin.utils.SmartList import org.jetbrains.org.objectweb.asm.Opcodes import org.jetbrains.org.objectweb.asm.Opcodes.API_VERSION import org.jetbrains.org.objectweb.asm.Type @@ -119,7 +117,7 @@ class FastStoreLoadAnalyzer( if (nInsns == 0) return frames checkAssertions() - computeExceptionHandlersForEachInsn(method) + computeExceptionHandlers(method) initMergeNodes() val current = newFrame(method.maxLocals) @@ -188,26 +186,6 @@ class FastStoreLoadAnalyzer( mergeControlFlowEdge(insnNode.label.indexOf(), current) } - private fun computeExceptionHandlersForEachInsn(m: MethodNode) { - for (tcb in m.tryCatchBlocks) { - var current: AbstractInsnNode = tcb.start - val end = tcb.end - - while (current != end) { - if (current.isMeaningful) { - val currentIndex = current.indexOf() - var insnHandlers: MutableList? = handlers[currentIndex] - if (insnHandlers == null) { - insnHandlers = SmartList() - handlers[currentIndex] = insnHandlers - } - insnHandlers.add(tcb) - } - current = current.next - } - } - } - private fun initMergeNodes() { for (insn in method.instructions) { when (insn.type) {