From 080f5d6ad2575125f11c6669d7e799fe8f811229 Mon Sep 17 00:00:00 2001 From: svtk Date: Tue, 1 Nov 2011 18:58:24 +0400 Subject: [PATCH] Added control flow data for entering each vertex (instruction) as well as for exit --- .../cfg/JetControlFlowGraphTraverser.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java index 4ac299453dd..ec0fa13338f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java @@ -3,10 +3,8 @@ package org.jetbrains.jet.lang.cfg; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import org.jetbrains.jet.lang.cfg.pseudocode.Instruction; -import org.jetbrains.jet.lang.cfg.pseudocode.LocalDeclarationInstruction; -import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode; -import org.jetbrains.jet.lang.cfg.pseudocode.SubroutineEnterInstruction; +import com.intellij.openapi.util.Pair; +import org.jetbrains.jet.lang.cfg.pseudocode.*; import java.util.Collection; import java.util.Collections; @@ -17,15 +15,15 @@ import java.util.Map; * @author svtk */ public class JetControlFlowGraphTraverser { - public static Map traverseInstructionGraphUntilFactsStabilization( + public static Map> traverseInstructionGraphUntilFactsStabilization( Pseudocode pseudocode, InstructionsMergeStrategy instructionsMergeStrategy, D initialDataValue, D initialDataValueForEnterInstruction, boolean straightDirection) { - Map dataMap = Maps.newHashMap(); + Map> dataMap = Maps.newLinkedHashMap(); initializeDataMap(dataMap, pseudocode, initialDataValue); - dataMap.put(pseudocode.getEnterInstruction(), initialDataValueForEnterInstruction); + dataMap.put(pseudocode.getEnterInstruction(), Pair.create(initialDataValueForEnterInstruction, initialDataValueForEnterInstruction)); boolean[] changed = new boolean[1]; changed[0] = true; @@ -37,12 +35,13 @@ public class JetControlFlowGraphTraverser { } private static void initializeDataMap( - Map dataMap, + Map> dataMap, Pseudocode pseudocode, D initialDataValue) { List instructions = pseudocode.getInstructions(); + Pair initialPair = Pair.create(initialDataValue, initialDataValue); for (Instruction instruction : instructions) { - dataMap.put(instruction, initialDataValue); + dataMap.put(instruction, initialPair); if (instruction instanceof LocalDeclarationInstruction) { initializeDataMap(dataMap, ((LocalDeclarationInstruction) instruction).getBody(), initialDataValue); } @@ -54,7 +53,7 @@ public class JetControlFlowGraphTraverser { InstructionsMergeStrategy instructionsMergeStrategy, Collection previousSubGraphInstructions, boolean straightDirection, - Map dataMap, + Map> dataMap, boolean[] changed, boolean isLocal) { List instructions = pseudocode.getInstructions(); @@ -79,14 +78,14 @@ public class JetControlFlowGraphTraverser { Pseudocode subroutinePseudocode = ((LocalDeclarationInstruction) instruction).getBody(); traverseSubGraph(subroutinePseudocode, instructionsMergeStrategy, previousInstructions, straightDirection, dataMap, changed, true); } - D previousDataValue = dataMap.get(instruction); + Pair previousDataValue = dataMap.get(instruction); Collection incomingEdgesData = Sets.newHashSet(); for (Instruction previousInstruction : allPreviousInstructions) { - incomingEdgesData.add(dataMap.get(previousInstruction)); + incomingEdgesData.add(dataMap.get(previousInstruction).getSecond()); } - D mergedData = instructionsMergeStrategy.execute(instruction, incomingEdgesData); + Pair mergedData = instructionsMergeStrategy.execute(instruction, incomingEdgesData); if (!mergedData.equals(previousDataValue)) { changed[0] = true; dataMap.put(instruction, mergedData); @@ -99,6 +98,7 @@ public class JetControlFlowGraphTraverser { InstructionDataAnalyzeStrategy instructionDataAnalyzeStrategy) { List instructions = pseudocode.getInstructions(); for (Instruction instruction : instructions) { + if (((InstructionImpl)instruction).isDead()) continue; if (instruction instanceof LocalDeclarationInstruction) { traverseAndAnalyzeInstructionGraph(((LocalDeclarationInstruction) instruction).getBody(), instructionDataAnalyzeStrategy); } @@ -107,7 +107,7 @@ public class JetControlFlowGraphTraverser { } interface InstructionsMergeStrategy { - D execute(Instruction instruction, Collection incomingEdgesData); + Pair execute(Instruction instruction, Collection incomingEdgesData); } interface InstructionDataAnalyzeStrategy {