Skip to content

Commit a2541ca

Browse files
committed
use update_analyze_test_checks.py in delinearization testcases
After adapting the output of printDelinearization() to match what the script expects to see, "Printing analysis 'Delinearization' for function", and registering the "Delinearization" pass in the update script, the rest of the patch automatically removes the existing CHECK statements and update the tests with a run of: ``` $ ~/llvm-project/llvm/utils/update_analyze_test_checks.py --opt=~/llvm-project/build/bin/opt ~/llvm-project/llvm/test/Analysis/Delinearization/*.ll ``` The patch also drops llvm/test/Analysis/Delinearization/undef.ll because the test does not pass the github-actions "undef deprecator."
1 parent 76d993b commit a2541ca

23 files changed

+469
-229
lines changed

llvm/lib/Analysis/Delinearization.cpp

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -744,45 +744,48 @@ namespace {
744744

745745
void printDelinearization(raw_ostream &O, Function *F, LoopInfo *LI,
746746
ScalarEvolution *SE) {
747-
O << "Delinearization on function " << F->getName() << ":\n";
747+
O << "Printing analysis 'Delinearization' for function '" << F->getName()
748+
<< "':";
748749
for (Instruction &Inst : instructions(F)) {
749750
// Only analyze loads and stores.
750-
if (!isa<StoreInst>(&Inst) && !isa<LoadInst>(&Inst) &&
751-
!isa<GetElementPtrInst>(&Inst))
751+
if (!isa<StoreInst>(&Inst) && !isa<LoadInst>(&Inst))
752752
continue;
753753

754754
const BasicBlock *BB = Inst.getParent();
755-
// Delinearize the memory access as analyzed in all the surrounding loops.
755+
Loop *L = LI->getLoopFor(BB);
756+
// Only delinearize the memory access in the innermost loop.
756757
// Do not analyze memory accesses outside loops.
757-
for (Loop *L = LI->getLoopFor(BB); L != nullptr; L = L->getParentLoop()) {
758-
const SCEV *AccessFn = SE->getSCEVAtScope(getPointerOperand(&Inst), L);
758+
if (!L)
759+
continue;
759760

760-
const SCEVUnknown *BasePointer =
761-
dyn_cast<SCEVUnknown>(SE->getPointerBase(AccessFn));
762-
// Do not delinearize if we cannot find the base pointer.
763-
if (!BasePointer)
764-
break;
765-
AccessFn = SE->getMinusSCEV(AccessFn, BasePointer);
761+
const SCEV *AccessFn = SE->getSCEVAtScope(getPointerOperand(&Inst), L);
766762

767-
O << "\n";
768-
O << "Inst:" << Inst << "\n";
769-
O << "In Loop with Header: " << L->getHeader()->getName() << "\n";
770-
O << "AccessFunction: " << *AccessFn << "\n";
763+
const SCEVUnknown *BasePointer =
764+
dyn_cast<SCEVUnknown>(SE->getPointerBase(AccessFn));
765+
// Do not delinearize if we cannot find the base pointer.
766+
if (!BasePointer)
767+
break;
768+
AccessFn = SE->getMinusSCEV(AccessFn, BasePointer);
771769

772-
SmallVector<const SCEV *, 3> Subscripts, Sizes;
770+
O << "\n";
771+
O << "Inst:" << Inst << "\n";
772+
O << "In Loop with Header: " << L->getHeader()->getName() << "\n";
773+
O << "AccessFunction: " << *AccessFn << "\n";
773774

774-
auto IsDelinearizationFailed = [&]() {
775-
return Subscripts.size() == 0 || Sizes.size() == 0 ||
776-
Subscripts.size() != Sizes.size();
777-
};
775+
SmallVector<const SCEV *, 3> Subscripts, Sizes;
778776

779-
delinearize(*SE, AccessFn, Subscripts, Sizes, SE->getElementSize(&Inst));
780-
if (UseFixedSizeArrayHeuristic && IsDelinearizationFailed()) {
781-
Subscripts.clear();
782-
Sizes.clear();
783-
delinearizeFixedSizeArray(*SE, AccessFn, Subscripts, Sizes,
784-
SE->getElementSize(&Inst));
785-
}
777+
auto IsDelinearizationFailed = [&]() {
778+
return Subscripts.size() == 0 || Sizes.size() == 0 ||
779+
Subscripts.size() != Sizes.size();
780+
};
781+
782+
delinearize(*SE, AccessFn, Subscripts, Sizes, SE->getElementSize(&Inst));
783+
if (UseFixedSizeArrayHeuristic && IsDelinearizationFailed()) {
784+
Subscripts.clear();
785+
Sizes.clear();
786+
delinearizeFixedSizeArray(*SE, AccessFn, Subscripts, Sizes,
787+
SE->getElementSize(&Inst));
788+
}
786789

787790
if (IsDelinearizationFailed()) {
788791
O << "failed to delinearize\n";
@@ -800,7 +803,6 @@ void printDelinearization(raw_ostream &O, Function *F, LoopInfo *LI,
800803
for (int i = 0; i < Size; i++)
801804
O << "[" << *Subscripts[i] << "]";
802805
O << "\n";
803-
}
804806
}
805807
}
806808

llvm/test/Analysis/Delinearization/a.ll

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
12
; RUN: opt < %s -passes='print<delinearization>' -disable-output 2>&1 | FileCheck %s
23
;
34
; void foo(long n, long m, long o, int A[n][m][o]) {
@@ -7,12 +8,15 @@
78
; A[2*i+3][3*j-4][5*k+7] = 1;
89
; }
910

10-
; AddRec: {{{(28 + (4 * (-4 + (3 * %m)) * %o) + %A),+,(8 * %m * %o)}<%for.i>,+,(12 * %o)}<%for.j>,+,20}<%for.k>
11-
; CHECK: Base offset: %A
12-
; CHECK: ArrayDecl[UnknownSize][%m][%o] with elements of 4 bytes.
13-
; CHECK: ArrayRef[{3,+,2}<nuw><%for.i>][{-4,+,3}<nw><%for.j>][{7,+,5}<nw><%for.k>]
14-
1511
define void @foo(i64 %n, i64 %m, i64 %o, ptr nocapture %A) #0 {
12+
; CHECK-LABEL: 'foo'
13+
; CHECK-NEXT: Inst: store i32 1, ptr %arrayidx11.us.us, align 4
14+
; CHECK-NEXT: In Loop with Header: for.k
15+
; CHECK-NEXT: AccessFunction: {{\{\{\{}}(28 + (4 * (-4 + (3 * %m)) * %o)),+,(8 * %m * %o)}<%for.i>,+,(12 * %o)}<%for.j>,+,20}<%for.k>
16+
; CHECK-NEXT: Base offset: %A
17+
; CHECK-NEXT: ArrayDecl[UnknownSize][%m][%o] with elements of 4 bytes.
18+
; CHECK-NEXT: ArrayRef[{3,+,2}<nuw><%for.i>][{-4,+,3}<nw><%for.j>][{7,+,5}<nw><%for.k>]
19+
;
1620
entry:
1721
%cmp32 = icmp sgt i64 %n, 0
1822
br i1 %cmp32, label %for.cond1.preheader.lr.ph, label %for.end17

llvm/test/Analysis/Delinearization/byte_offset.ll

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
12
; RUN: opt < %s -passes='print<delinearization>' -disable-output 2>&1 | FileCheck %s
23

3-
; CHECK: AccessFunction: ({0,+,%i2}<%outer.loop> + %unknown)
4-
; CHECK-NEXT: failed to delinearize
5-
64
; void foo(char A[], long i2, bool c) {
75
; for (long i = 0; ; ++i) {
86
; char *tmp = &A[i * i2];
@@ -13,6 +11,12 @@
1311
; }
1412

1513
define void @foo(ptr %A, i64 %i2, i64 %arg, i1 %c) {
14+
; CHECK-LABEL: 'foo'
15+
; CHECK-NEXT: Inst: store float 0.000000e+00, ptr %arrayidx, align 4
16+
; CHECK-NEXT: In Loop with Header: inner.loop
17+
; CHECK-NEXT: AccessFunction: ({0,+,%i2}<%outer.loop> + %unknown)
18+
; CHECK-NEXT: failed to delinearize
19+
;
1620
entry:
1721
br label %outer.loop
1822

llvm/test/Analysis/Delinearization/constant_functions_multi_dim.ll

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,25 @@
1-
; RUN: opt -passes='print<delinearization>' -disable-output < %s 2>&1 | FileCheck %s
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2+
; RUN: opt < %s -passes='print<delinearization>' -disable-output 2>&1 | FileCheck %s
23

34
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
45

5-
; CHECK: Inst: %tmp = load float, ptr %arrayidx, align 4
6-
; CHECK-NEXT: In Loop with Header: for.inc
7-
; CHECK-NEXT: AccessFunction: {(4 * %N * %call),+,4}<%for.inc>
8-
; CHECK-NEXT: Base offset: %A
9-
; CHECK-NEXT: ArrayDecl[UnknownSize][%N] with elements of 4 bytes.
10-
; CHECK-NEXT: ArrayRef[%call][{0,+,1}<nuw><nsw><%for.inc>]
11-
12-
; CHECK: Inst: %tmp5 = load float, ptr %arrayidx4, align 4
13-
; CHECK-NEXT: In Loop with Header: for.inc
14-
; CHECK-NEXT: AccessFunction: {(4 * %call1),+,(4 * %N)}<%for.inc>
15-
; CHECK-NEXT: Base offset: %B
16-
; CHECK-NEXT: ArrayDecl[UnknownSize][%N] with elements of 4 bytes.
17-
; CHECK-NEXT: ArrayRef[{0,+,1}<nuw><nsw><%for.inc>][%call1]
18-
196
; Function Attrs: noinline nounwind uwtable
207
define void @mat_mul(ptr %C, ptr %A, ptr %B, i64 %N) #0 !kernel_arg_addr_space !2 !kernel_arg_access_qual !3 !kernel_arg_type !4 !kernel_arg_base_type !4 !kernel_arg_type_qual !5 {
8+
; CHECK-LABEL: 'mat_mul'
9+
; CHECK-NEXT: Inst: %tmp = load float, ptr %arrayidx, align 4
10+
; CHECK-NEXT: In Loop with Header: for.inc
11+
; CHECK-NEXT: AccessFunction: {(4 * %N * %call),+,4}<%for.inc>
12+
; CHECK-NEXT: Base offset: %A
13+
; CHECK-NEXT: ArrayDecl[UnknownSize][%N] with elements of 4 bytes.
14+
; CHECK-NEXT: ArrayRef[%call][{0,+,1}<nuw><nsw><%for.inc>]
15+
; CHECK-EMPTY:
16+
; CHECK-NEXT: Inst: %tmp5 = load float, ptr %arrayidx4, align 4
17+
; CHECK-NEXT: In Loop with Header: for.inc
18+
; CHECK-NEXT: AccessFunction: {(4 * %call1),+,(4 * %N)}<%for.inc>
19+
; CHECK-NEXT: Base offset: %B
20+
; CHECK-NEXT: ArrayDecl[UnknownSize][%N] with elements of 4 bytes.
21+
; CHECK-NEXT: ArrayRef[{0,+,1}<nuw><nsw><%for.inc>][%call1]
22+
;
2123
entry:
2224
br label %entry.split
2325

llvm/test/Analysis/Delinearization/divide_by_one.ll

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
12
; RUN: opt < %s -passes='print<delinearization>' -disable-output 2>&1 | FileCheck %s
23

34
target datalayout = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32"
@@ -10,19 +11,22 @@ target datalayout = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32"
1011
; dst[r * stride + c] = dst[(r + 1) * stride + c - 1];
1112
; }
1213

13-
; AddRec: {{(-1 + ((1 + %bs) * %stride)),+,(-1 * %stride)}<%for.cond1.preheader>,+,1}<nw><%for.body3>
14-
; CHECK: Inst: %0 = load i8, ptr %arrayidx, align 1
15-
; CHECK: Base offset: %dst
16-
; CHECK: ArrayDecl[UnknownSize][%stride] with elements of 1 bytes.
17-
; CHECK: ArrayRef[{(1 + %bs),+,-1}<nw><%for.cond1.preheader>][{-1,+,1}<nw><%for.body3>]
18-
19-
; AddRec: {{(ptr %bs),+,(-1 * %stride)}<%for.cond1.preheader>,+,1}<nw><%for.body3>
20-
; CHECK: Inst: store i8 %0, ptr %arrayidx7, align 1
21-
; CHECK: Base offset: %dst
22-
; CHECK: ArrayDecl[UnknownSize][%stride] with elements of 1 bytes.
23-
; CHECK: ArrayRef[{%bs,+,-1}<nsw><%for.cond1.preheader>][{0,+,1}<nuw><nsw><%for.body3>]
24-
2514
define void @test(ptr nocapture %dst, i32 %stride, i32 %bs) {
15+
; CHECK-LABEL: 'test'
16+
; CHECK-NEXT: Inst: %0 = load i8, ptr %arrayidx, align 1
17+
; CHECK-NEXT: In Loop with Header: for.body3
18+
; CHECK-NEXT: AccessFunction: {{\{\{}}(-1 + ((1 + %bs) * %stride)),+,(-1 * %stride)}<%for.cond1.preheader>,+,1}<nw><%for.body3>
19+
; CHECK-NEXT: Base offset: %dst
20+
; CHECK-NEXT: ArrayDecl[UnknownSize][%stride] with elements of 1 bytes.
21+
; CHECK-NEXT: ArrayRef[{(1 + %bs),+,-1}<nw><%for.cond1.preheader>][{-1,+,1}<nw><%for.body3>]
22+
; CHECK-EMPTY:
23+
; CHECK-NEXT: Inst: store i8 %0, ptr %arrayidx7, align 1
24+
; CHECK-NEXT: In Loop with Header: for.body3
25+
; CHECK-NEXT: AccessFunction: {{\{\{}}(%stride * %bs),+,(-1 * %stride)}<%for.cond1.preheader>,+,1}<nsw><%for.body3>
26+
; CHECK-NEXT: Base offset: %dst
27+
; CHECK-NEXT: ArrayDecl[UnknownSize][%stride] with elements of 1 bytes.
28+
; CHECK-NEXT: ArrayRef[{%bs,+,-1}<nsw><%for.cond1.preheader>][{0,+,1}<nuw><nsw><%for.body3>]
29+
;
2630
entry:
2731
%cmp20 = icmp sgt i32 %bs, -1
2832
br i1 %cmp20, label %for.cond1.preheader.lr.ph, label %for.end9

0 commit comments

Comments
 (0)