diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 19c4393add6ab..ae31814bb0673 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -1170,6 +1170,27 @@ AliasResult BasicAAResult::aliasGEP( } } + // VScale Alias Analysis - Given one scalable offset between accesses and a + // scalable typesize, we can divide each side by vscale, treating both values + // as a constant. We prove that Offset/vscale >= TypeSize/vscale. + if (DecompGEP1.VarIndices.size() == 1 && DecompGEP1.VarIndices[0].IsNSW && + DecompGEP1.VarIndices[0].Val.TruncBits == 0 && + DecompGEP1.Offset.isZero() && + PatternMatch::match(DecompGEP1.VarIndices[0].Val.V, + PatternMatch::m_VScale())) { + const VariableGEPIndex &ScalableVar = DecompGEP1.VarIndices[0]; + APInt Scale = + ScalableVar.IsNegated ? -ScalableVar.Scale : ScalableVar.Scale; + LocationSize VLeftSize = Scale.isNegative() ? V1Size : V2Size; + + // Note that we do not check that the typesize is scalable, as vscale >= 1 + // 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())) + return AliasResult::NoAlias; + } + // Bail on analysing scalable LocationSize if (V1Size.isScalable() || V2Size.isScalable()) return AliasResult::MayAlias; diff --git a/llvm/test/Analysis/BasicAA/vscale.ll b/llvm/test/Analysis/BasicAA/vscale.ll index 1b9118bf3853a..ce0c6f145d1c8 100644 --- a/llvm/test/Analysis/BasicAA/vscale.ll +++ b/llvm/test/Analysis/BasicAA/vscale.ll @@ -339,15 +339,15 @@ define void @vscale_neg_notscalable(ptr %p) { } ; CHECK-LABEL: vscale_neg_scalable -; CHECK-DAG: MayAlias: * %p, * %vm16 +; CHECK-DAG: NoAlias: * %p, * %vm16 ; CHECK-DAG: MayAlias: * %m16, * %p ; CHECK-DAG: MayAlias: * %m16, * %vm16 ; CHECK-DAG: MayAlias: * %p, * %vm16m16 ; CHECK-DAG: MayAlias: * %vm16, * %vm16m16 -; CHECK-DAG: MayAlias: * %m16, * %vm16m16 +; CHECK-DAG: NoAlias: * %m16, * %vm16m16 ; CHECK-DAG: MayAlias: * %m16pv16, * %p ; CHECK-DAG: MayAlias: * %m16pv16, * %vm16 -; CHECK-DAG: MayAlias: * %m16, * %m16pv16 +; CHECK-DAG: NoAlias: * %m16, * %m16pv16 ; CHECK-DAG: MayAlias: * %m16pv16, * %vm16m16 define void @vscale_neg_scalable(ptr %p) { %v = call i64 @llvm.vscale.i64() @@ -393,15 +393,15 @@ define void @vscale_pos_notscalable(ptr %p) { } ; CHECK-LABEL: vscale_pos_scalable -; CHECK-DAG: MayAlias: * %p, * %vm16 +; CHECK-DAG: NoAlias: * %p, * %vm16 ; CHECK-DAG: MayAlias: * %m16, * %p ; CHECK-DAG: MayAlias: * %m16, * %vm16 ; CHECK-DAG: MayAlias: * %p, * %vm16m16 ; CHECK-DAG: MayAlias: * %vm16, * %vm16m16 -; CHECK-DAG: MayAlias: * %m16, * %vm16m16 +; CHECK-DAG: NoAlias: * %m16, * %vm16m16 ; CHECK-DAG: MayAlias: * %m16pv16, * %p ; CHECK-DAG: MayAlias: * %m16pv16, * %vm16 -; CHECK-DAG: MayAlias: * %m16, * %m16pv16 +; CHECK-DAG: NoAlias: * %m16, * %m16pv16 ; CHECK-DAG: MayAlias: * %m16pv16, * %vm16m16 define void @vscale_pos_scalable(ptr %p) { %v = call i64 @llvm.vscale.i64() @@ -421,9 +421,9 @@ define void @vscale_pos_scalable(ptr %p) { ; CHECK-LABEL: vscale_v1v2types ; CHECK-DAG: MustAlias: <4 x i32>* %p, * %p -; CHECK-DAG: MayAlias: * %p, * %vm16 -; CHECK-DAG: MayAlias: <4 x i32>* %p, * %vm16 -; CHECK-DAG: MayAlias: * %p, <4 x i32>* %vm16 +; CHECK-DAG: NoAlias: * %p, * %vm16 +; CHECK-DAG: NoAlias: <4 x i32>* %p, * %vm16 +; CHECK-DAG: NoAlias: * %p, <4 x i32>* %vm16 ; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16 ; CHECK-DAG: MustAlias: <4 x i32>* %vm16, * %vm16 ; CHECK-DAG: MayAlias: * %m16, * %p @@ -435,8 +435,8 @@ define void @vscale_pos_scalable(ptr %p) { ; CHECK-DAG: MayAlias: <4 x i32>* %m16, * %vm16 ; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16 ; CHECK-DAG: MustAlias: <4 x i32>* %m16, * %m16 -; CHECK-DAG: MayAlias: * %p, * %vp16 -; CHECK-DAG: MayAlias: <4 x i32>* %p, * %vp16 +; CHECK-DAG: NoAlias: * %p, * %vp16 +; CHECK-DAG: NoAlias: <4 x i32>* %p, * %vp16 ; CHECK-DAG: MayAlias: * %vm16, * %vp16 ; CHECK-DAG: MayAlias: <4 x i32>* %vm16, * %vp16 ; CHECK-DAG: MayAlias: * %m16, * %vp16