From 57518c12008d24705bfa707dc6b016c8c97b4b49 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Tue, 18 Dec 2012 15:40:20 +0400 Subject: [PATCH] removed cached data for each instruction --- .../jet/lang/cfg/PseudocodeVariablesData.java | 108 +++++++++--------- 1 file changed, 51 insertions(+), 57 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java index eef35f381b4..6eb8e3fa78b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/PseudocodeVariablesData.java @@ -48,9 +48,6 @@ public class PseudocodeVariablesData { private final Map> declaredVariablesForDeclaration = Maps.newHashMap(); private final Map> usedVariablesForDeclaration = Maps.newHashMap(); - private Map>> variableInitializersMap; - private Map>> variableStatusMap; - public PseudocodeVariablesData(@NotNull Pseudocode pseudocode, @NotNull BindingContext bindingContext) { this.pseudocode = pseudocode; this.bindingContext = bindingContext; @@ -127,10 +124,7 @@ public class PseudocodeVariablesData { @NotNull public Map>> getVariableInitializers() { - if (variableInitializersMap == null) { - variableInitializersMap = getVariableInitializers(pseudocode); - } - return variableInitializersMap; + return getVariableInitializers(pseudocode); } @NotNull @@ -248,57 +242,57 @@ public class PseudocodeVariablesData { @NotNull public Map>> getVariableUseStatusData() { - if (variableStatusMap == null) { - Map sinkInstructionData = Maps.newHashMap(); - for (VariableDescriptor usedVariable : usedVariablesForDeclaration.get(pseudocode)) { - sinkInstructionData.put(usedVariable, VariableUseState.UNUSED); - } - InstructionDataMergeStrategy> collectVariableUseStatusStrategy = new InstructionDataMergeStrategy>() { - @Override - public Edges> execute(@NotNull Instruction instruction, - @NotNull Collection> incomingEdgesData) { - - Map enterResult = Maps.newHashMap(); - for (Map edgeData : incomingEdgesData) { - for (Map.Entry entry : edgeData.entrySet()) { - VariableDescriptor variableDescriptor = entry.getKey(); - VariableUseState variableUseState = entry.getValue(); - enterResult.put(variableDescriptor, variableUseState.merge(enterResult.get(variableDescriptor))); - } - } - VariableDescriptor variableDescriptor = PseudocodeUtil.extractVariableDescriptorIfAny(instruction, true, - bindingContext); - if (variableDescriptor == null || - (!(instruction instanceof ReadValueInstruction) && !(instruction instanceof WriteValueInstruction))) { - return Edges.create(enterResult, enterResult); - } - Map exitResult = Maps.newHashMap(enterResult); - if (instruction instanceof ReadValueInstruction) { - exitResult.put(variableDescriptor, VariableUseState.LAST_READ); - } - else { //instruction instanceof WriteValueInstruction - VariableUseState variableUseState = enterResult.get(variableDescriptor); - if (variableUseState == null) { - variableUseState = VariableUseState.UNUSED; - } - switch (variableUseState) { - case UNUSED: - case ONLY_WRITTEN_NEVER_READ: - exitResult.put(variableDescriptor, VariableUseState.ONLY_WRITTEN_NEVER_READ); - break; - case LAST_WRITTEN: - case LAST_READ: - exitResult.put(variableDescriptor, VariableUseState.LAST_WRITTEN); - } - } - return Edges.create(enterResult, exitResult); - } - }; - variableStatusMap = PseudocodeTraverser.collectData(pseudocode, BACKWARD, ANALYSE_LOCAL_DECLARATIONS, - Collections.emptyMap(), - sinkInstructionData, collectVariableUseStatusStrategy); + Map sinkInstructionData = Maps.newHashMap(); + for (VariableDescriptor usedVariable : getUsedVariables(pseudocode)) { + sinkInstructionData.put(usedVariable, VariableUseState.UNUSED); } - return variableStatusMap; + InstructionDataMergeStrategy> collectVariableUseStatusStrategy = + new InstructionDataMergeStrategy>() { + @Override + public Edges> execute( + @NotNull Instruction instruction, + @NotNull Collection> incomingEdgesData + ) { + + Map enterResult = Maps.newHashMap(); + for (Map edgeData : incomingEdgesData) { + for (Map.Entry entry : edgeData.entrySet()) { + VariableDescriptor variableDescriptor = entry.getKey(); + VariableUseState variableUseState = entry.getValue(); + enterResult.put(variableDescriptor, variableUseState.merge(enterResult.get(variableDescriptor))); + } + } + VariableDescriptor variableDescriptor = PseudocodeUtil.extractVariableDescriptorIfAny(instruction, true, + bindingContext); + if (variableDescriptor == null || + (!(instruction instanceof ReadValueInstruction) && !(instruction instanceof WriteValueInstruction))) { + return Edges.create(enterResult, enterResult); + } + Map exitResult = Maps.newHashMap(enterResult); + if (instruction instanceof ReadValueInstruction) { + exitResult.put(variableDescriptor, VariableUseState.LAST_READ); + } + else { //instruction instanceof WriteValueInstruction + VariableUseState variableUseState = enterResult.get(variableDescriptor); + if (variableUseState == null) { + variableUseState = VariableUseState.UNUSED; + } + switch (variableUseState) { + case UNUSED: + case ONLY_WRITTEN_NEVER_READ: + exitResult.put(variableDescriptor, VariableUseState.ONLY_WRITTEN_NEVER_READ); + break; + case LAST_WRITTEN: + case LAST_READ: + exitResult.put(variableDescriptor, VariableUseState.LAST_WRITTEN); + } + } + return Edges.create(enterResult, exitResult); + } + }; + return PseudocodeTraverser.collectData(pseudocode, BACKWARD, ANALYSE_LOCAL_DECLARATIONS, + Collections.emptyMap(), + sinkInstructionData, collectVariableUseStatusStrategy); } public static class VariableInitState {