diff --git a/llvm/lib/Analysis/Delinearization.cpp b/llvm/lib/Analysis/Delinearization.cpp index 762d9191aab1e..4b60ec332a270 100644 --- a/llvm/lib/Analysis/Delinearization.cpp +++ b/llvm/lib/Analysis/Delinearization.cpp @@ -182,7 +182,7 @@ void llvm::collectParametricTerms(ScalarEvolution &SE, const SCEV *Expr, LLVM_DEBUG({ dbgs() << "Strides:\n"; for (const SCEV *S : Strides) - dbgs() << *S << "\n"; + dbgs() << " " << *S << "\n"; }); for (const SCEV *S : Strides) { @@ -193,7 +193,7 @@ void llvm::collectParametricTerms(ScalarEvolution &SE, const SCEV *Expr, LLVM_DEBUG({ dbgs() << "Terms:\n"; for (const SCEV *T : Terms) - dbgs() << *T << "\n"; + dbgs() << " " << *T << "\n"; }); SCEVCollectAddRecMultiplies MulCollector(Terms, SE); @@ -294,7 +294,7 @@ void llvm::findArrayDimensions(ScalarEvolution &SE, LLVM_DEBUG({ dbgs() << "Terms:\n"; for (const SCEV *T : Terms) - dbgs() << *T << "\n"; + dbgs() << " " << *T << "\n"; }); // Remove duplicates. @@ -325,7 +325,7 @@ void llvm::findArrayDimensions(ScalarEvolution &SE, LLVM_DEBUG({ dbgs() << "Terms after sorting:\n"; for (const SCEV *T : NewTerms) - dbgs() << *T << "\n"; + dbgs() << " " << *T << "\n"; }); if (NewTerms.empty() || !findArrayDimensionsRec(SE, NewTerms, Sizes)) { @@ -339,7 +339,7 @@ void llvm::findArrayDimensions(ScalarEvolution &SE, LLVM_DEBUG({ dbgs() << "Sizes:\n"; for (const SCEV *S : Sizes) - dbgs() << *S << "\n"; + dbgs() << " " << *S << "\n"; }); } @@ -354,18 +354,27 @@ void llvm::computeAccessFunctions(ScalarEvolution &SE, const SCEV *Expr, if (!AR->isAffine()) return; + // Clear output vector. + Subscripts.clear(); + + LLVM_DEBUG(dbgs() << "\ncomputeAccessFunctions\n" + << "Memory Access Function: " << *Expr << "\n"); + const SCEV *Res = Expr; int Last = Sizes.size() - 1; + for (int i = Last; i >= 0; i--) { + const SCEV *Size = Sizes[i]; const SCEV *Q, *R; - SCEVDivision::divide(SE, Res, Sizes[i], &Q, &R); + + SCEVDivision::divide(SE, Res, Size, &Q, &R); LLVM_DEBUG({ - dbgs() << "Res: " << *Res << "\n"; - dbgs() << "Sizes[i]: " << *Sizes[i] << "\n"; - dbgs() << "Res divided by Sizes[i]:\n"; - dbgs() << "Quotient: " << *Q << "\n"; - dbgs() << "Remainder: " << *R << "\n"; + dbgs() << "Computing 'MemAccFn / Sizes[" << i << "]':\n"; + dbgs() << " MemAccFn: " << *Res << "\n"; + dbgs() << " Sizes[" << i << "]: " << *Size << "\n"; + dbgs() << " Quotient (Leftover): " << *Q << "\n"; + dbgs() << " Remainder (Subscript Access Function): " << *R << "\n"; }); Res = Q; @@ -397,7 +406,8 @@ void llvm::computeAccessFunctions(ScalarEvolution &SE, const SCEV *Expr, LLVM_DEBUG({ dbgs() << "Subscripts:\n"; for (const SCEV *S : Subscripts) - dbgs() << *S << "\n"; + dbgs() << " " << *S << "\n"; + dbgs() << "\n"; }); } @@ -454,6 +464,10 @@ void llvm::delinearize(ScalarEvolution &SE, const SCEV *Expr, SmallVectorImpl &Subscripts, SmallVectorImpl &Sizes, const SCEV *ElementSize) { + // Clear output vectors. + Subscripts.clear(); + Sizes.clear(); + // First step: collect parametric terms. SmallVector Terms; collectParametricTerms(SE, Expr, Terms); @@ -469,21 +483,6 @@ void llvm::delinearize(ScalarEvolution &SE, const SCEV *Expr, // Third step: compute the access functions for each subscript. computeAccessFunctions(SE, Expr, Subscripts, Sizes); - - if (Subscripts.empty()) - return; - - LLVM_DEBUG({ - dbgs() << "succeeded to delinearize " << *Expr << "\n"; - dbgs() << "ArrayDecl[UnknownSize]"; - for (const SCEV *S : Sizes) - dbgs() << "[" << *S << "]"; - - dbgs() << "\nArrayRef"; - for (const SCEV *S : Subscripts) - dbgs() << "[" << *S << "]"; - dbgs() << "\n"; - }); } static std::optional tryIntoAPInt(const SCEV *S) { @@ -646,6 +645,9 @@ bool llvm::delinearizeFixedSizeArray(ScalarEvolution &SE, const SCEV *Expr, SmallVectorImpl &Subscripts, SmallVectorImpl &Sizes, const SCEV *ElementSize) { + // Clear output vectors. + Subscripts.clear(); + Sizes.clear(); // First step: find the fixed array size. SmallVector ConstSizes; @@ -671,6 +673,7 @@ bool llvm::getIndexExpressionsFromGEP(ScalarEvolution &SE, assert(Subscripts.empty() && Sizes.empty() && "Expected output lists to be empty on entry to this function."); assert(GEP && "getIndexExpressionsFromGEP called with a null GEP"); + LLVM_DEBUG(dbgs() << "\nGEP to delinearize: " << *GEP << "\n"); Type *Ty = nullptr; bool DroppedFirstDim = false; for (unsigned i = 1; i < GEP->getNumOperands(); i++) { @@ -683,28 +686,43 @@ bool llvm::getIndexExpressionsFromGEP(ScalarEvolution &SE, continue; } Subscripts.push_back(Expr); + LLVM_DEBUG(dbgs() << "Subscripts push_back: " << *Expr << "\n"); continue; } auto *ArrayTy = dyn_cast(Ty); if (!ArrayTy) { + LLVM_DEBUG(dbgs() << "GEP delinearize failed: " << *Ty + << " is not an array type.\n"); Subscripts.clear(); Sizes.clear(); return false; } Subscripts.push_back(Expr); + LLVM_DEBUG(dbgs() << "Subscripts push_back: " << *Expr << "\n"); if (!(DroppedFirstDim && i == 2)) Sizes.push_back(ArrayTy->getNumElements()); Ty = ArrayTy->getElementType(); } + LLVM_DEBUG({ + dbgs() << "Subscripts:\n"; + for (const SCEV *S : Subscripts) + dbgs() << *S << "\n"; + dbgs() << "\n"; + }); + return !Subscripts.empty(); } bool llvm::tryDelinearizeFixedSizeImpl( ScalarEvolution *SE, Instruction *Inst, const SCEV *AccessFn, SmallVectorImpl &Subscripts, SmallVectorImpl &Sizes) { + // Clear output vectors. + Subscripts.clear(); + Sizes.clear(); + Value *SrcPtr = getLoadStorePointerOperand(Inst); // Check the simple case where the array dimensions are fixed size. @@ -769,7 +787,6 @@ void printDelinearization(raw_ostream &O, Function *F, LoopInfo *LI, O << "\n"; O << "Inst:" << Inst << "\n"; - O << "In Loop with Header: " << L->getHeader()->getName() << "\n"; O << "AccessFunction: " << *AccessFn << "\n"; SmallVector Subscripts, Sizes; diff --git a/llvm/test/Analysis/Delinearization/a.ll b/llvm/test/Analysis/Delinearization/a.ll index 755c9baef9b8f..1830a3da77857 100644 --- a/llvm/test/Analysis/Delinearization/a.ll +++ b/llvm/test/Analysis/Delinearization/a.ll @@ -11,7 +11,6 @@ define void @foo(i64 %n, i64 %m, i64 %o, ptr nocapture %A) #0 { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: store i32 1, ptr %arrayidx11.us.us, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}(28 + (4 * (-4 + (3 * %m)) * %o)),+,(8 * %m * %o)}<%for.i>,+,(12 * %o)}<%for.j>,+,20}<%for.k> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%m][%o] with elements of 4 bytes. diff --git a/llvm/test/Analysis/Delinearization/byte_offset.ll b/llvm/test/Analysis/Delinearization/byte_offset.ll index 90b1f03329e44..743dcfcca6400 100644 --- a/llvm/test/Analysis/Delinearization/byte_offset.ll +++ b/llvm/test/Analysis/Delinearization/byte_offset.ll @@ -13,7 +13,6 @@ define void @foo(ptr %A, i64 %i2, i64 %arg, i1 %c) { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: store float 0.000000e+00, ptr %arrayidx, align 4 -; CHECK-NEXT: In Loop with Header: inner.loop ; CHECK-NEXT: AccessFunction: ({0,+,%i2}<%outer.loop> + %unknown) ; CHECK-NEXT: failed to delinearize ; diff --git a/llvm/test/Analysis/Delinearization/constant_functions_multi_dim.ll b/llvm/test/Analysis/Delinearization/constant_functions_multi_dim.ll index c0b1a0b9cddaf..0c0fb4170b148 100644 --- a/llvm/test/Analysis/Delinearization/constant_functions_multi_dim.ll +++ b/llvm/test/Analysis/Delinearization/constant_functions_multi_dim.ll @@ -7,14 +7,12 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 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 { ; CHECK-LABEL: 'mat_mul' ; CHECK-NEXT: Inst: %tmp = load float, ptr %arrayidx, align 4 -; CHECK-NEXT: In Loop with Header: for.inc ; CHECK-NEXT: AccessFunction: {(4 * %N * %call),+,4}<%for.inc> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%N] with elements of 4 bytes. ; CHECK-NEXT: ArrayRef[%call][{0,+,1}<%for.inc>] ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %tmp5 = load float, ptr %arrayidx4, align 4 -; CHECK-NEXT: In Loop with Header: for.inc ; CHECK-NEXT: AccessFunction: {(4 * %call1),+,(4 * %N)}<%for.inc> ; CHECK-NEXT: Base offset: %B ; CHECK-NEXT: ArrayDecl[UnknownSize][%N] with elements of 4 bytes. diff --git a/llvm/test/Analysis/Delinearization/divide_by_one.ll b/llvm/test/Analysis/Delinearization/divide_by_one.ll index 28fe5c50ae779..e812e65ba7fd7 100644 --- a/llvm/test/Analysis/Delinearization/divide_by_one.ll +++ b/llvm/test/Analysis/Delinearization/divide_by_one.ll @@ -14,14 +14,12 @@ target datalayout = "e-m:e-p:32:32-i1:32-i64:64-a:0-n32" define void @test(ptr nocapture %dst, i32 %stride, i32 %bs) { ; CHECK-LABEL: 'test' ; CHECK-NEXT: Inst: %0 = load i8, ptr %arrayidx, align 1 -; CHECK-NEXT: In Loop with Header: for.body3 ; CHECK-NEXT: AccessFunction: {{\{\{}}(-1 + ((1 + %bs) * %stride)),+,(-1 * %stride)}<%for.cond1.preheader>,+,1}<%for.body3> ; CHECK-NEXT: Base offset: %dst ; CHECK-NEXT: ArrayDecl[UnknownSize][%stride] with elements of 1 bytes. ; CHECK-NEXT: ArrayRef[{(1 + %bs),+,-1}<%for.cond1.preheader>][{-1,+,1}<%for.body3>] ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i8 %0, ptr %arrayidx7, align 1 -; CHECK-NEXT: In Loop with Header: for.body3 ; CHECK-NEXT: AccessFunction: {{\{\{}}(%stride * %bs),+,(-1 * %stride)}<%for.cond1.preheader>,+,1}<%for.body3> ; CHECK-NEXT: Base offset: %dst ; CHECK-NEXT: ArrayDecl[UnknownSize][%stride] with elements of 1 bytes. diff --git a/llvm/test/Analysis/Delinearization/fixed_size_array.ll b/llvm/test/Analysis/Delinearization/fixed_size_array.ll index 634850bb4a5a2..cecd1eacb1437 100644 --- a/llvm/test/Analysis/Delinearization/fixed_size_array.ll +++ b/llvm/test/Analysis/Delinearization/fixed_size_array.ll @@ -11,7 +11,6 @@ define void @a_i_j_k(ptr %a) { ; CHECK-LABEL: 'a_i_j_k' ; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1024}<%for.i.header>,+,128}<%for.j.header>,+,4}<%for.k> ; CHECK-NEXT: Base offset: %a ; CHECK-NEXT: ArrayDecl[UnknownSize][8][32] with elements of 4 bytes. @@ -60,7 +59,6 @@ exit: define void @a_i_nj_k(ptr %a) { ; CHECK-LABEL: 'a_i_nj_k' ; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}896,+,1024}<%for.i.header>,+,-128}<%for.j.header>,+,4}<%for.k> ; CHECK-NEXT: Base offset: %a ; CHECK-NEXT: ArrayDecl[UnknownSize][8][32] with elements of 4 bytes. @@ -116,14 +114,12 @@ exit: define void @a_ijk_b_i2jk(ptr %a, ptr %b) { ; CHECK-LABEL: 'a_ijk_b_i2jk' ; CHECK-NEXT: Inst: store i32 1, ptr %a.idx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1024}<%for.i.header>,+,256}<%for.j.header>,+,4}<%for.k> ; CHECK-NEXT: Base offset: %a ; CHECK-NEXT: ArrayDecl[UnknownSize][4][64] with elements of 4 bytes. ; CHECK-NEXT: ArrayRef[{0,+,1}<%for.i.header>][{0,+,1}<%for.j.header>][{0,+,1}<%for.k>] ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 1, ptr %b.idx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1024}<%for.i.header>,+,256}<%for.j.header>,+,4}<%for.k> ; CHECK-NEXT: Base offset: %b ; CHECK-NEXT: ArrayDecl[UnknownSize][4][64] with elements of 4 bytes. @@ -180,7 +176,6 @@ exit: define void @a_i_2j1_k(ptr %a) { ; CHECK-LABEL: 'a_i_2j1_k' ; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}128,+,1024}<%for.i.header>,+,256}<%for.j.header>,+,4}<%for.k> ; CHECK-NEXT: Base offset: %a ; CHECK-NEXT: ArrayDecl[UnknownSize][4][64] with elements of 4 bytes. @@ -234,7 +229,6 @@ exit: define void @a_i_3j_k(ptr %a) { ; CHECK-LABEL: 'a_i_3j_k' ; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1024}<%for.i.header>,+,384}<%for.j.header>,+,4}<%for.k> ; CHECK-NEXT: failed to delinearize ; @@ -286,7 +280,6 @@ exit: define void @a_i_j_3k(ptr %a) { ; CHECK-LABEL: 'a_i_j_3k' ; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1024}<%for.i.header>,+,128}<%for.j.header>,+,12}<%for.k> ; CHECK-NEXT: Base offset: %a ; CHECK-NEXT: ArrayDecl[UnknownSize][8][32] with elements of 4 bytes. @@ -338,7 +331,6 @@ exit: define void @a_i_j2k_i(ptr %a) { ; CHECK-LABEL: 'a_i_j2k_i' ; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1028}<%for.i.header>,+,256}<%for.j.header>,+,128}<%for.k> ; CHECK-NEXT: failed to delinearize ; @@ -390,7 +382,6 @@ exit: define void @a_i_i_jk(ptr %a) { ; CHECK-LABEL: 'a_i_i_jk' ; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,1152}<%for.i.header>,+,4}<%for.j.header>,+,4}<%for.k> ; CHECK-NEXT: Base offset: %a ; CHECK-NEXT: ArrayDecl[UnknownSize][288] with elements of 4 bytes. @@ -441,7 +432,6 @@ exit: define void @a_i_jk_l(ptr %a) { ; CHECK-LABEL: 'a_i_jk_l' ; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4 -; CHECK-NEXT: In Loop with Header: for.l ; CHECK-NEXT: AccessFunction: {{\{\{\{\{}}0,+,1024}<%for.i.header>,+,128}<%for.j.header>,+,128}<%for.k.header>,+,4}<%for.l> ; CHECK-NEXT: Base offset: %a ; CHECK-NEXT: ArrayDecl[UnknownSize][8][32] with elements of 4 bytes. @@ -502,7 +492,6 @@ exit: define void @non_divisible_by_element_size(ptr %a) { ; CHECK-LABEL: 'non_divisible_by_element_size' ; CHECK-NEXT: Inst: store i32 1, ptr %idx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,256}<%for.i.header>,+,32}<%for.j.header>,+,1}<%for.k> ; CHECK-NEXT: failed to delinearize ; diff --git a/llvm/test/Analysis/Delinearization/gcd_multiply_expr.ll b/llvm/test/Analysis/Delinearization/gcd_multiply_expr.ll index 3e4545289a450..a5af30011f487 100644 --- a/llvm/test/Analysis/Delinearization/gcd_multiply_expr.ll +++ b/llvm/test/Analysis/Delinearization/gcd_multiply_expr.ll @@ -29,142 +29,114 @@ define i32 @fn2() { ; CHECK-LABEL: 'fn2' ; CHECK-NEXT: Inst: store i32 %storemerge.i, ptr @a, align 4 -; CHECK-NEXT: In Loop with Header: for.cond2thread-pre-split.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %9 = load i8, ptr %arrayidx.i, align 1 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: (sext i32 {({(%1 * %2),+,1}<%for.cond2thread-pre-split.i> + %.pr.i),+,8}<%for.body4.i> to i64) ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %conv.i, ptr @c, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %inc.i, ptr @b, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %10 = load i8, ptr %arrayidx.1.i, align 1 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: (sext i32 {({(1 + (%1 * %2)),+,1}<%for.cond2thread-pre-split.i> + %.pr.i),+,8}<%for.body4.i> to i64) ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %conv.1.i, ptr @c, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %inc.1.i, ptr @b, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %11 = load i8, ptr %arrayidx.2.i, align 1 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: (sext i32 {({(2 + (%1 * %2)),+,1}<%for.cond2thread-pre-split.i> + %.pr.i),+,8}<%for.body4.i> to i64) ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %conv.2.i, ptr @c, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %inc.2.i, ptr @b, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %12 = load i8, ptr %arrayidx.3.i, align 1 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: (sext i32 {({(3 + (%1 * %2)),+,1}<%for.cond2thread-pre-split.i> + %.pr.i),+,8}<%for.body4.i> to i64) ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %conv.3.i, ptr @c, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %inc.3.i, ptr @b, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %13 = load i8, ptr %arrayidx.4.i, align 1 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: (sext i32 {({(4 + (%1 * %2)),+,1}<%for.cond2thread-pre-split.i> + %.pr.i),+,8}<%for.body4.i> to i64) ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %conv.4.i, ptr @c, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %inc.4.i, ptr @b, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %14 = load i8, ptr %arrayidx.5.i, align 1 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: (sext i32 {({(5 + (%1 * %2)),+,1}<%for.cond2thread-pre-split.i> + %.pr.i),+,8}<%for.body4.i> to i64) ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %conv.5.i, ptr @c, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %inc.5.i, ptr @b, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %15 = load i8, ptr %arrayidx.6.i, align 1 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: (sext i32 {({(6 + (%1 * %2)),+,1}<%for.cond2thread-pre-split.i> + %.pr.i),+,8}<%for.body4.i> to i64) ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %conv.6.i, ptr @c, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %inc.6.i, ptr @b, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %16 = load i8, ptr %arrayidx.7.i, align 1 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: (sext i32 {({(7 + (%1 * %2)),+,1}<%for.cond2thread-pre-split.i> + %.pr.i),+,8}<%for.body4.i> to i64) ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %conv.7.i, ptr @c, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %inc.7.i, ptr @b, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %21 = load i8, ptr %arrayidx.ur.i, align 1 -; CHECK-NEXT: In Loop with Header: for.body4.ur.i ; CHECK-NEXT: AccessFunction: (sext i32 {({(%1 * %2),+,1}<%for.cond2thread-pre-split.i> + %.ph),+,1}<%for.body4.ur.i> to i64) ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %conv.ur.i, ptr @c, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.ur.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i32 %inc.ur.i, ptr @b, align 4 -; CHECK-NEXT: In Loop with Header: for.body4.ur.i ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; diff --git a/llvm/test/Analysis/Delinearization/himeno_1.ll b/llvm/test/Analysis/Delinearization/himeno_1.ll index 292dca61d0592..5ae5d04505b8c 100644 --- a/llvm/test/Analysis/Delinearization/himeno_1.ll +++ b/llvm/test/Analysis/Delinearization/himeno_1.ll @@ -32,7 +32,6 @@ define void @jacobi(i32 %nn, ptr nocapture %a, ptr nocapture %p) nounwind uwtable { ; CHECK-LABEL: 'jacobi' ; CHECK-NEXT: Inst: store float 1.000000e+00, ptr %arrayidx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}(4 + (4 * (sext i32 %a.deps to i64) * (1 + (sext i32 %a.cols to i64)))),+,(4 * (sext i32 %a.deps to i64) * (sext i32 %a.cols to i64))}<%for.i>,+,(4 * (sext i32 %a.deps to i64))}<%for.j>,+,4}<%for.k> ; CHECK-NEXT: Base offset: %a.base ; CHECK-NEXT: ArrayDecl[UnknownSize][(sext i32 %a.cols to i64)][(sext i32 %a.deps to i64)] with elements of 4 bytes. diff --git a/llvm/test/Analysis/Delinearization/himeno_2.ll b/llvm/test/Analysis/Delinearization/himeno_2.ll index d210539d67d8b..75e4f027c4c6c 100644 --- a/llvm/test/Analysis/Delinearization/himeno_2.ll +++ b/llvm/test/Analysis/Delinearization/himeno_2.ll @@ -32,7 +32,6 @@ define void @jacobi(i32 %nn, ptr nocapture %a, ptr nocapture %p) nounwind uwtable { ; CHECK-LABEL: 'jacobi' ; CHECK-NEXT: Inst: store float 1.000000e+00, ptr %arrayidx, align 4 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}(4 + (4 * (sext i32 %a.deps to i64) * (1 + (sext i32 %a.cols to i64)))),+,(4 * (sext i32 %a.deps to i64) * (sext i32 %a.cols to i64))}<%for.i>,+,(4 * (sext i32 %a.deps to i64))}<%for.j>,+,4}<%for.k> ; CHECK-NEXT: Base offset: %a.base ; CHECK-NEXT: ArrayDecl[UnknownSize][(sext i32 %a.cols to i64)][(sext i32 %a.deps to i64)] with elements of 4 bytes. diff --git a/llvm/test/Analysis/Delinearization/iv_times_constant_in_subscript.ll b/llvm/test/Analysis/Delinearization/iv_times_constant_in_subscript.ll index cbe3ec8a19acd..fc0a6c4e8b952 100644 --- a/llvm/test/Analysis/Delinearization/iv_times_constant_in_subscript.ll +++ b/llvm/test/Analysis/Delinearization/iv_times_constant_in_subscript.ll @@ -12,7 +12,6 @@ define void @foo(i64 %n, i64 %m, i64 %b, ptr %A) { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: store double 1.000000e+00, ptr %arrayidx, align 8 -; CHECK-NEXT: In Loop with Header: for.j ; CHECK-NEXT: AccessFunction: {{\{\{}}(8 * %m * %b),+,(16 * %m)}<%for.i>,+,16}<%for.j> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%m] with elements of 8 bytes. diff --git a/llvm/test/Analysis/Delinearization/multidim_ivs_and_integer_offsets_3d.ll b/llvm/test/Analysis/Delinearization/multidim_ivs_and_integer_offsets_3d.ll index 3d21d97438462..0493a93dfee9d 100644 --- a/llvm/test/Analysis/Delinearization/multidim_ivs_and_integer_offsets_3d.ll +++ b/llvm/test/Analysis/Delinearization/multidim_ivs_and_integer_offsets_3d.ll @@ -12,7 +12,6 @@ define void @foo(i64 %n, i64 %m, i64 %o, ptr %A) { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: store double 1.000000e+00, ptr %idx, align 8 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}(56 + (8 * (-4 + (3 * %m)) * %o)),+,(8 * %m * %o)}<%for.i>,+,(8 * %o)}<%for.j>,+,8}<%for.k> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%m][%o] with elements of 8 bytes. diff --git a/llvm/test/Analysis/Delinearization/multidim_ivs_and_integer_offsets_nts_3d.ll b/llvm/test/Analysis/Delinearization/multidim_ivs_and_integer_offsets_nts_3d.ll index 3dbd71b1c9ac5..2e9c3d77f3281 100644 --- a/llvm/test/Analysis/Delinearization/multidim_ivs_and_integer_offsets_nts_3d.ll +++ b/llvm/test/Analysis/Delinearization/multidim_ivs_and_integer_offsets_nts_3d.ll @@ -12,7 +12,6 @@ define void @foo(i64 %n, i64 %m, i64 %o, i64 %p, ptr nocapture %A) nounwind uwtable { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: store double 1.000000e+00, ptr %arrayidx10.us.us, align 8 -; CHECK-NEXT: In Loop with Header: for.body6.us.us ; CHECK-NEXT: AccessFunction: {{\{\{\{}}(56 + (8 * (-4 + (3 * %m)) * (%o + %p))),+,(8 * (%o + %p) * %m)}<%for.cond4.preheader.lr.ph.us>,+,(8 * (%o + %p))}<%for.body6.lr.ph.us.us>,+,8}<%for.body6.us.us> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%m][(%o + %p)] with elements of 8 bytes. diff --git a/llvm/test/Analysis/Delinearization/multidim_ivs_and_parameteric_offsets_3d.ll b/llvm/test/Analysis/Delinearization/multidim_ivs_and_parameteric_offsets_3d.ll index a2d64a5b40bc9..a31192ef72f04 100644 --- a/llvm/test/Analysis/Delinearization/multidim_ivs_and_parameteric_offsets_3d.ll +++ b/llvm/test/Analysis/Delinearization/multidim_ivs_and_parameteric_offsets_3d.ll @@ -12,7 +12,6 @@ define void @foo(i64 %n, i64 %m, i64 %o, ptr %A, i64 %p, i64 %q, i64 %r) { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: store double 1.000000e+00, ptr %idx, align 8 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}(8 * ((((%m * %p) + %q) * %o) + %r)),+,(8 * %m * %o)}<%for.i>,+,(8 * %o)}<%for.j>,+,8}<%for.k> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%m][%o] with elements of 8 bytes. diff --git a/llvm/test/Analysis/Delinearization/multidim_only_ivs_2d.ll b/llvm/test/Analysis/Delinearization/multidim_only_ivs_2d.ll index ac83ba19b252d..432f7af7e0698 100644 --- a/llvm/test/Analysis/Delinearization/multidim_only_ivs_2d.ll +++ b/llvm/test/Analysis/Delinearization/multidim_only_ivs_2d.ll @@ -12,14 +12,12 @@ define void @foo(i64 %n, i64 %m, ptr %A) { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: %val = load double, ptr %arrayidx, align 8 -; CHECK-NEXT: In Loop with Header: for.j ; CHECK-NEXT: AccessFunction: {{\{\{}}0,+,(8 * %m)}<%for.i>,+,8}<%for.j> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%m] with elements of 8 bytes. ; CHECK-NEXT: ArrayRef[{0,+,1}<%for.i>][{0,+,1}<%for.j>] ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store double %val, ptr %arrayidx, align 8 -; CHECK-NEXT: In Loop with Header: for.j ; CHECK-NEXT: AccessFunction: {{\{\{}}0,+,(8 * %m)}<%for.i>,+,8}<%for.j> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%m] with elements of 8 bytes. diff --git a/llvm/test/Analysis/Delinearization/multidim_only_ivs_2d_nested.ll b/llvm/test/Analysis/Delinearization/multidim_only_ivs_2d_nested.ll index 262a092794cb1..c7a2a89e3183d 100644 --- a/llvm/test/Analysis/Delinearization/multidim_only_ivs_2d_nested.ll +++ b/llvm/test/Analysis/Delinearization/multidim_only_ivs_2d_nested.ll @@ -18,7 +18,6 @@ define void @foo(i64 %a, i64 %b) nounwind uwtable { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: store double 1.000000e+00, ptr %arrayidx10.us.us, align 8 -; CHECK-NEXT: In Loop with Header: for.body9.us.us ; CHECK-NEXT: AccessFunction: {{\{\{}}0,+,{8,+,8}<%for.cond7.preheader.lr.ph.split.us.us>}<%for.body9.lr.ph.us.us>,+,8}<%for.body9.us.us> ; CHECK-NEXT: failed to delinearize ; diff --git a/llvm/test/Analysis/Delinearization/multidim_only_ivs_3d.ll b/llvm/test/Analysis/Delinearization/multidim_only_ivs_3d.ll index b1405db81a787..966a8222d8a15 100644 --- a/llvm/test/Analysis/Delinearization/multidim_only_ivs_3d.ll +++ b/llvm/test/Analysis/Delinearization/multidim_only_ivs_3d.ll @@ -12,7 +12,6 @@ define void @foo(i64 %n, i64 %m, i64 %o, ptr %A) { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: store double 1.000000e+00, ptr %idx, align 8 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,(8 * %m * %o)}<%for.i>,+,(8 * %o)}<%for.j>,+,8}<%for.k> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%m][%o] with elements of 8 bytes. diff --git a/llvm/test/Analysis/Delinearization/multidim_only_ivs_3d_cast.ll b/llvm/test/Analysis/Delinearization/multidim_only_ivs_3d_cast.ll index 6de072ebaee13..da40825984663 100644 --- a/llvm/test/Analysis/Delinearization/multidim_only_ivs_3d_cast.ll +++ b/llvm/test/Analysis/Delinearization/multidim_only_ivs_3d_cast.ll @@ -14,7 +14,6 @@ target triple = "x86_64-unknown-linux-gnu" define void @foo(i32 %n, i32 %m, i32 %o, ptr %A) { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: store double 1.000000e+00, ptr %idx, align 8 -; CHECK-NEXT: In Loop with Header: for.k ; CHECK-NEXT: AccessFunction: {{\{\{\{}}0,+,(8 * (zext i32 %m to i64) * (zext i32 %o to i64))}<%for.i>,+,(8 * (zext i32 %o to i64))}<%for.j>,+,8}<%for.k> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][(zext i32 %m to i64)][(zext i32 %o to i64)] with elements of 8 bytes. diff --git a/llvm/test/Analysis/Delinearization/multidim_two_accesses_different_delinearization.ll b/llvm/test/Analysis/Delinearization/multidim_two_accesses_different_delinearization.ll index d7148c5216462..da77cd37fede5 100644 --- a/llvm/test/Analysis/Delinearization/multidim_two_accesses_different_delinearization.ll +++ b/llvm/test/Analysis/Delinearization/multidim_two_accesses_different_delinearization.ll @@ -15,14 +15,12 @@ target triple = "x86_64-unknown-linux-gnu" define void @foo(i64 %n, i64 %m, ptr %A) { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: store double 1.000000e+00, ptr %arrayidx, align 8 -; CHECK-NEXT: In Loop with Header: for.j ; CHECK-NEXT: AccessFunction: {{\{\{}}0,+,(8 * %m)}<%for.i>,+,8}<%for.j> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%m] with elements of 8 bytes. ; CHECK-NEXT: ArrayRef[{0,+,1}<%for.i>][{0,+,1}<%for.j>] ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store double 1.000000e+00, ptr %arrayidx1, align 8 -; CHECK-NEXT: In Loop with Header: for.j ; CHECK-NEXT: AccessFunction: {{\{\{}}0,+,8}<%for.i>,+,(8 * %n)}<%for.j> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%n] with elements of 8 bytes. diff --git a/llvm/test/Analysis/Delinearization/parameter_addrec_product.ll b/llvm/test/Analysis/Delinearization/parameter_addrec_product.ll index cbccafd1e6546..49eeee3bd2119 100644 --- a/llvm/test/Analysis/Delinearization/parameter_addrec_product.ll +++ b/llvm/test/Analysis/Delinearization/parameter_addrec_product.ll @@ -11,19 +11,16 @@ target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" define void @foo(ptr %A, ptr %p) { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: %pval = load i64, ptr %p, align 8 -; CHECK-NEXT: In Loop with Header: bb4 ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ; CHECK-EMPTY: ; CHECK-NEXT: Inst: %tmp11 = load float, ptr %tmp10, align 4 -; CHECK-NEXT: In Loop with Header: bb4 ; CHECK-NEXT: AccessFunction: (4 * (({0,+,1}<%bb2> * %pval) + {0,+,1}<%bb4>)) ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%pval] with elements of 4 bytes. ; CHECK-NEXT: ArrayRef[{0,+,1}<%bb2>][{0,+,1}<%bb4>] ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store float %tmp12, ptr %tmp10, align 4 -; CHECK-NEXT: In Loop with Header: bb4 ; CHECK-NEXT: AccessFunction: (4 * (({0,+,1}<%bb2> * %pval) + {0,+,1}<%bb4>)) ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][%pval] with elements of 4 bytes. diff --git a/llvm/test/Analysis/Delinearization/terms_with_identity_factor.ll b/llvm/test/Analysis/Delinearization/terms_with_identity_factor.ll index 86adcc8a1957c..5b0465f7fb75e 100644 --- a/llvm/test/Analysis/Delinearization/terms_with_identity_factor.ll +++ b/llvm/test/Analysis/Delinearization/terms_with_identity_factor.ll @@ -9,14 +9,12 @@ define void @foo(i32 %m, i32 %n, ptr nocapture %A) #0 { ; CHECK-LABEL: 'foo' ; CHECK-NEXT: Inst: %4 = load i8, ptr %arrayidx.us, align 1 -; CHECK-NEXT: In Loop with Header: for.body3.us ; CHECK-NEXT: AccessFunction: {{\{\{}}0,+,(sext i32 %n to i64)}<%for.body3.lr.ph.us>,+,1}<%for.body3.us> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][(sext i32 %n to i64)] with elements of 1 bytes. ; CHECK-NEXT: ArrayRef[{0,+,1}<%for.body3.lr.ph.us>][{0,+,1}<%for.body3.us>] ; CHECK-EMPTY: ; CHECK-NEXT: Inst: store i8 %add4.us, ptr %arrayidx.us, align 1 -; CHECK-NEXT: In Loop with Header: for.body3.us ; CHECK-NEXT: AccessFunction: {{\{\{}}0,+,(sext i32 %n to i64)}<%for.body3.lr.ph.us>,+,1}<%for.body3.us> ; CHECK-NEXT: Base offset: %A ; CHECK-NEXT: ArrayDecl[UnknownSize][(sext i32 %n to i64)] with elements of 1 bytes. diff --git a/llvm/test/Analysis/Delinearization/type_mismatch.ll b/llvm/test/Analysis/Delinearization/type_mismatch.ll index 1b78f24485743..6d344975daf92 100644 --- a/llvm/test/Analysis/Delinearization/type_mismatch.ll +++ b/llvm/test/Analysis/Delinearization/type_mismatch.ll @@ -12,7 +12,6 @@ target datalayout = "e-m:e-p:32:32-i64:64-a:0-v32:32-n16:32" define fastcc void @test(i1 %arg, ptr %x) { ; CHECK-LABEL: 'test' ; CHECK-NEXT: Inst: store i8 42, ptr %arrayidx.phi, align 1 -; CHECK-NEXT: In Loop with Header: for.body11 ; CHECK-NEXT: AccessFunction: 0 ; CHECK-NEXT: failed to delinearize ;