Skip to content

Commit 68d2ce8

Browse files
authored
[DA] Replace delinearization for fixed size array (#161822)
This patch replaces the delinearization function used in DA, switching from one that depends on type information in GEPs to one that does not. There are three types of changes in regression tests: improvements, degradations, and degradations but the related features will be removed. Since there were very few cases that are classified into the second category, I believe the impact of this change should be practically insignificant.
1 parent 6fc48de commit 68d2ce8

File tree

15 files changed

+57
-50
lines changed

15 files changed

+57
-50
lines changed

llvm/lib/Analysis/DependenceAnalysis.cpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3911,12 +3911,13 @@ bool DependenceInfo::tryDelinearizeFixedSize(
39113911
"expected src and dst scev unknowns to be equal");
39123912
});
39133913

3914-
SmallVector<int, 4> SrcSizes;
3915-
SmallVector<int, 4> DstSizes;
3916-
if (!tryDelinearizeFixedSizeImpl(SE, Src, SrcAccessFn, SrcSubscripts,
3917-
SrcSizes) ||
3918-
!tryDelinearizeFixedSizeImpl(SE, Dst, DstAccessFn, DstSubscripts,
3919-
DstSizes))
3914+
const SCEV *ElemSize = SE->getElementSize(Src);
3915+
assert(ElemSize == SE->getElementSize(Dst) && "Different element sizes");
3916+
SmallVector<const SCEV *, 4> SrcSizes, DstSizes;
3917+
if (!delinearizeFixedSizeArray(*SE, SE->removePointerBase(SrcAccessFn),
3918+
SrcSubscripts, SrcSizes, ElemSize) ||
3919+
!delinearizeFixedSizeArray(*SE, SE->removePointerBase(DstAccessFn),
3920+
DstSubscripts, DstSizes, ElemSize))
39203921
return false;
39213922

