Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 16 additions & 18 deletions llvm/lib/Analysis/DependenceAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3504,12 +3504,13 @@ bool DependenceInfo::tryDelinearizeFixedSize(
"expected src and dst scev unknowns to be equal");
});

SmallVector<int, 4> SrcSizes;
SmallVector<int, 4> DstSizes;
if (!tryDelinearizeFixedSizeImpl(SE, Src, SrcAccessFn, SrcSubscripts,
SrcSizes) ||
!tryDelinearizeFixedSizeImpl(SE, Dst, DstAccessFn, DstSubscripts,
DstSizes))
const SCEV *ElemSize = SE->getElementSize(Src);
assert(ElemSize == SE->getElementSize(Dst) && "Different element sizes");
SmallVector<const SCEV *, 4> SrcSizes, DstSizes;
if (!delinearizeFixedSizeArray(*SE, SE->removePointerBase(SrcAccessFn),
SrcSubscripts, SrcSizes, ElemSize) ||
!delinearizeFixedSizeArray(*SE, SE->removePointerBase(DstAccessFn),
DstSubscripts, DstSizes, ElemSize))
return false;

// Check that the two size arrays are non-empty and equal in length and
Expand All @@ -3535,7 +3536,7 @@ bool DependenceInfo::tryDelinearizeFixedSize(
// iff the subscripts are positive and are less than the range of the
// dimension.
if (!DisableDelinearizationChecks) {
auto AllIndicesInRange = [&](SmallVector<int, 4> &DimensionSizes,
auto AllIndicesInRange = [&](ArrayRef<const SCEV *> DimensionSizes,
SmallVectorImpl<const SCEV *> &Subscripts,
Value *Ptr) {
size_t SSize = Subscripts.size();
Expand All @@ -3548,17 +3549,14 @@ bool DependenceInfo::tryDelinearizeFixedSize(
});
return false;
}
if (auto *SType = dyn_cast<IntegerType>(S->getType())) {
const SCEV *Range = SE->getConstant(
ConstantInt::get(SType, DimensionSizes[I - 1], false));
if (!isKnownLessThan(S, Range)) {
LLVM_DEBUG({
dbgs() << "Check failed: !isKnownLessThan(S, Range)\n";
dbgs() << " S: " << *S << "\n"
<< " Range: " << *Range << "\n";
});
return false;
}
const SCEV *Range = DimensionSizes[I - 1];
if (!isKnownLessThan(S, Range)) {
LLVM_DEBUG({
dbgs() << "Check failed: !isKnownLessThan(S, Range)\n";
dbgs() << " S: " << *S << "\n"
<< " Range: " << *Range << "\n";
});
return false;
}
}
return true;
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Analysis/DependenceAnalysis/Banerjee.ll
Original file line number Diff line number Diff line change
Expand Up @@ -660,7 +660,7 @@ define void @banerjee7(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
; DELIN-NEXT: da analyze - none!
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %0 = load i64, ptr %arrayidx7, align 8
; DELIN-NEXT: da analyze - flow [> <=]!
; DELIN-NEXT: da analyze - consistent flow [-1 0]!
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
; DELIN-NEXT: da analyze - confused!
; DELIN-NEXT: Src: %0 = load i64, ptr %arrayidx7, align 8 --> Dst: %0 = load i64, ptr %arrayidx7, align 8
Expand Down Expand Up @@ -916,7 +916,7 @@ define void @banerjee10(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 0, ptr %arrayidx, align 8
; DELIN-NEXT: da analyze - none!
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %1 = load i64, ptr %arrayidx6, align 8
; DELIN-NEXT: da analyze - flow [<> 0]!
; DELIN-NEXT: da analyze - flow [-11 0]!
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: store i64 %1, ptr %B.addr.11, align 8
; DELIN-NEXT: da analyze - confused!
; DELIN-NEXT: Src: %1 = load i64, ptr %arrayidx6, align 8 --> Dst: %1 = load i64, ptr %arrayidx6, align 8
Expand Down
6 changes: 2 additions & 4 deletions llvm/test/Analysis/DependenceAnalysis/Coupled.ll
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe this test will be removed in #160924.

Original file line number Diff line number Diff line change
Expand Up @@ -503,8 +503,7 @@ define void @couple11(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: store i32 %conv, ptr %arrayidx2, align 4
; CHECK-NEXT: da analyze - none!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
; CHECK-NEXT: da analyze - flow [0|<] splitable!
; CHECK-NEXT: da analyze - split level = 1, iteration = 9!
; CHECK-NEXT: da analyze - flow [0|<]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
; CHECK-NEXT: da analyze - confused!
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
Expand Down Expand Up @@ -548,8 +547,7 @@ define void @couple12(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: store i32 %conv, ptr %arrayidx2, align 4
; CHECK-NEXT: da analyze - none!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
; CHECK-NEXT: da analyze - flow [<] splitable!
; CHECK-NEXT: da analyze - split level = 1, iteration = 11!
; CHECK-NEXT: da analyze - flow [<]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
; CHECK-NEXT: da analyze - confused!
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
Expand Down
3 changes: 1 addition & 2 deletions llvm/test/Analysis/DependenceAnalysis/DifferentOffsets.ll
Original file line number Diff line number Diff line change
Expand Up @@ -149,11 +149,10 @@ define void @multidim_accesses(ptr %A) {
; CHECK-NEXT: Src: store i32 1, ptr %idx0, align 4 --> Dst: store i32 1, ptr %idx0, align 4
; CHECK-NEXT: da analyze - none!
; CHECK-NEXT: Src: store i32 1, ptr %idx0, align 4 --> Dst: store i32 1, ptr %idx1, align 4
; CHECK-NEXT: da analyze - consistent output [0 0 0|<]!
; CHECK-NEXT: da analyze - output [<= * *|<]!
; CHECK-NEXT: Src: store i32 1, ptr %idx1, align 4 --> Dst: store i32 1, ptr %idx1, align 4
; CHECK-NEXT: da analyze - none!
;
; FIXME: the dependence distance is not constant. Distance vector should be [* * *|<]!
Comment on lines -152 to -156
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change means fixing a known issue.

; for (i = 0; i < 256; i++)
; for (j = 0; j < 256; j++)
; for (k = 0; k < 256; k++) {
Expand Down
5 changes: 5 additions & 0 deletions llvm/test/Analysis/DependenceAnalysis/Invariant.ll
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@
; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \
; RUN: | FileCheck %s

; XFAIL: *
; Currently fails since delinearization doesn't work as expected, due to the
; inconsistency in the estimated array sizes between `rr[i][j]` and `rr[j][j]`.
; The latter is now regarded as an access to a 1D array.

; Test for a bug, which caused an assert when an invalid
; SCEVAddRecExpr is created in addToCoefficient.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ for.end:
; }
; }
; Extends the previous example to coupled MIV subscripts.
;
; FIXME: Currently delinearization does not work as expected.


@a = global [10004 x [10004 x i32]] zeroinitializer, align 16
Expand All @@ -57,7 +59,7 @@ define void @coupled_miv_type_mismatch(i32 %n) #0 {
; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx5, align 4 --> Dst: %2 = load i32, ptr %arrayidx5, align 4
; CHECK-NEXT: da analyze - none!
; CHECK-NEXT: Src: %2 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %add6, ptr %arrayidx10, align 4
; CHECK-NEXT: da analyze - consistent anti [1 -2]!
; CHECK-NEXT: da analyze - anti [< >]!
; CHECK-NEXT: Src: store i32 %add6, ptr %arrayidx10, align 4 --> Dst: store i32 %add6, ptr %arrayidx10, align 4
; CHECK-NEXT: da analyze - none!
;
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Analysis/DependenceAnalysis/PR51512.ll
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ define void @foo() {
; CHECK-NEXT: Src: store i32 42, ptr %getelementptr, align 1 --> Dst: store i32 42, ptr %getelementptr, align 1
; CHECK-NEXT: da analyze - consistent output [0 S]!
; CHECK-NEXT: Src: store i32 42, ptr %getelementptr, align 1 --> Dst: store i32 0, ptr %getelementptr5, align 1
; CHECK-NEXT: da analyze - output [0 *|<]!
; CHECK-NEXT: da analyze - output [0 <=|<]!
; CHECK-NEXT: Src: store i32 0, ptr %getelementptr5, align 1 --> Dst: store i32 0, ptr %getelementptr5, align 1
; CHECK-NEXT: da analyze - none!
;
Expand Down
3 changes: 2 additions & 1 deletion llvm/test/Analysis/DependenceAnalysis/Propagating.ll
Original file line number Diff line number Diff line change
Expand Up @@ -437,7 +437,8 @@ define void @prop7(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %conv, ptr %arrayidx7, align 4
; CHECK-NEXT: da analyze - none!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx13, align 4
; CHECK-NEXT: da analyze - flow [* <>]!
; CHECK-NEXT: da analyze - flow [* -38] splitable!
; CHECK-NEXT: da analyze - split level = 1, iteration = 4!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
; CHECK-NEXT: da analyze - confused!
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx13, align 4 --> Dst: %0 = load i32, ptr %arrayidx13, align 4
Expand Down
2 changes: 1 addition & 1 deletion llvm/test/Analysis/DependenceAnalysis/SameSDLoops.ll
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ define void @non_samebd0(ptr %A) nounwind uwtable ssp {
; CHECK-NEXT: Src: store i64 %i.013, ptr %arrayidx12, align 8 --> Dst: store i64 %i.013, ptr %arrayidx12, align 8
; CHECK-NEXT: da analyze - none!
; CHECK-NEXT: Src: store i64 %i.013, ptr %arrayidx12, align 8 --> Dst: store i64 %l17.04, ptr %arrayidx24, align 8
; CHECK-NEXT: da analyze - output [-4 -3]!
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Seems regression, but less important, I believe.

; CHECK-NEXT: da analyze - output [> *]!
; CHECK-NEXT: Src: store i64 %l17.04, ptr %arrayidx24, align 8 --> Dst: store i64 %l17.04, ptr %arrayidx24, align 8
; CHECK-NEXT: da analyze - none!
;
Expand Down
6 changes: 3 additions & 3 deletions llvm/test/Analysis/DependenceAnalysis/Separability.ll
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This also will be removed in #160924.

Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ define void @sep2(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx12, align 4 --> Dst: store i32 %conv, ptr %arrayidx12, align 4
; CHECK-NEXT: da analyze - consistent output [0 S 0 0]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx12, align 4 --> Dst: %0 = load i32, ptr %arrayidx19, align 4
; CHECK-NEXT: da analyze - flow [> * * -10]!
; CHECK-NEXT: da analyze - flow [* * * <>]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx12, align 4 --> Dst: store i32 %0, ptr %B.addr.31, align 4
; CHECK-NEXT: da analyze - confused!
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx19, align 4 --> Dst: %0 = load i32, ptr %arrayidx19, align 4
Expand Down Expand Up @@ -262,9 +262,9 @@ for.end28: ; preds = %for.inc26
define void @sep3(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
; CHECK-LABEL: 'sep3'
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx13, align 4 --> Dst: store i32 %conv, ptr %arrayidx13, align 4
; CHECK-NEXT: da analyze - consistent output [0 S 0 0]!
; CHECK-NEXT: da analyze - output [0 S 0 0]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx13, align 4 --> Dst: %0 = load i32, ptr %arrayidx20, align 4
; CHECK-NEXT: da analyze - flow [> * * *]!
; CHECK-NEXT: da analyze - flow [* * * *|<]!
; CHECK-NEXT: Src: store i32 %conv, ptr %arrayidx13, align 4 --> Dst: store i32 %0, ptr %B.addr.31, align 4
; CHECK-NEXT: da analyze - confused!
; CHECK-NEXT: Src: %0 = load i32, ptr %arrayidx20, align 4 --> Dst: %0 = load i32, ptr %arrayidx20, align 4
Expand Down
4 changes: 2 additions & 2 deletions llvm/test/Transforms/LoopInterchange/legality-check.ll
Original file line number Diff line number Diff line change
Expand Up @@ -149,10 +149,10 @@ exit:
;; for (int k = 0; k < 19; k++)
;; b[i][j][k] = b[i][5][k + 1];
;;
;; The direction vector of `b` is [= * <]. We cannot interchange all the loops.
;; The direction vector of `b` is [= * *]. We cannot interchange all the loops.

; CHECK: Dependency matrix before interchange:
; CHECK-NEXT: = * <
; CHECK-NEXT: = * *
Comment on lines +152 to +155
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I remember I added this test in #139690. It should be sufficient to ensure no interchange occurs for this case.

; CHECK-NEXT: Processing InnerLoopId = 2 and OuterLoopId = 1
; CHECK-NEXT: Failed interchange InnerLoopId = 2 and OuterLoopId = 1 due to dependence
; CHECK-NEXT: Not interchanging loops. Cannot prove legality.
Expand Down
11 changes: 6 additions & 5 deletions llvm/test/Transforms/LoopInterchange/outer-dependency-lte.ll
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,16 @@
;;
;; The entry of the direction vector for the outermost loop is `DVEntry::LE`.
;; We need to treat this as `*`, not `<`. See issue #123920 for details.
;; In conclusion, we must not interchange the loops.

; CHECK: --- !Missed
; CHECK-NEXT: Pass: loop-interchange
; CHECK-NEXT: Name: Dependence
; CHECK-NEXT: Function: f
; CHECK: --- !Missed
; CHECK: --- !Missed
; CHECK-NEXT: Pass: loop-interchange
; CHECK-NEXT: Name: Dependence
; CHECK-NEXT: Function: f
; CHECK-NEXT: Args:
; CHECK-NEXT: - String: All loops have dependencies in all directions.
; CHECK-NEXT: ...


@a = dso_local global [16 x [16 x [16 x i32]]] zeroinitializer, align 4

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@

target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"

; XFAIL: *
; The transformation seems to have succeeded "accidentally".

Comment on lines +6 to +8
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe conflicting with #156578. I will rebase after that PR is merged.

; CHECK-LABEL: sub_sub_less
; CHECK: %j = phi
; CHECK-NOT: %j.1 = phi
Expand Down