CFG refactoring: get rid of mergeWithLocalDeclarations (always true) + minor style fixes

This commit is contained in:
Mikhail Glukhikh
2016-10-20 16:08:21 +03:00
parent cce3a77e5e
commit 1e04945609
3 changed files with 14 additions and 28 deletions
@@ -57,7 +57,6 @@ fun <D> Pseudocode.traverse(
fun <I : ControlFlowInfo<*>> Pseudocode.collectData(
traversalOrder: TraversalOrder,
mergeDataWithLocalDeclarations: Boolean,
mergeEdges: (Instruction, Collection<I>) -> Edges<I>,
updateEdge: (Instruction, Instruction, I) -> I,
initialInfo: I
@@ -70,7 +69,7 @@ fun <I : ControlFlowInfo<*>> Pseudocode.collectData(
while (changed[0]) {
changed[0] = false
collectDataFromSubgraph(
traversalOrder, mergeDataWithLocalDeclarations, edgesMap,
traversalOrder, edgesMap,
mergeEdges, updateEdge, Collections.emptyList<Instruction>(), changed, false)
}
return edgesMap
@@ -78,7 +77,6 @@ fun <I : ControlFlowInfo<*>> Pseudocode.collectData(
private fun <I : ControlFlowInfo<*>> Pseudocode.collectDataFromSubgraph(
traversalOrder: TraversalOrder,
mergeDataWithLocalDeclarations: Boolean,
edgesMap: MutableMap<Instruction, Edges<I>>,
mergeEdges: (Instruction, Collection<I>) -> Edges<I>,
updateEdge: (Instruction, Instruction, I) -> I,
@@ -98,30 +96,23 @@ private fun <I : ControlFlowInfo<*>> Pseudocode.collectDataFromSubgraph(
if (instruction is LocalFunctionDeclarationInstruction) {
val subroutinePseudocode = instruction.body
val previous = if (mergeDataWithLocalDeclarations) previousInstructions else Collections.emptyList()
subroutinePseudocode.collectDataFromSubgraph(
traversalOrder, mergeDataWithLocalDeclarations,
edgesMap, mergeEdges, updateEdge, previous, changed, true)
if (mergeDataWithLocalDeclarations) {
val lastInstruction = subroutinePseudocode.getLastInstruction(traversalOrder)
val previousValue = edgesMap.get(instruction)
val newValue = edgesMap.get(lastInstruction)
val updatedValue =
if (newValue == null)
null
else
Edges(updateEdge(lastInstruction, instruction, newValue.incoming),
updateEdge(lastInstruction, instruction, newValue.outgoing))
updateEdgeDataForInstruction(instruction, previousValue, updatedValue, edgesMap, changed)
continue
traversalOrder, edgesMap, mergeEdges, updateEdge, previousInstructions, changed, true)
val lastInstruction = subroutinePseudocode.getLastInstruction(traversalOrder)
val previousValue = edgesMap[instruction]
val newValue = edgesMap[lastInstruction]
val updatedValue = newValue?.let {
Edges(updateEdge(lastInstruction, instruction, it.incoming), updateEdge(lastInstruction, instruction, it.outgoing))
}
updateEdgeDataForInstruction(instruction, previousValue, updatedValue, edgesMap, changed)
continue
}
val previousDataValue = edgesMap.get(instruction)
val previousDataValue = edgesMap[instruction]
val incomingEdgesData = HashSet<I>()
for (previousInstruction in previousInstructions) {
val previousData = edgesMap.get(previousInstruction)
val previousData = edgesMap[previousInstruction]
if (previousData != null) {
incomingEdgesData.add(updateEdge(
previousInstruction, instruction, previousData.outgoing))
@@ -40,12 +40,11 @@ class PseudocodeVariableDataCollector(
fun <I : ControlFlowInfo<*>> collectData(
traversalOrder: TraversalOrder,
mergeDataWithLocalDeclarations: Boolean,
initialInfo: I,
instructionDataMergeStrategy: (Instruction, Collection<I>) -> Edges<I>
): Map<Instruction, Edges<I>> {
return pseudocode.collectData(
traversalOrder, mergeDataWithLocalDeclarations,
traversalOrder,
instructionDataMergeStrategy,
{ from, to, info -> filterOutVariablesOutOfScope(from, to, info) },
initialInfo
@@ -89,9 +89,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
val blockScopeVariableInfo = pseudocodeVariableDataCollector.blockScopeVariableInfo
return pseudocodeVariableDataCollector.collectData(
TraversalOrder.FORWARD, /*mergeDataWithLocalDeclarations=*/ true, InitControlFlowInfo()
) {
return pseudocodeVariableDataCollector.collectData(TraversalOrder.FORWARD, InitControlFlowInfo()) {
instruction: Instruction, incomingEdgesData: Collection<InitControlFlowInfo> ->
val enterInstructionData = mergeIncomingEdgesDataForInitializers(instruction, incomingEdgesData, blockScopeVariableInfo)
@@ -148,9 +146,7 @@ class PseudocodeVariablesData(val pseudocode: Pseudocode, private val bindingCon
// variable use
val variableUseStatusData: Map<Instruction, Edges<UseControlFlowInfo>>
get() = pseudocodeVariableDataCollector.collectData(
TraversalOrder.BACKWARD, true, UseControlFlowInfo()
) {
get() = pseudocodeVariableDataCollector.collectData(TraversalOrder.BACKWARD, UseControlFlowInfo()) {
instruction: Instruction, incomingEdgesData: Collection<UseControlFlowInfo> ->
val enterResult: UseControlFlowInfo