diff options
author | Clement Courbet <courbet@google.com> | 2021-10-06 16:47:34 +0200 |
---|---|---|
committer | Clement Courbet <courbet@google.com> | 2021-10-06 16:49:10 +0200 |
commit | ff41fc07b12bd7bf3c8cd238824b16b1066fe5a0 (patch) | |
tree | 67c8b4514f756dfb27b47212c8e2c1e101feda5a /llvm/lib/Analysis/BasicAliasAnalysis.cpp | |
parent | 0dcd2b40e6879542d708fdb9dcfdcbcaffdc2ce7 (diff) | |
download | llvm-ff41fc07b12bd7bf3c8cd238824b16b1066fe5a0.zip llvm-ff41fc07b12bd7bf3c8cd238824b16b1066fe5a0.tar.gz llvm-ff41fc07b12bd7bf3c8cd238824b16b1066fe5a0.tar.bz2 |
Revert "[AA] Teach BasicAA to recognize basic GEP range information."
We have found a miscompile with this change, reverting while working on a
reproducer.
This reverts commit 455b60ccfbfdbb5d2b652666050544c31e6673b1.
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)) |