From 5c7b787e688d6607192ffa9bb1a3148e710858ed Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 25 May 2012 21:07:33 +0400 Subject: [PATCH] reversed traverse in depth --- .../cfg/JetControlFlowGraphTraverser.java | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 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 bf42c3ec570..7fd6e252c82 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowGraphTraverser.java @@ -24,10 +24,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.cfg.pseudocode.*; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author svtk @@ -53,6 +50,11 @@ public class JetControlFlowGraphTraverser { return straightDirection ? pseudocode.getEnterInstruction() : pseudocode.getSinkInstruction(); } + @NotNull + public Map> getDataMap() { + return dataMap; + } + public void collectInformationFromInstructionGraph( @NotNull D initialDataValue, @NotNull D initialDataValueForEnterInstruction, @@ -82,6 +84,22 @@ public class JetControlFlowGraphTraverser { } } + private static List reverseInstructions(@NotNull Pseudocode pseudocode) { + LinkedHashSet traversedInstructions = Sets.newLinkedHashSet(); + Instruction sinkInstruction = pseudocode.getSinkInstruction(); + traverseInstructions(sinkInstruction, traversedInstructions); + return Lists.newArrayList(traversedInstructions); + } + + private static void traverseInstructions(@NotNull Instruction instruction, @NotNull LinkedHashSet instructions) { + if (((InstructionImpl)instruction).isDead()) return; + if (instructions.contains(instruction)) return; + instructions.add(instruction); + for (Instruction previousInstruction : instruction.getPreviousInstructions()) { + traverseInstructions(previousInstruction, instructions); + } + } + private void traverseSubGraph( @NotNull Pseudocode pseudocode, @NotNull InstructionDataMergeStrategy instructionDataMergeStrategy, @@ -92,8 +110,7 @@ public class JetControlFlowGraphTraverser { Instruction startInstruction = getStartInstruction(pseudocode); if (!straightDirection) { - instructions = Lists.newArrayList(instructions); - Collections.reverse(instructions); + instructions = reverseInstructions(pseudocode); } for (Instruction instruction : instructions) { boolean isStart = straightDirection ? instruction instanceof SubroutineEnterInstruction : instruction instanceof SubroutineSinkInstruction; @@ -170,11 +187,11 @@ public class JetControlFlowGraphTraverser { return dataMap.get(pseudocode.getExitInstruction()).getFirst(); } - interface InstructionDataMergeStrategy { + public interface InstructionDataMergeStrategy { Pair execute(@NotNull Instruction instruction, @NotNull Collection incomingEdgesData); } - interface InstructionDataAnalyzeStrategy { + public interface InstructionDataAnalyzeStrategy { void execute(@NotNull Instruction instruction, @Nullable D enterData, @Nullable D exitData); } }