Skip to content

Commit 0e73ebc

Browse files
authored
[Delinearization] Improve debug messages (#156339)
improve debug messages in delinearization
1 parent 5edeb6c commit 0e73ebc

21 files changed

+29
-92
lines changed

llvm/lib/Analysis/Delinearization.cpp

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ void llvm::collectParametricTerms(ScalarEvolution &SE, const SCEV *Expr,
182182
LLVM_DEBUG({
183183
dbgs() << "Strides:\n";
184184
for (const SCEV *S : Strides)
185-
dbgs() << *S << "\n";
185+
dbgs().indent(2) << *S << "\n";
186186
});
187187

188188
for (const SCEV *S : Strides) {
@@ -193,7 +193,7 @@ void llvm::collectParametricTerms(ScalarEvolution &SE, const SCEV *Expr,
193193
LLVM_DEBUG({
194194
dbgs() << "Terms:\n";
195195
for (const SCEV *T : Terms)
196-
dbgs() << *T << "\n";
196+
dbgs().indent(2) << *T << "\n";
197197
});
198198

199199
SCEVCollectAddRecMultiplies MulCollector(Terms, SE);
@@ -294,7 +294,7 @@ void llvm::findArrayDimensions(ScalarEvolution &SE,
294294
LLVM_DEBUG({
295295
dbgs() << "Terms:\n";
296296
for (const SCEV *T : Terms)
297-
dbgs() << *T << "\n";
297+
dbgs().indent(2) << *T << "\n";
298298
});
299299

300300
// Remove duplicates.
@@ -325,7 +325,7 @@ void llvm::findArrayDimensions(ScalarEvolution &SE,
325325
LLVM_DEBUG({
326326
dbgs() << "Terms after sorting:\n";
327327
for (const SCEV *T : NewTerms)
328-
dbgs() << *T << "\n";
328+
dbgs().indent(2) << *T << "\n";
329329
});
330330

331331
if (NewTerms.empty() || !findArrayDimensionsRec(SE, NewTerms, Sizes)) {
@@ -339,7 +339,7 @@ void llvm::findArrayDimensions(ScalarEvolution &SE,
339339
LLVM_DEBUG({
340340
dbgs() << "Sizes:\n";
341341
for (const SCEV *S : Sizes)
342-
dbgs() << *S << "\n";
342+
dbgs().indent(2) << *S << "\n";
343343
});
344344
}
345345

@@ -354,18 +354,24 @@ void llvm::computeAccessFunctions(ScalarEvolution &SE, const SCEV *Expr,
354354
if (!AR->isAffine())
355355
return;
356356

357+
LLVM_DEBUG(dbgs() << "\ncomputeAccessFunctions\n"
358+
<< "Memory Access Function: " << *Expr << "\n");
359+
357360
const SCEV *Res = Expr;
358361
int Last = Sizes.size() - 1;
362+
359363
for (int i = Last; i >= 0; i--) {
364+
const SCEV *Size = Sizes[i];
360365
const SCEV *Q, *R;
361-
SCEVDivision::divide(SE, Res, Sizes[i], &Q, &R);
366+
367+
SCEVDivision::divide(SE, Res, Size, &Q, &R);
362368

363369
LLVM_DEBUG({
364-
dbgs() << "Res: " << *Res << "\n";
365-
dbgs() << "Sizes[i]: " << *Sizes[i] << "\n";
366-
dbgs() << "Res divided by Sizes[i]:\n";
367-
dbgs() << "Quotient: " << *Q << "\n";
368-
dbgs() << "Remainder: " << *R << "\n";
370+
dbgs() << "Computing 'MemAccFn / Sizes[" << i << "]':\n";
371+
dbgs() << " MemAccFn: " << *Res << "\n";
372+
dbgs() << " Sizes[" << i << "]: " << *Size << "\n";
373+
dbgs() << " Quotient (Leftover): " << *Q << "\n";
374+
dbgs() << " Remainder (Subscript Access Function): " << *R << "\n";
369375
});
370376

371377
Res = Q;
@@ -397,7 +403,8 @@ void llvm::computeAccessFunctions(ScalarEvolution &SE, const SCEV *Expr,
397403
LLVM_DEBUG({
398404
dbgs() << "Subscripts:\n";
399405
for (const SCEV *S : Subscripts)
400-
dbgs() << *S << "\n";
406+
dbgs().indent(2) << *S << "\n";
407+
dbgs() << "\n";
401408
});
402409
}
403410

@@ -469,21 +476,6 @@ void llvm::delinearize(ScalarEvolution &SE, const SCEV *Expr,
469476

470477
// Third step: compute the access functions for each subscript.
471478
computeAccessFunctions(SE, Expr, Subscripts, Sizes);
472-
473-
if (Subscripts.empty())
474-
return;
475-
476-
LLVM_DEBUG({
477-
dbgs() << "succeeded to delinearize " << *Expr << "\n";
478-
dbgs() << "ArrayDecl[UnknownSize]";
479-
for (const SCEV *S : Sizes)
480-
dbgs() << "[" << *S << "]";
481-
482-
dbgs() << "\nArrayRef";
483-
for (const SCEV *S : Subscripts)
484-
dbgs() << "[" << *S << "]";
485-
dbgs() << "\n";
486-
});
487479
}
488480

489481
static std::optional<APInt> tryIntoAPInt(const SCEV *S) {
@@ -671,6 +663,7 @@ bool llvm::getIndexExpressionsFromGEP(ScalarEvolution &SE,
671663
assert(Subscripts.empty() && Sizes.empty() &&
672664
"Expected output lists to be empty on entry to this function.");
673665
assert(GEP && "getIndexExpressionsFromGEP called with a null GEP");
666+
LLVM_DEBUG(dbgs() << "\nGEP to delinearize: " << *GEP << "\n");
674667
Type *Ty = nullptr;
675668
bool DroppedFirstDim = false;
676669
for (unsigned i = 1; i < GEP->getNumOperands(); i++) {
@@ -688,6 +681,8 @@ bool llvm::getIndexExpressionsFromGEP(ScalarEvolution &SE,
688681

689682
auto *ArrayTy = dyn_cast<ArrayType>(Ty);
690683
if (!ArrayTy) {
684+
LLVM_DEBUG(dbgs() << "GEP delinearize failed: " << *Ty
685+
<< " is not an array type.\n");
691686
Subscripts.clear();
692687
Sizes.clear();
693688
return false;
@@ -699,6 +694,13 @@ bool llvm::getIndexExpressionsFromGEP(ScalarEvolution &SE,
699694

700695
Ty = ArrayTy->getElementType();
701696
}
697+
LLVM_DEBUG({
698+
dbgs() << "Subscripts:\n";
699+
for (const SCEV *S : Subscripts)
700+
dbgs() << *S << "\n";
701+
dbgs() << "\n";
702+
});
703+
702704
return !Subscripts.empty();
703705
}
704706

@@ -769,7 +771,6 @@ void printDelinearization(raw_ostream &O, Function *F, LoopInfo *LI,
769771

770772
O << "\n";
771773
O << "Inst:" << Inst << "\n";
772-
O << "In Loop with Header: " << L->getHeader()->getName() << "\n";
773774
O << "AccessFunction: " << *AccessFn << "\n";
774775

775776
SmallVector<const SCEV *, 3> Subscripts, Sizes;

llvm/test/Analysis/Delinearization/a.ll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
define void @foo(i64 %n, i64 %m, i64 %o, ptr nocapture %A) #0 {
1212
; CHECK-LABEL: 'foo'
1313
; CHECK-NEXT: Inst: store i32 1, ptr %arrayidx11.us.us, align 4
14-
; CHECK-NEXT: In Loop with Header: for.k
1514
; CHECK-NEXT: AccessFunction: {{\{\{\{}}(28 + (4 * (-4 + (3 * %m)) * %o)),+,(8 * %m * %o)}<%for.i>,+,(12 * %o)}<%for.j>,+,20}<%for.k>
1615
; CHECK-NEXT: Base offset: %A
1716
; CHECK-NEXT: ArrayDecl[UnknownSize][%m][%o] with elements of 4 bytes.

llvm/test/Analysis/Delinearization/byte_offset.ll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
define void @foo(ptr %A, i64 %i2, i64 %arg, i1 %c) {
1414
; CHECK-LABEL: 'foo'
1515
; CHECK-NEXT: Inst: store float 0.000000e+00, ptr %arrayidx, align 4
16-
; CHECK-NEXT: In Loop with Header: inner.loop
1716
; CHECK-NEXT: AccessFunction: ({0,+,%i2}<%outer.loop> + %unknown)
1817
; CHECK-NEXT: failed to delinearize
1918
;

llvm/test/Analysis/Delinearization/constant_functions_multi_dim.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,12 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
77
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 {
88
; CHECK-LABEL: 'mat_mul'
99
; CHECK-NEXT: Inst: %tmp = load float, ptr %arrayidx, align 4
10-
; CHECK-NEXT: In Loop with Header: for.inc
1110
; CHECK-NEXT: AccessFunction: {(4 * %N * %call),+,4}<%for.inc>
1211
; CHECK-NEXT: Base offset: %A
1312
; CHECK-NEXT: ArrayDecl[UnknownSize][%N] with elements of 4 bytes.
1413
; CHECK-NEXT: ArrayRef[%call][{0,+,1}<nuw><nsw><%for.inc>]
1514
; CHECK-EMPTY:
1615
; CHECK-NEXT: Inst: %tmp5 = load float, ptr %arrayidx4, align 4
17-
; CHECK-NEXT: In Loop with Header: for.inc
1816
; CHECK-NEXT: AccessFunction: {(4 * %call1),+,(4 * %N)}<%for.inc>
1917
; CHECK-NEXT: Base offset: %B
2018
; CHECK-NEXT: ArrayDecl[UnknownSize][%N] with elements of 4 bytes.

llvm/test/Analysis/Delinearization/divide_by_one.ll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,12 @@ target datalayout = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32"
1414
define void @test(ptr nocapture %dst, i32 %stride, i32 %bs) {
1515
; CHECK-LABEL: 'test'
1616
; CHECK-NEXT: Inst: %0 = load i8, ptr %arrayidx, align 1
17-
; CHECK-NEXT: In Loop with Header: for.body3
1817
; CHECK-NEXT: AccessFunction: {{\{\{}}(-1 + ((1 + %bs) * %stride)),+,(-1 * %stride)}<%for.cond1.preheader>,+,1}<nw><%for.body3>
1918
; CHECK-NEXT: Base offset: %dst
2019
; CHECK-NEXT: ArrayDecl[UnknownSize][%stride] with elements of 1 bytes.
2120
; CHECK-NEXT: ArrayRef[{(1 + %bs),+,-1}<nw><%for.cond1.preheader>][{-1,+,1}<nw><%for.body3>]
2221
; CHECK-EMPTY:
2322
; CHECK-NEXT: Inst: store i8 %0, ptr %arrayidx7, align 1
24-
; CHECK-NEXT: In Loop with Header: for.body3
2523
; CHECK-NEXT: AccessFunction: {{\{\{}}(%stride * %bs),+,(-1 * %stride)}<%for.cond1.preheader>,+,1}<nsw><%for.body3>
2624
; CHECK-NEXT: Base offset: %dst
2725
; CHECK-NEXT: ArrayDecl[UnknownSize][%stride] with elements of 1 bytes.

llvm/test/Analysis/Delinearization/fixed_size_array.ll

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
define void @a_i_j_k(ptr %a) {
1212
; CHECK-LABEL: 'a_i_j_k'
1313
; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4
14-
; CHECK-NEXT: In Loop with Header: for.k
1514
; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1024}<nuw><nsw><%for.i.header>,+,128}<nw><%for.j.header>,+,4}<nw><%for.k>
1615
; CHECK-NEXT: Base offset: %a
1716
; CHECK-NEXT: ArrayDecl[UnknownSize][8][32] with elements of 4 bytes.
@@ -60,7 +59,6 @@ exit:
6059
define void @a_i_nj_k(ptr %a) {
6160
; CHECK-LABEL: 'a_i_nj_k'
6261
; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4
63-
; CHECK-NEXT: In Loop with Header: for.k
6462
; CHECK-NEXT: AccessFunction: {{\{\{\{}}896,+,1024}<nuw><nsw><%for.i.header>,+,-128}<nw><%for.j.header>,+,4}<nw><%for.k>
6563
; CHECK-NEXT: Base offset: %a
6664
; CHECK-NEXT: ArrayDecl[UnknownSize][8][32] with elements of 4 bytes.
@@ -116,14 +114,12 @@ exit:
116114
define void @a_ijk_b_i2jk(ptr %a, ptr %b) {
117115
; CHECK-LABEL: 'a_ijk_b_i2jk'
118116
; CHECK-NEXT: Inst: store i32 1, ptr %a.idx, align 4
119-
; CHECK-NEXT: In Loop with Header: for.k
120117
; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1024}<nuw><nsw><%for.i.header>,+,256}<nw><%for.j.header>,+,4}<nw><%for.k>
121118
; CHECK-NEXT: Base offset: %a
122119
; CHECK-NEXT: ArrayDecl[UnknownSize][4][64] with elements of 4 bytes.
123120
; CHECK-NEXT: ArrayRef[{0,+,1}<nuw><nsw><%for.i.header>][{0,+,1}<nuw><nsw><%for.j.header>][{0,+,1}<nuw><nsw><%for.k>]
124121
; CHECK-EMPTY:
125122
; CHECK-NEXT: Inst: store i32 1, ptr %b.idx, align 4
126-
; CHECK-NEXT: In Loop with Header: for.k
127123
; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1024}<nuw><nsw><%for.i.header>,+,256}<nw><%for.j.header>,+,4}<nw><%for.k>
128124
; CHECK-NEXT: Base offset: %b
129125
; CHECK-NEXT: ArrayDecl[UnknownSize][4][64] with elements of 4 bytes.
@@ -180,7 +176,6 @@ exit:
180176
define void @a_i_2j1_k(ptr %a) {
181177
; CHECK-LABEL: 'a_i_2j1_k'
182178
; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4
183-
; CHECK-NEXT: In Loop with Header: for.k
184179
; CHECK-NEXT: AccessFunction: {{\{\{\{}}128,+,1024}<nuw><nsw><%for.i.header>,+,256}<nw><%for.j.header>,+,4}<nw><%for.k>
185180
; CHECK-NEXT: Base offset: %a
186181
; CHECK-NEXT: ArrayDecl[UnknownSize][4][64] with elements of 4 bytes.
@@ -234,7 +229,6 @@ exit:
234229
define void @a_i_3j_k(ptr %a) {
235230
; CHECK-LABEL: 'a_i_3j_k'
236231
; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4
237-
; CHECK-NEXT: In Loop with Header: for.k
238232
; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1024}<nuw><nsw><%for.i.header>,+,384}<nw><%for.j.header>,+,4}<nw><%for.k>
239233
; CHECK-NEXT: failed to delinearize
240234
;
@@ -286,7 +280,6 @@ exit:
286280
define void @a_i_j_3k(ptr %a) {
287281
; CHECK-LABEL: 'a_i_j_3k'
288282
; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4
289-
; CHECK-NEXT: In Loop with Header: for.k
290283
; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1024}<nuw><nsw><%for.i.header>,+,128}<nw><%for.j.header>,+,12}<nw><%for.k>
291284
; CHECK-NEXT: Base offset: %a
292285
; CHECK-NEXT: ArrayDecl[UnknownSize][8][32] with elements of 4 bytes.
@@ -338,7 +331,6 @@ exit:
338331
define void @a_i_j2k_i(ptr %a) {
339332
; CHECK-LABEL: 'a_i_j2k_i'
340333
; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4
341-
; CHECK-NEXT: In Loop with Header: for.k
342334
; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1028}<%for.i.header>,+,256}<nw><%for.j.header>,+,128}<nw><%for.k>
343335
; CHECK-NEXT: failed to delinearize
344336
;
@@ -390,7 +382,6 @@ exit:
390382
define void @a_i_i_jk(ptr %a) {
391383
; CHECK-LABEL: 'a_i_i_jk'
392384
; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4
393-
; CHECK-NEXT: In Loop with Header: for.k
394385
; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1152}<%for.i.header>,+,4}<nw><%for.j.header>,+,4}<nw><%for.k>
395386
; CHECK-NEXT: Base offset: %a
396387
; CHECK-NEXT: ArrayDecl[UnknownSize][288] with elements of 4 bytes.
@@ -441,7 +432,6 @@ exit:
441432
define void @a_i_jk_l(ptr %a) {
442433
; CHECK-LABEL: 'a_i_jk_l'
443434
; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4
444-
; CHECK-NEXT: In Loop with Header: for.l
445435
; CHECK-NEXT: AccessFunction: {{\{\{\{\{}}0,+,1024}<nuw><nsw><%for.i.header>,+,128}<nw><%for.j.header>,+,128}<nw><%for.k.header>,+,4}<nw><%for.l>
446436
; CHECK-NEXT: Base offset: %a
447437
; CHECK-NEXT: ArrayDecl[UnknownSize][8][32] with elements of 4 bytes.
@@ -502,7 +492,6 @@ exit:
502492
define void @non_divisible_by_element_size(ptr %a) {
503493
; CHECK-LABEL: 'non_divisible_by_element_size'
504494
; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4
505-
; CHECK-NEXT: In Loop with Header: for.k
506495
; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,256}<nuw><nsw><%for.i.header>,+,32}<nw><%for.j.header>,+,1}<nw><%for.k>
507496
; CHECK-NEXT: failed to delinearize
508497
;

0 commit comments

Comments
 (0)