[llvm] 9a7d80a - Revert "[BasicAA] Use known lower bounds for index values for size based check."
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Sat Jun 20 02:06:30 PDT 2020
Author: Florian Hahn
Date: 2020-06-20T10:06:05+01:00
New Revision: 9a7d80a32c8d9c1559f90b7eed93788570f09c41
URL: https://github.com/llvm/llvm-project/commit/9a7d80a32c8d9c1559f90b7eed93788570f09c41
DIFF: https://github.com/llvm/llvm-project/commit/9a7d80a32c8d9c1559f90b7eed93788570f09c41.diff
LOG: Revert "[BasicAA] Use known lower bounds for index values for size based check."
This potentially related to https://bugs.llvm.org/show_bug.cgi?id=46335
and causes a slight compile-time regression. Revert while investigating.
This reverts commit d99a1848c4f8ca164c0c0768e10eafc850b2a68a.
Added:
Modified:
llvm/include/llvm/Analysis/BasicAliasAnalysis.h
llvm/lib/Analysis/BasicAliasAnalysis.cpp
llvm/test/Analysis/BasicAA/assume-index-positive.ll
llvm/test/Analysis/BasicAA/bug.23626.ll
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/BasicAliasAnalysis.h b/llvm/include/llvm/Analysis/BasicAliasAnalysis.h
index fdab033f7003..403510dbb3a3 100644
--- a/llvm/include/llvm/Analysis/BasicAliasAnalysis.h
+++ b/llvm/include/llvm/Analysis/BasicAliasAnalysis.h
@@ -140,11 +140,6 @@ class BasicAAResult : public AAResultBase<BasicAAResult> {
// Total constant offset w.r.t the base from indexing through
// pointers/arrays/vectors
APInt OtherOffset;
- // Constant offset w.r.t the base from indexing through
- // pointers/arrays/vectors, including the lower bounds of index variables,
- // if there are any. Currently only known non-negative lower bounds are
- // added.
- APInt MinOtherOffset;
// Scaled variable (non-constant) indices.
SmallVector<VariableGEPIndex, 4> VarIndices;
// Is GEP index scale compile-time constant.
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp
index a55443b7ec6f..5fdfb7d49073 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"
@@ -565,11 +564,10 @@ bool BasicAAResult::DecomposeGEPExpression(const Value *V,
if (const ConstantInt *CIdx = dyn_cast<ConstantInt>(Index)) {
if (CIdx->isZero())
continue;
- APInt Offset = (DL.getTypeAllocSize(GTI.getIndexedType()) *
- CIdx->getValue().sextOrSelf(MaxPointerSize))
- .sextOrTrunc(MaxPointerSize);
- Decomposed.OtherOffset += Offset;
- Decomposed.MinOtherOffset += Offset;
+ Decomposed.OtherOffset +=
+ (DL.getTypeAllocSize(GTI.getIndexedType()).getFixedSize() *
+ CIdx->getValue().sextOrSelf(MaxPointerSize))
+ .sextOrTrunc(MaxPointerSize);
continue;
}
@@ -613,18 +611,7 @@ bool BasicAAResult::DecomposeGEPExpression(const Value *V,
if (PointerSize > Width)
SExtBits += PointerSize - Width;
} else {
- APInt Offset = IndexOffset.sextOrTrunc(MaxPointerSize) * Scale;
- Decomposed.OtherOffset += Offset;
- APInt IndexBound =
- computeConstantRange(Index, true, AC, dyn_cast<Instruction>(GEPOp))
- .getLower()
- .sextOrTrunc(MaxPointerSize);
- // If we find a non-negative lower bound for the index value, we can
- // improve the known offset to include it. By just using non-negative
- // lower bounds, we conveniently skip any index values for which we do
- // not find a useful lower bound.
- if (IndexBound.isNonNegative())
- Decomposed.MinOtherOffset += Offset + IndexBound * Scale;
+ Decomposed.OtherOffset += IndexOffset.sextOrTrunc(MaxPointerSize) * Scale;
Scale *= IndexScale.sextOrTrunc(MaxPointerSize);
}
@@ -1341,8 +1328,6 @@ AliasResult BasicAAResult::aliasGEP(
DecompGEP2.StructOffset = DecompGEP2.OtherOffset = APInt(MaxPointerSize, 0);
DecompGEP1.HasCompileTimeConstantScale =
DecompGEP2.HasCompileTimeConstantScale = true;
- DecompGEP1.MinOtherOffset = APInt(MaxPointerSize, 0);
- DecompGEP2.MinOtherOffset = APInt(MaxPointerSize, 0);
bool GEP1MaxLookupReached =
DecomposeGEPExpression(GEP1, DecompGEP1, DL, &AC, DT);
@@ -1357,8 +1342,6 @@ AliasResult BasicAAResult::aliasGEP(
APInt GEP1BaseOffset = DecompGEP1.StructOffset + DecompGEP1.OtherOffset;
APInt GEP2BaseOffset = DecompGEP2.StructOffset + DecompGEP2.OtherOffset;
- APInt GEP1BaseOffsetMin = DecompGEP1.StructOffset + DecompGEP1.MinOtherOffset;
- APInt GEP2BaseOffsetMin = DecompGEP2.StructOffset + DecompGEP2.MinOtherOffset;
assert(DecompGEP1.Base == UnderlyingV1 && DecompGEP2.Base == UnderlyingV2 &&
"DecomposeGEPExpression returned a result
diff erent from "
@@ -1433,7 +1416,6 @@ AliasResult BasicAAResult::aliasGEP(
// Subtract the GEP2 pointer from the GEP1 pointer to find out their
// symbolic
diff erence.
GEP1BaseOffset -= GEP2BaseOffset;
- GEP1BaseOffsetMin -= GEP2BaseOffsetMin;
GetIndexDifference(DecompGEP1.VarIndices, DecompGEP2.VarIndices);
} else {
@@ -1552,11 +1534,10 @@ AliasResult BasicAAResult::aliasGEP(
// If we know all the variables are positive, then GEP1 >= GEP1BasePtr.
// If GEP1BasePtr > V2 (GEP1BaseOffset > 0) then we know the pointers
// don't alias if V2Size can fit in the gap between V2 and GEP1BasePtr.
- if (AllPositive && GEP1BaseOffsetMin.sgt(0) &&
+ if (AllPositive && GEP1BaseOffset.sgt(0) &&
V2Size != LocationSize::unknown() &&
- GEP1BaseOffsetMin.uge(V2Size.getValue())) {
+ GEP1BaseOffset.uge(V2Size.getValue()))
return NoAlias;
- }
if (constantOffsetHeuristic(DecompGEP1.VarIndices, V1Size, V2Size,
GEP1BaseOffset, &AC, DT))
diff --git a/llvm/test/Analysis/BasicAA/assume-index-positive.ll b/llvm/test/Analysis/BasicAA/assume-index-positive.ll
index 630620f0d8bd..d89738a23b03 100644
--- a/llvm/test/Analysis/BasicAA/assume-index-positive.ll
+++ b/llvm/test/Analysis/BasicAA/assume-index-positive.ll
@@ -113,86 +113,4 @@ define void @test4(double* %ptr, i32 %skip) {
ret void
}
-
-define void @test5(double* %ptr, i32 %stride) {
-; CHECK-LABEL: Function: test5: 4 pointers, 1 call sites
-; CHECK-NEXT: MustAlias: <6 x double>* %col.ptr.1, double* %ptr
-; CHECK-NEXT: NoAlias: double* %col.ptr.2, double* %ptr
-; CHECK-NEXT: MayAlias: <6 x double>* %col.ptr.1, double* %col.ptr.2
-; CHECK-NEXT: NoAlias: <6 x double>* %col.ptr.2.cast, double* %ptr
-; CHECK-NEXT: MayAlias: <6 x double>* %col.ptr.1, <6 x double>* %col.ptr.2.cast
-; CHECK-NEXT: MustAlias: <6 x double>* %col.ptr.2.cast, double* %col.ptr.2
-; CHECK-NEXT: NoModRef: Ptr: double* %ptr <-> call void @llvm.assume(i1 %gt)
-; CHECK-NEXT: NoModRef: Ptr: <6 x double>* %col.ptr.1 <-> call void @llvm.assume(i1 %gt)
-; CHECK-NEXT: NoModRef: Ptr: double* %col.ptr.2 <-> call void @llvm.assume(i1 %gt)
-; CHECK-NEXT: NoModRef: Ptr: <6 x double>* %col.ptr.2.cast <-> call void @llvm.assume(i1 %gt)
-;
- %gt = icmp sge i32 %stride, 5
- call void @llvm.assume(i1 %gt)
- %col.ptr.1 = bitcast double* %ptr to <6 x double>*
- %lv.1 = load <6 x double>, <6 x double>* %col.ptr.1, align 8
- %col.ptr.2= getelementptr double, double* %ptr, i32 %stride
- %col.ptr.2.cast = bitcast double* %col.ptr.2 to <6 x double>*
- %lv.2 = load <6 x double>, <6 x double>* %col.ptr.2.cast, align 8
- %res.1 = fadd <6 x double> %lv.1, %lv.1
- %res.2 = fadd <6 x double> %lv.2, %lv.2
- store <6 x double> %res.1, <6 x double>* %col.ptr.1, align 8
- store <6 x double> %res.2, <6 x double>* %col.ptr.2.cast, align 8
- ret void
-}
-
-define void @test6(double* %ptr, i32 %stride) {
-; CHECK-LABEL: Function: test6: 4 pointers, 1 call sites
-; CHECK-NEXT: MustAlias: <6 x double>* %col.ptr.1, double* %ptr
-; CHECK-NEXT: NoAlias: double* %col.ptr.2, double* %ptr
-; CHECK-NEXT: NoAlias: <6 x double>* %col.ptr.1, double* %col.ptr.2
-; CHECK-NEXT: NoAlias: <6 x double>* %col.ptr.2.cast, double* %ptr
-; CHECK-NEXT: NoAlias: <6 x double>* %col.ptr.1, <6 x double>* %col.ptr.2.cast
-; CHECK-NEXT: MustAlias: <6 x double>* %col.ptr.2.cast, double* %col.ptr.2
-; CHECK-NEXT: NoModRef: Ptr: double* %ptr <-> call void @llvm.assume(i1 %gt)
-; CHECK-NEXT: NoModRef: Ptr: <6 x double>* %col.ptr.1 <-> call void @llvm.assume(i1 %gt)
-; CHECK-NEXT: NoModRef: Ptr: double* %col.ptr.2 <-> call void @llvm.assume(i1 %gt)
-; CHECK-NEXT: NoModRef: Ptr: <6 x double>* %col.ptr.2.cast <-> call void @llvm.assume(i1 %gt)
-;
- %gt = icmp sge i32 %stride, 6
- call void @llvm.assume(i1 %gt)
- %col.ptr.1 = bitcast double* %ptr to <6 x double>*
- %lv.1 = load <6 x double>, <6 x double>* %col.ptr.1, align 8
- %col.ptr.2= getelementptr double, double* %ptr, i32 %stride
- %col.ptr.2.cast = bitcast double* %col.ptr.2 to <6 x double>*
- %lv.2 = load <6 x double>, <6 x double>* %col.ptr.2.cast, align 8
- %res.1 = fadd <6 x double> %lv.1, %lv.1
- %res.2 = fadd <6 x double> %lv.2, %lv.2
- store <6 x double> %res.1, <6 x double>* %col.ptr.1, align 8
- store <6 x double> %res.2, <6 x double>* %col.ptr.2.cast, align 8
- ret void
-}
-
-define void @test7(double* %ptr, i32 %stride) {
-; CHECK-LABEL: Function: test7: 4 pointers, 1 call sites
-; CHECK-NEXT: MustAlias: <6 x double>* %col.ptr.1, double* %ptr
-; CHECK-NEXT: MayAlias: double* %col.ptr.2, double* %ptr
-; CHECK-NEXT: MayAlias: <6 x double>* %col.ptr.1, double* %col.ptr.2
-; CHECK-NEXT: MayAlias: <6 x double>* %col.ptr.2.cast, double* %ptr
-; CHECK-NEXT: MayAlias: <6 x double>* %col.ptr.1, <6 x double>* %col.ptr.2.cast
-; CHECK-NEXT: MustAlias: <6 x double>* %col.ptr.2.cast, double* %col.ptr.2
-; CHECK-NEXT: NoModRef: Ptr: double* %ptr <-> call void @llvm.assume(i1 %gt)
-; CHECK-NEXT: NoModRef: Ptr: <6 x double>* %col.ptr.1 <-> call void @llvm.assume(i1 %gt)
-; CHECK-NEXT: NoModRef: Ptr: double* %col.ptr.2 <-> call void @llvm.assume(i1 %gt)
-; CHECK-NEXT: NoModRef: Ptr: <6 x double>* %col.ptr.2.cast <-> call void @llvm.assume(i1 %gt)
-;
- %gt = icmp sge i32 %stride, 0
- call void @llvm.assume(i1 %gt)
- %col.ptr.1 = bitcast double* %ptr to <6 x double>*
- %lv.1 = load <6 x double>, <6 x double>* %col.ptr.1, align 8
- %col.ptr.2= getelementptr double, double* %ptr, i32 %stride
- %col.ptr.2.cast = bitcast double* %col.ptr.2 to <6 x double>*
- %lv.2 = load <6 x double>, <6 x double>* %col.ptr.2.cast, align 8
- %res.1 = fadd <6 x double> %lv.1, %lv.1
- %res.2 = fadd <6 x double> %lv.2, %lv.2
- store <6 x double> %res.1, <6 x double>* %col.ptr.1, align 8
- store <6 x double> %res.2, <6 x double>* %col.ptr.2.cast, align 8
- ret void
-}
-
declare void @llvm.assume(i1 %cond)
diff --git a/llvm/test/Analysis/BasicAA/bug.23626.ll b/llvm/test/Analysis/BasicAA/bug.23626.ll
index da423442759a..7d5b5ad06698 100644
--- a/llvm/test/Analysis/BasicAA/bug.23626.ll
+++ b/llvm/test/Analysis/BasicAA/bug.23626.ll
@@ -4,9 +4,9 @@ target triple = "x86_64-apple-darwin13.4.0"
; CHECK-LABEL: compute1
; CHECK: MayAlias: i32* %arrayidx8, i32* %out
-; CHECK: NoAlias: i32* %arrayidx11, i32* %out
+; CHECK: MayAlias: i32* %arrayidx11, i32* %out
; CHECK: MayAlias: i32* %arrayidx11, i32* %arrayidx8
-; CHECK: NoAlias: i32* %arrayidx14, i32* %out
+; CHECK: MayAlias: i32* %arrayidx14, i32* %out
; CHECK: MayAlias: i32* %arrayidx14, i32* %arrayidx8
; CHECK: MayAlias: i32* %arrayidx11, i32* %arrayidx14
define void @compute1(i32 %num.0.lcssa, i32* %out) {
More information about the llvm-commits
mailing list