From 50d258e7f47eb5b4db7f3499a6cd0b271b4f03ba Mon Sep 17 00:00:00 2001 From: Denis Zharkov Date: Thu, 10 Mar 2016 14:29:28 +0300 Subject: [PATCH] Optimize CF merge operations Return incoming value if it's single --- .../kotlin/cfg/PseudocodeVariablesData.kt | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt index 3167a0ce7bd..71b2a98d157 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/PseudocodeVariablesData.kt @@ -155,12 +155,19 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon TraversalOrder.BACKWARD, true, UseControlFlowInfo() ) { instruction: Instruction, incomingEdgesData: Collection -> - val enterResult = UseControlFlowInfo() - for (edgeData in incomingEdgesData) { - for (entry in edgeData.entries) { - val variableDescriptor = entry.key - val variableUseState = entry.value - enterResult.put(variableDescriptor, variableUseState.merge(enterResult[variableDescriptor])) + val enterResult: UseControlFlowInfo + + if (incomingEdgesData.size == 1) { + enterResult = incomingEdgesData.single() + } + else { + enterResult = UseControlFlowInfo() + for (edgeData in incomingEdgesData) { + for (entry in edgeData.entries) { + val variableDescriptor = entry.key + val variableUseState = entry.value + enterResult.put(variableDescriptor, variableUseState.merge(enterResult[variableDescriptor])) + } } } val variableDescriptor = PseudocodeUtil.extractVariableDescriptorIfAny(instruction, true, bindingContext) @@ -207,6 +214,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon private fun mergeIncomingEdgesDataForInitializers( incomingEdgesData: Collection ): InitControlFlowInfo { + if (incomingEdgesData.size == 1) return incomingEdgesData.single() val variablesInScope = Sets.newHashSet() for (edgeData in incomingEdgesData) { variablesInScope.addAll(edgeData.keys)