[optmz] Rewrote dfs to a loop with a stack
This commit is contained in:
+21
-7
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user