[optmz] Rewrote dfs to a loop with a stack

This commit is contained in:
Igor Chevdar
2020-05-06 10:53:43 +05:00
parent 3bbcd38f0b
commit e20896f99c
@@ -5,6 +5,8 @@
package org.jetbrains.kotlin.backend.konan.optimizations package org.jetbrains.kotlin.backend.konan.optimizations
import org.jetbrains.kotlin.backend.common.pop
import org.jetbrains.kotlin.backend.common.push
import org.jetbrains.kotlin.backend.konan.DirectedGraph import org.jetbrains.kotlin.backend.konan.DirectedGraph
import org.jetbrains.kotlin.backend.konan.DirectedGraphNode import org.jetbrains.kotlin.backend.konan.DirectedGraphNode
import org.jetbrains.kotlin.backend.konan.Context import org.jetbrains.kotlin.backend.konan.Context
@@ -70,14 +72,26 @@ internal class CallGraphBuilder(val context: Context,
private val directEdges = mutableMapOf<DataFlowIR.FunctionSymbol, CallGraphNode>() private val directEdges = mutableMapOf<DataFlowIR.FunctionSymbol, CallGraphNode>()
private val reversedEdges = mutableMapOf<DataFlowIR.FunctionSymbol, MutableList<DataFlowIR.FunctionSymbol>>() private val reversedEdges = mutableMapOf<DataFlowIR.FunctionSymbol, MutableList<DataFlowIR.FunctionSymbol>>()
private val callGraph = CallGraph(directEdges, reversedEdges) private val callGraph = CallGraph(directEdges, reversedEdges)
private val functionStack = mutableListOf<DataFlowIR.FunctionSymbol>()
fun build(): CallGraph { fun build(): CallGraph {
val rootSet = Devirtualization.computeRootSet(context, moduleDFG, externalModulesDFG) val rootSet = Devirtualization.computeRootSet(context, moduleDFG, externalModulesDFG)
@Suppress("LoopToCallChain") @Suppress("LoopToCallChain")
for (symbol in rootSet) { for (symbol in rootSet)
if (!visitedFunctions.contains(symbol)) functionStack.push(symbol)
dfs(symbol)
while (functionStack.isNotEmpty()) {
val symbol = functionStack.pop()
if (symbol !in visitedFunctions)
handleFunction(symbol)
} }
DEBUG_OUTPUT(0) {
println("DirectEdges: ${directEdges.size}")
println("ReversedEdges: ${reversedEdges.size}")
println("Sum: ${directEdges.values.sumBy { it.callSites.size }}")
}
return callGraph return callGraph
} }
@@ -157,10 +171,10 @@ internal class CallGraphBuilder(val context: Context,
callGraph.addEdge(caller, CallGraphNode.CallSite(call, false, callee)) callGraph.addEdge(caller, CallGraphNode.CallSite(call, false, callee))
if (callee is DataFlowIR.FunctionSymbol.Declared if (callee is DataFlowIR.FunctionSymbol.Declared
&& !directEdges.containsKey(callee)) && !directEdges.containsKey(callee))
dfs(callee) functionStack.push(callee)
} }
private fun dfs(symbol: DataFlowIR.FunctionSymbol) { private fun handleFunction(symbol: DataFlowIR.FunctionSymbol) {
visitedFunctions += symbol visitedFunctions += symbol
if (gotoExternal) { if (gotoExternal) {
addNode(symbol) addNode(symbol)
@@ -225,7 +239,7 @@ internal class CallGraphBuilder(val context: Context,
if (callee is DataFlowIR.FunctionSymbol.Declared if (callee is DataFlowIR.FunctionSymbol.Declared
&& call !is DataFlowIR.Node.VirtualCall && call !is DataFlowIR.Node.VirtualCall
&& !visitedFunctions.contains(callee)) && !visitedFunctions.contains(callee))
dfs(callee) functionStack.push(callee)
} else { } else {
devirtualizedCallSite.possibleCallees.forEach { devirtualizedCallSite.possibleCallees.forEach {
val callee = it.callee.resolved() val callee = it.callee.resolved()
@@ -235,7 +249,7 @@ internal class CallGraphBuilder(val context: Context,
callGraph.addEdge(symbol, CallGraphNode.CallSite(call, false, callee)) callGraph.addEdge(symbol, CallGraphNode.CallSite(call, false, callee))
if (callee is DataFlowIR.FunctionSymbol.Declared if (callee is DataFlowIR.FunctionSymbol.Declared
&& !visitedFunctions.contains(callee)) && !visitedFunctions.contains(callee))
dfs(callee) functionStack.push(callee)
} }
} }
} }