Skip to content

Commit 4004e4d

Browse files
committed
[BasicAA] Scalable offset with scalable typesize.
This patch adds a simple alias analysis check for accesses that are scalable with a offset between them that is also trivially scalable (there are no other constant/variable offsets). We essentially divide each side by vscale and are left needing to check that the offset >= typesize.
1 parent 3421a4e commit 4004e4d

File tree

2 files changed

+49
-30
lines changed

2 files changed

+49
-30
lines changed

llvm/lib/Analysis/BasicAliasAnalysis.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,6 +1170,25 @@ AliasResult BasicAAResult::aliasGEP(
11701170
}
11711171
}
11721172

1173+
// VScale Alias Analysis - Given one scalable offset between accesses and a
1174+
// scalable typesize, we can divide each side by vscale, treating both values
1175+
// as a constant. We prove that Offset/vscale >= TypeSize/vscale.
1176+
if (DecompGEP1.VarIndices.size() == 1 && DecompGEP1.Offset.isZero() &&
1177+
PatternMatch::match(DecompGEP1.VarIndices[0].Val.V,
1178+
PatternMatch::m_VScale())) {
1179+
const VariableGEPIndex &ScalableVar = DecompGEP1.VarIndices[0];
1180+
APInt Scale =
1181+
ScalableVar.IsNegated ? -ScalableVar.Scale : ScalableVar.Scale;
1182+
LocationSize VLeftSize = Scale.isNegative() ? V1Size : V2Size;
1183+
1184+
// Note that we do not check that the typesize is scalable, as vscale >= 1
1185+
// so noalias still holds so long as the dependency distance is at least as
1186+
// big as the typesize.
1187+
if (VLeftSize.hasValue() &&
1188+
Scale.uge(VLeftSize.getValue().getKnownMinValue()))
1189+
return AliasResult::NoAlias;
1190+
}
1191+
11731192
// Bail on analysing scalable LocationSize
11741193
if (V1Size.isScalable() || V2Size.isScalable())
11751194
return AliasResult::MayAlias;

llvm/test/Analysis/BasicAA/vscale.ll

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -312,16 +312,16 @@ define void @v1v2types(ptr %p) vscale_range(1,16) {
312312
; VScale intrinsic offset tests
313313

314314
; CHECK-LABEL: vscale_neg_notscalable
315-
; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16
315+
; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16
316316
; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p
317317
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16
318318
; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16
319319
; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16
320-
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16
320+
; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16
321321
; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p
322322
; CHECK-DAG: NoAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16
323-
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16
324-
; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16
323+
; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16
324+
; CHECK-DAG: NoAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16
325325
define void @vscale_neg_notscalable(ptr %p) {
326326
%v = call i64 @llvm.vscale.i64()
327327
%vp = mul i64 %v, 16
@@ -339,16 +339,16 @@ define void @vscale_neg_notscalable(ptr %p) {
339339
}
340340

341341
; CHECK-LABEL: vscale_neg_scalable
342-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
342+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
343343
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p
344344
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16
345345
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16
346346
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16
347-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16
347+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16
348348
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p
349349
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16
350-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16
351-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16
350+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16
351+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16
352352
define void @vscale_neg_scalable(ptr %p) {
353353
%v = call i64 @llvm.vscale.i64()
354354
%vp = mul i64 %v, 16
@@ -366,16 +366,16 @@ define void @vscale_neg_scalable(ptr %p) {
366366
}
367367

368368
; CHECK-LABEL: vscale_pos_notscalable
369-
; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16
369+
; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16
370370
; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p
371371
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16
372372
; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16m16
373373
; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <4 x i32>* %vm16m16
374-
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16
374+
; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %vm16m16
375375
; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %p
376376
; CHECK-DAG: NoAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16
377-
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16
378-
; CHECK-DAG: MayAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16
377+
; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %m16pv16
378+
; CHECK-DAG: NoAlias: <4 x i32>* %m16pv16, <4 x i32>* %vm16m16
379379
define void @vscale_pos_notscalable(ptr %p) {
380380
%v = call i64 @llvm.vscale.i64()
381381
%vp = mul i64 %v, 16
@@ -393,16 +393,16 @@ define void @vscale_pos_notscalable(ptr %p) {
393393
}
394394

395395
; CHECK-LABEL: vscale_pos_scalable
396-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
396+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
397397
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p
398398
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16
399399
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16m16
400400
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vm16m16
401-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16
401+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16m16
402402
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %p
403403
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16
404-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16
405-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16
404+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %m16pv16
405+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %m16pv16, <vscale x 4 x i32>* %vm16m16
406406
define void @vscale_pos_scalable(ptr %p) {
407407
%v = call i64 @llvm.vscale.i64()
408408
%vp = mul i64 %v, 16
@@ -420,25 +420,25 @@ define void @vscale_pos_scalable(ptr %p) {
420420
}
421421

422422
; CHECK-LABEL: vscale_v1v2types
423-
; CHECK-DAG: MayAlias: <4 x i32>* %p, <vscale x 4 x i32>* %p
424-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
425-
; CHECK-DAG: MayAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vm16
426-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <4 x i32>* %vm16
427-
; CHECK-DAG: MayAlias: <4 x i32>* %p, <4 x i32>* %vm16
428-
; CHECK-DAG: MayAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vm16
423+
; CHECK-DAG: MustAlias: <4 x i32>* %p, <vscale x 4 x i32>* %p
424+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vm16
425+
; CHECK-DAG: NoAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vm16
426+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <4 x i32>* %vm16
427+
; CHECK-DAG: NoAlias: <4 x i32>* %p, <4 x i32>* %vm16
428+
; CHECK-DAG: MustAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vm16
429429
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %p
430430
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %p
431431
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vm16
432432
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <4 x i32>* %vm16
433-
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %p
434-
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %p
433+
; CHECK-DAG: NoAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %p
434+
; CHECK-DAG: NoAlias: <4 x i32>* %m16, <4 x i32>* %p
435435
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vm16
436436
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <4 x i32>* %vm16
437-
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %m16
438-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vp16
439-
; CHECK-DAG: MayAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vp16
440-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vp16
441-
; CHECK-DAG: MayAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vp16
437+
; CHECK-DAG: MustAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %m16
438+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %p, <vscale x 4 x i32>* %vp16
439+
; CHECK-DAG: NoAlias: <4 x i32>* %p, <vscale x 4 x i32>* %vp16
440+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vm16, <vscale x 4 x i32>* %vp16
441+
; CHECK-DAG: NoAlias: <4 x i32>* %vm16, <vscale x 4 x i32>* %vp16
442442
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %m16, <vscale x 4 x i32>* %vp16
443443
; CHECK-DAG: MayAlias: <4 x i32>* %m16, <vscale x 4 x i32>* %vp16
444444
define void @vscale_v1v2types(ptr %p) {
@@ -460,7 +460,7 @@ define void @vscale_v1v2types(ptr %p) {
460460

461461
; CHECK-LABEL: twovscales
462462
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp162
463-
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp161b
463+
; CHECK-DAG: NoAlias: <vscale x 4 x i32>* %vp161, <vscale x 4 x i32>* %vp161b
464464
; CHECK-DAG: MayAlias: <vscale x 4 x i32>* %vp161b, <vscale x 4 x i32>* %vp162
465465
define void @twovscales(ptr %p) {
466466
%v1 = call i64 @llvm.vscale.i64()

0 commit comments

Comments
 (0)