diff options
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 36 |
1 files changed, 5 insertions, 31 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 4a54c33..6be3778 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -31,7 +31,6 @@ #include "llvm/IR/Argument.h" #include "llvm/IR/Attributes.h" #include "llvm/IR/Constant.h" -#include "llvm/IR/ConstantRange.h" #include "llvm/IR/Constants.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/DerivedTypes.h" @@ -1317,24 +1316,13 @@ AliasResult BasicAAResult::aliasGEP( return AliasResult::NoAlias; if (V1Size.hasValue() && V2Size.hasValue()) { - // Try to determine the range of values for VarIndex. - // VarIndexRange is such that: - // (VarIndex <= -MinAbsVarIndex || MinAbsVarIndex <= VarIndex) && - // VarIndexRange.contains(VarIndex) + // Try to determine whether abs(VarIndex) > 0. Optional<APInt> MinAbsVarIndex; - Optional<ConstantRange> VarIndexRange; if (DecompGEP1.VarIndices.size() == 1) { - // VarIndex = Scale*V. + // VarIndex = Scale*V. If V != 0 then abs(VarIndex) >= abs(Scale). const VariableGEPIndex &Var = DecompGEP1.VarIndices[0]; - if (isKnownNonZero(Var.Val.V, DL, 0, &AC, Var.CxtI, DT)) { - // If V != 0 then abs(VarIndex) >= abs(Scale). + if (isKnownNonZero(Var.Val.V, DL, 0, &AC, Var.CxtI, DT)) MinAbsVarIndex = Var.Scale.abs(); - } - ConstantRange R = Var.Val.evaluateWith( - computeConstantRange(Var.Val.V, true, &AC, Var.CxtI)); - if (!R.isFullSet() && !R.isEmptySet()) - VarIndexRange = R.sextOrTrunc(Var.Scale.getBitWidth()) - .multiply(ConstantRange(Var.Scale)); } else if (DecompGEP1.VarIndices.size() == 2) { // VarIndex = Scale*V0 + (-Scale)*V1. // If V0 != V1 then abs(VarIndex) >= abs(Scale). @@ -1353,26 +1341,12 @@ AliasResult BasicAAResult::aliasGEP( // The constant offset will have added at least +/-MinAbsVarIndex to it. APInt OffsetLo = DecompGEP1.Offset - *MinAbsVarIndex; APInt OffsetHi = DecompGEP1.Offset + *MinAbsVarIndex; - // We know that Offset <= OffsetLo || Offset >= OffsetHi + // Check that an access at OffsetLo or lower, and an access at OffsetHi + // or higher both do not alias. if (OffsetLo.isNegative() && (-OffsetLo).uge(V1Size.getValue()) && OffsetHi.isNonNegative() && OffsetHi.uge(V2Size.getValue())) return AliasResult::NoAlias; } - - if (VarIndexRange) { - ConstantRange OffsetRange = - VarIndexRange->add(ConstantRange(DecompGEP1.Offset)); - - // We know that Offset >= MinOffset. - // (MinOffset >= V2Size) => (Offset >= V2Size) => NoAlias. - if (OffsetRange.getSignedMin().sge(V2Size.getValue())) - return AliasResult::NoAlias; - - // We know that Offset <= MaxOffset. - // (MaxOffset <= -V1Size) => (Offset <= -V1Size) => NoAlias. - if (OffsetRange.getSignedMax().sle(-V1Size.getValue())) - return AliasResult::NoAlias; - } } if (constantOffsetHeuristic(DecompGEP1, V1Size, V2Size, &AC, DT)) |