39223923
// Check that the two size arrays are non-empty and equal in length and
@@ -3942,7 +3943,7 @@ bool DependenceInfo::tryDelinearizeFixedSize(
39423943
// iff the subscripts are positive and are less than the range of the
39433944
// dimension.
39443945
if (!DisableDelinearizationChecks) {
3945-
auto AllIndicesInRange = [&](SmallVector<int, 4> &DimensionSizes,
3946+
auto AllIndicesInRange = [&](ArrayRef<const SCEV *> DimensionSizes,
39463947
SmallVectorImpl<const SCEV *> &Subscripts,
39473948
Value *Ptr) {
39483949
size_t SSize = Subscripts.size();
@@ -3955,17 +3956,14 @@ bool DependenceInfo::tryDelinearizeFixedSize(
39553956
});
39563957
return false;
39573958
}
3958-
if (auto *SType = dyn_cast<IntegerType>(S->getType())) {
3959-
const SCEV *Range = SE->getConstant(
3960-
ConstantInt::get(SType, DimensionSizes[I - 1], false));
3961-
if (!isKnownLessThan(S, Range)) {
3962-
LLVM_DEBUG({
3963-
dbgs() << "Check failed: !isKnownLessThan(S, Range)\n";
3964-
dbgs() << " S: " << *S << "\n"
3965-
<< " Range: " << *Range << "\n";
3966-
});
3967-
return false;
3968-
}
3959+
const SCEV *Range = DimensionSizes[I - 1];
3960+
if (!isKnownLessThan(S, Range)) {
3961+
LLVM_DEBUG({
3962+
dbgs() << "Check failed: !isKnownLessThan(S, Range)\n";
3963+
dbgs() << " S: " << *S << "\n"
3964+
<< " Range: " << *Range << "\n";
3965+
});
3966+
return false;
39693967
}
39703968
}
39713969
return true;

llvm/test/Analysis/DependenceAnalysis/Banerjee.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -660,7 +660,7 @@ define void @banerjee7(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
660660
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
661661
; DELIN-NEXT: da analyze - none!
662662
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %0 = load i64, ptr %arrayidx7, align 8
663-
; DELIN-NEXT: da analyze - flow [> <=]!
663+
; DELIN-NEXT: da analyze - consistent flow [-1 0]!
664664
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
665665
; DELIN-NEXT: da analyze - confused!
666666
; DELIN-NEXT: Src: %0 = load i64, ptr %arrayidx7, align 8 --> Dst: %0 = load i64, ptr %arrayidx7, align 8
@@ -916,7 +916,7 @@ define void @banerjee10(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
916916
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
917917
; DELIN-NEXT: da analyze - none!
918918
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %1 = load i64, ptr %arrayidx6, align 8
919-
; DELIN-NEXT: da analyze - flow [<> 0]!
919+
; DELIN-NEXT: da analyze - flow [-11 0]!
920920
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %1, ptr %B.addr.11, align 8
921921
; DELIN-NEXT: da analyze - confused!
922922
; DELIN-NEXT: Src: %1 = load i64, ptr %arrayidx6, align 8 --> Dst: %1 = load i64, ptr %arrayidx6, align 8

llvm/test/Analysis/DependenceAnalysis/Coupled.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -503,8 +503,7 @@ define void @couple11(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
503503
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: store i32 %conv, ptr %arrayidx2, align 4
504504
; CHECK-NEXT: da analyze - none!
505505
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
506-
; CHECK-NEXT: da analyze - flow [0|<] splitable!
507-
; CHECK-NEXT: da analyze - split level = 1, iteration = 9!
506+
; CHECK-NEXT: da analyze - flow [0|<]!
508507
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
509508
; CHECK-NEXT: da analyze - confused!
510509
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
@@ -548,8 +547,7 @@ define void @couple12(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
548547
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: store i32 %conv, ptr %arrayidx2, align 4
549548
; CHECK-NEXT: da analyze - none!
550549
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
551-
; CHECK-NEXT: da analyze - flow [<] splitable!
552-
; CHECK-NEXT: da analyze - split level = 1, iteration = 11!
550+
; CHECK-NEXT: da analyze - flow [<]!
553551
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
554552
; CHECK-NEXT: da analyze - confused!
555553
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4

llvm/test/Analysis/DependenceAnalysis/DifferentOffsets.ll

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,11 +149,10 @@ define void @multidim_accesses(ptr %A) {
149149
; CHECK-NEXT: Src: store i32 1, ptr %idx0, align 4 --> Dst: store i32 1, ptr %idx0, align 4
150150
; CHECK-NEXT: da analyze - none!
151151
; CHECK-NEXT: Src: store i32 1, ptr %idx0, align 4 --> Dst: store i32 1, ptr %idx1, align 4
152-
; CHECK-NEXT: da analyze - consistent output [0 0 0|<]!
152+
; CHECK-NEXT: da analyze - output [<= * *|<]!
153153
; CHECK-NEXT: Src: store i32 1, ptr %idx1, align 4 --> Dst: store i32 1, ptr %idx1, align 4
154154
; CHECK-NEXT: da analyze - none!
155155
;
156-
; FIXME: the dependence distance is not constant. Distance vector should be [* * *|<]!
157156
; for (i = 0; i < 256; i++)
158157
; for (j = 0; j < 256; j++)
159158
; for (k = 0; k < 256; k++) {

llvm/test/Analysis/DependenceAnalysis/Invariant.ll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@
22
; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \
33
; RUN: | FileCheck %s
44

5+
; XFAIL: *
6+
; Currently fails since delinearization doesn't work as expected, due to the
7+
; inconsistency in the estimated array sizes between `rr[i][j]` and `rr[j][j]`.
8+
; The latter is now regarded as an access to a 1D array.
9+
510
; Test for a bug, which caused an assert when an invalid
611
; SCEVAddRecExpr is created in addToCoefficient.
712

llvm/test/Analysis/DependenceAnalysis/NonCanonicalizedSubscript.ll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ for.end:
4747
; }
4848
; }
4949
; Extends the previous example to coupled MIV subscripts.
50+
;
51+
; FIXME: Currently delinearization does not work as expected.
5052

5153

5254
@a = global [10004 x [10004 x i32]] zeroinitializer, align 16
@@ -57,7 +59,7 @@ define void @coupled_miv_type_mismatch(i32 %n) {
5759
; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx5, align 4 --> Dst: %2 = load i32, ptr %arrayidx5, align 4
5860
; CHECK-NEXT: da analyze - none!
5961
; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %add6, ptr %arrayidx10, align 4
60-
; CHECK-NEXT: da analyze - consistent anti [1 -2]!
62+
; CHECK-NEXT: da analyze - anti [< >]!
6163
; CHECK-NEXT: Src: store i32 %add6, ptr %arrayidx10, align 4 --> Dst: store i32 %add6, ptr %arrayidx10, align 4
6264
; CHECK-NEXT: da analyze - none!
6365
;

llvm/test/Analysis/DependenceAnalysis/PR51512.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ define void @foo() {
1010
; CHECK-NEXT: Src: store i32 42, ptr %getelementptr, align 1 --> Dst: store i32 42, ptr %getelementptr, align 1
1111
; CHECK-NEXT: da analyze - consistent output [0 S]!
1212
; CHECK-NEXT: Src: store i32 42, ptr %getelementptr, align 1 --> Dst: store i32 0, ptr %getelementptr5, align 1
13-
; CHECK-NEXT: da analyze - output [0 *|<]!
13+
; CHECK-NEXT: da analyze - output [0 <=|<]!
1414
; CHECK-NEXT: Src: store i32 0, ptr %getelementptr5, align 1 --> Dst: store i32 0, ptr %getelementptr5, align 1
1515
; CHECK-NEXT: da analyze - none!
1616
;

llvm/test/Analysis/DependenceAnalysis/Propagating.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,7 +437,8 @@ define void @prop7(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
437437
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %conv, ptr %arrayidx7, align 4
438438
; CHECK-NEXT: da analyze - none!
439439
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx13, align 4
440-
; CHECK-NEXT: da analyze - flow [* <>]!
440+
; CHECK-NEXT: da analyze - flow [* -38] splitable!
441+
; CHECK-NEXT: da analyze - split level = 1, iteration = 4!
441442
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
442443
; CHECK-NEXT: da analyze - confused!
443444
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx13, align 4 --> Dst: %0 = load i32, ptr %arrayidx13, align 4

llvm/test/Analysis/DependenceAnalysis/SameSDLoops.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ define void @non_samebd0(ptr %A) nounwind uwtable ssp {
148148
; CHECK-NEXT: Src: store i64 %i.013, ptr %arrayidx12, align 8 --> Dst: store i64 %i.013, ptr %arrayidx12, align 8
149149
; CHECK-NEXT: da analyze - none!
150150
; CHECK-NEXT: Src: store i64 %i.013, ptr %arrayidx12, align 8 --> Dst: store i64 %l17.04, ptr %arrayidx24, align 8
151-
; CHECK-NEXT: da analyze - output [-4 -3]!
151+
; CHECK-NEXT: da analyze - output [> *]!
152152
; CHECK-NEXT: Src: store i64 %l17.04, ptr %arrayidx24, align 8 --> Dst: store i64 %l17.04, ptr %arrayidx24, align 8
153153
; CHECK-NEXT: da analyze - none!
154154
;

llvm/test/Analysis/DependenceAnalysis/Separability.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,7 +182,7 @@ define void @sep2(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
182182
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx12, align 4 --> Dst: store i32 %conv, ptr %arrayidx12, align 4
183183
; CHECK-NEXT: da analyze - consistent output [0 S 0 0]!
184184
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx12, align 4 --> Dst: %0 = load i32, ptr %arrayidx19, align 4
185-
; CHECK-NEXT: da analyze - flow [> * * -10]!
185+
; CHECK-NEXT: da analyze - flow [* * * <>]!
186186
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx12, align 4 --> Dst: store i32 %0, ptr %B.addr.31, align 4
187187
; CHECK-NEXT: da analyze - confused!
188188
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx19, align 4 --> Dst: %0 = load i32, ptr %arrayidx19, align 4
@@ -262,9 +262,9 @@ for.end28: ; preds = %for.inc26
262262
define void @sep3(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
263263
; CHECK-LABEL: 'sep3'
264264
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx13, align 4 --> Dst: store i32 %conv, ptr %arrayidx13, align 4
265-
; CHECK-NEXT: da analyze - consistent output [0 S 0 0]!
265+
; CHECK-NEXT: da analyze - output [0 S 0 0]!
266266
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx13, align 4 --> Dst: %0 = load i32, ptr %arrayidx20, align 4
267-
; CHECK-NEXT: da analyze - flow [> * * *]!
267+
; CHECK-NEXT: da analyze - flow [* * * *|<]!
268268
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx13, align 4 --> Dst: store i32 %0, ptr %B.addr.31, align 4
269269
; CHECK-NEXT: da analyze - confused!
270270
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx20, align 4 --> Dst: %0 = load i32, ptr %arrayidx20, align 4

0 commit comments

Comments
 (0)