aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/BasicAliasAnalysis.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r--llvm/lib/Analysis/BasicAliasAnalysis.cpp36
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))