From 6aca5e3037d8b0e112cff82f6129d6d9fa7f6080 Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Thu, 19 May 2022 16:14:15 +0300 Subject: [PATCH] [FIR] Fast check of changed in CfgTraverser --- .../fir/analysis/cfa/util/CfgTraverser.kt | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/util/CfgTraverser.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/util/CfgTraverser.kt index 13677752b2b..9d7149ec374 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/util/CfgTraverser.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/util/CfgTraverser.kt @@ -43,10 +43,10 @@ fun ControlFlowGraph.collectDataForNode( val startNode = getEnterNode(direction) nodeMap[startNode] = initialInfo - val changed = mutableMapOf, Boolean>() + var shouldContinue: Boolean do { - collectDataForNodeInternal(direction, initialInfo, visitor, nodeMap, changed, visitSubGraphs) - } while (changed.any { it.value }) + shouldContinue = collectDataForNodeInternal(direction, initialInfo, visitor, nodeMap, visitSubGraphs) + } while (shouldContinue) return nodeMap } @@ -56,13 +56,13 @@ private fun ControlFlowGraph.collectDataForNodeInternal( initialInfo: I, visitor: ControlFlowGraphVisitor>>, nodeMap: MutableMap, I>, - changed: MutableMap, Boolean>, visitSubGraphs: Boolean = true -) { +): Boolean { + var changed = false val nodes = getNodesInOrder(direction) for (node in nodes) { if (visitSubGraphs && direction == TraverseDirection.Backward && node is CFGNodeWithSubgraphs<*>) { - node.subGraphs.forEach { it.collectDataForNodeInternal(direction, initialInfo, visitor, nodeMap, changed) } + node.subGraphs.forEach { changed = changed or it.collectDataForNodeInternal(direction, initialInfo, visitor, nodeMap) } } val previousNodes = when (direction) { TraverseDirection.Forward -> node.previousCfgNodes @@ -81,12 +81,13 @@ private fun ControlFlowGraph.collectDataForNodeInternal( val data = nodeMap[node] val newData = node.accept(visitor, previousData) val hasChanged = newData != data - changed[node] = hasChanged + changed = changed or hasChanged if (hasChanged) { nodeMap[node] = newData } if (visitSubGraphs && direction == TraverseDirection.Forward && node is CFGNodeWithSubgraphs<*>) { - node.subGraphs.forEach { it.collectDataForNodeInternal(direction, initialInfo, visitor, nodeMap, changed) } + node.subGraphs.forEach { changed = changed or it.collectDataForNodeInternal(direction, initialInfo, visitor, nodeMap) } } } + return changed }