From 8718f8b5dcb09626e444cbb24198c9bccfc82cb3 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 16 Apr 2014 19:57:15 +0200 Subject: [PATCH] replace DfaMemoryStateImpl.areEquivalent with a more efficient version requiring less eq class traversals (IDEA-123826) --- .../codeInspection/dataFlow/DfaMemoryStateImpl.java | 13 ++++--------- .../codeInspection/dataFlow/StateMerger.java | 3 ++- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java index a50e75af42c3..6f374b1f5d95 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaMemoryStateImpl.java @@ -268,13 +268,8 @@ public class DfaMemoryStateImpl implements DfaMemoryState { return myEqClasses.size() - 1; } - boolean areEquivalent(DfaValue val1, DfaValue val2) { - int index = getEqClassIndex(val1); - return index >= 0 && index == getEqClassIndex(val2); - } - @NotNull - private List getEqClassesFor(@NotNull DfaValue dfaValue) { + List getEquivalentValues(@NotNull DfaValue dfaValue) { int index = getEqClassIndex(dfaValue); EqClass set = index == -1 ? null : myEqClasses.get(index); if (set == null) { @@ -284,7 +279,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { } private boolean canBeNaN(@NotNull DfaValue dfaValue) { - for (DfaValue eq : getEqClassesFor(dfaValue)) { + for (DfaValue eq : getEquivalentValues(dfaValue)) { if (eq instanceof DfaBoxedValue) { eq = ((DfaBoxedValue)eq).getWrappedValue(); } @@ -298,7 +293,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { private boolean isEffectivelyNaN(@NotNull DfaValue dfaValue) { - for (DfaValue eqClass : getEqClassesFor(dfaValue)) { + for (DfaValue eqClass : getEquivalentValues(dfaValue)) { if (isNaN(eqClass)) return true; } return false; @@ -323,7 +318,7 @@ public class DfaMemoryStateImpl implements DfaMemoryState { } if (valueToWrap instanceof DfaVariableValue) { if (PsiType.BOOLEAN.equals(((DfaVariableValue)valueToWrap).getVariableType())) return true; - for (DfaValue value : getEqClassesFor(valueToWrap)) { + for (DfaValue value : getEquivalentValues(valueToWrap)) { if (value instanceof DfaConstValue && cacheable((DfaConstValue)value)) return true; } } diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java index d691469db9e1..1fa65263de27 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/StateMerger.java @@ -118,9 +118,10 @@ class StateMerger { private static Set getOtherInequalities(Fact removedFact, LinkedHashSet memberFacts, DfaMemoryStateImpl state) { Set otherInequalities = ContainerUtil.newLinkedHashSet(); + Set eqValues = ContainerUtil.newHashSet(state.getEquivalentValues((DfaValue)removedFact.myArg)); for (Fact candidate : memberFacts) { if (candidate.myType == FactType.equality && !candidate.myPositive && candidate.myVar == removedFact.myVar && - !state.areEquivalent((DfaValue)candidate.myArg, (DfaValue)removedFact.myArg) && + !eqValues.contains((DfaValue)candidate.myArg) && candidate.myArg instanceof DfaConstValue) { otherInequalities.add((DfaConstValue)candidate.myArg); }