diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index ae31814bb0673..682b0a2ecacb3 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1187,7 +1187,7 @@ AliasResult BasicAAResult::aliasGEP( // so noalias still holds so long as the dependency distance is at least as // big as the typesize. if (VLeftSize.hasValue() && - Scale.uge(VLeftSize.getValue().getKnownMinValue())) + Scale.abs().uge(VLeftSize.getValue().getKnownMinValue())) return AliasResult::NoAlias; } diff --git a/llvm/test/Analysis/BasicAA/vscale.ll b/llvm/test/Analysis/BasicAA/vscale.ll index ce0c6f145d1c8..b2f5c66be5bb2 100644 --- a/llvm/test/Analysis/BasicAA/vscale.ll +++ b/llvm/test/Analysis/BasicAA/vscale.ll @@ -458,6 +458,17 @@ define void @vscale_v1v2types(ptr %p) { ret void } +; CHECK-LABEL: vscale_negativescale +; CHECK-DAG: MayAlias: * %p, * %vm16 +define void @vscale_negativescale(ptr %p) vscale_range(1,16) { + %v = call i64 @llvm.vscale.i64() + %vm = mul nsw i64 %v, -15 + %vm16 = getelementptr i8, ptr %p, i64 %vm + load , ptr %vm16 + load , ptr %p + ret void +} + ; CHECK-LABEL: twovscales ; CHECK-DAG: MayAlias: * %vp161, * %vp162 ; CHECK-DAG: MayAlias: * %vp161, * %vp161b