diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1288,8 +1288,12 @@ if (V1Size.hasValue() && V2Size.hasValue()) { // Try to determine whether abs(VarIndex) > 0. Optional MinAbsVarIndex; - // TODO: Could handle single non-zero index as well. - if (DecompGEP1.VarIndices.size() == 2) { + if (DecompGEP1.VarIndices.size() == 1) { + // VarIndex = Scale*V. If V != 0 then abs(VarIndex) >= abs(Scale). + const VariableGEPIndex &Var = DecompGEP1.VarIndices[0]; + if (isKnownNonZero(Var.V, DL)) + MinAbsVarIndex = Var.Scale.abs(); + } else if (DecompGEP1.VarIndices.size() == 2) { // VarIndex = Scale*V0 + (-Scale)*V1. // If V0 != V1 then abs(VarIndex) >= abs(Scale). // Check that VisitedPhiBBs is empty, to avoid reasoning about diff --git a/llvm/test/Analysis/BasicAA/bug.23626.ll b/llvm/test/Analysis/BasicAA/bug.23626.ll --- a/llvm/test/Analysis/BasicAA/bug.23626.ll +++ b/llvm/test/Analysis/BasicAA/bug.23626.ll @@ -4,9 +4,9 @@ ; CHECK-LABEL: compute1 ; CHECK: MayAlias: i32* %arrayidx8, i32* %out -; CHECK: MayAlias: i32* %arrayidx11, i32* %out +; CHECK: NoAlias: i32* %arrayidx11, i32* %out ; CHECK: MayAlias: i32* %arrayidx11, i32* %arrayidx8 -; CHECK: MayAlias: i32* %arrayidx14, i32* %out +; CHECK: NoAlias: 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) { diff --git a/llvm/test/Analysis/BasicAA/sequential-gep.ll b/llvm/test/Analysis/BasicAA/sequential-gep.ll --- a/llvm/test/Analysis/BasicAA/sequential-gep.ll +++ b/llvm/test/Analysis/BasicAA/sequential-gep.ll @@ -111,10 +111,9 @@ } ; CHECK-LABEL: non_zero_index_simple -; CHECK: MayAlias: i32* %gep, i32* %p -; CHECK: MayAlias: i16* %gep.16, i32* %p +; CHECK: NoAlias: i32* %gep, i32* %p +; CHECK: NoAlias: i16* %gep.16, i32* %p ; CHECK: MayAlias: i32* %p, i64* %gep.64 -; TODO: First two could be NoAlias. define void @non_zero_index_simple(i32* %p, i32* %q) { %knownnonzero = load i32, i32* %q, !range !0 %gep = getelementptr i32, i32* %p, i32 %knownnonzero @@ -125,8 +124,7 @@ ; CHECK-LABEL: non_zero_index_with_offset ; CHECK: MayAlias: i32* %gep, i32* %p -; CHECK: MayAlias: i16* %gep.16, i32* %p -; TODO: Last could be NoAlias. +; CHECK: NoAlias: i16* %gep.16, i32* %p define void @non_zero_index_with_offset(i32* %p, i32* %q) { %knownnonzero = load i32, i32* %q, !range !0 %p.8 = bitcast i32* %p to i8*