Skip to content

Commit da84ed1

Browse files
committed
[DA] Deduplicate runtime predicates in delinearization
When validating both source and destination subscripts, the same predicate can be generated multiple times (e.g., when both access A[i][j]). Add a helper AddPredicate() that checks if a predicate already exists before adding it to avoid duplicates.
1 parent 6d93d4d commit da84ed1

24 files changed

+14
-112
lines changed

llvm/lib/Analysis/Delinearization.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,15 @@ bool llvm::validateDelinearizationResult(
763763
//
764764
// where the size of the outermost dimension is unknown (UNK).
765765

766+
// Helper to add a predicate only if it's not already in the list.
767+
// SCEV interns predicates, so pointer comparison is sufficient.
768+
auto AddPredicate = [&](const SCEVPredicate *Pred) {
769+
if (!Pred || !Assume)
770+
return;
771+
if (!llvm::is_contained(*Assume, Pred))
772+
Assume->push_back(Pred);
773+
};
774+
766775
// Unify types of two SCEVs to the wider type.
767776
auto UnifyTypes =
768777
[&](const SCEV *&A,
@@ -782,7 +791,7 @@ bool llvm::validateDelinearizationResult(
782791
/*Signed=*/true, A, B)) {
783792
if (!Assume)
784793
return nullptr;
785-
Assume->push_back(Pred);
794+
AddPredicate(Pred);
786795
}
787796
return SE.getAddExpr(A, B);
788797
};
@@ -797,7 +806,7 @@ bool llvm::validateDelinearizationResult(
797806
/*Signed=*/true, A, B)) {
798807
if (!Assume)
799808
return nullptr;
800-
Assume->push_back(Pred);
809+
AddPredicate(Pred);
801810
}
802811
return SE.getMulExpr(A, B);
803812
};
@@ -811,7 +820,7 @@ bool llvm::validateDelinearizationResult(
811820
/*Signed=*/true, A, B)) {
812821
if (!Assume)
813822
return false;
814-
Assume->push_back(Pred);
823+
AddPredicate(Pred);
815824
}
816825
return true;
817826
};
@@ -827,7 +836,7 @@ bool llvm::validateDelinearizationResult(
827836
return false;
828837
const SCEVPredicate *Pred = SE.getComparePredicate(
829838
ICmpInst::ICMP_SGE, Subscript, SE.getZero(Subscript->getType()));
830-
Assume->push_back(Pred);
839+
AddPredicate(Pred);
831840
}
832841

833842
// Check Subscript < Size.
@@ -840,7 +849,7 @@ bool llvm::validateDelinearizationResult(
840849
const SCEV *SizeExt = SE.getNoopOrSignExtend(Size, WiderType);
841850
const SCEVPredicate *Pred =
842851
SE.getComparePredicate(ICmpInst::ICMP_SLT, SubscriptExt, SizeExt);
843-
Assume->push_back(Pred);
852+
AddPredicate(Pred);
844853
}
845854
}
846855

llvm/test/Analysis/DependenceAnalysis/Banerjee.ll

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ define void @banerjee0(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
4949
; DELIN-NEXT: da analyze - consistent output [0 0]!
5050
; DELIN-NEXT: Runtime Assumptions:
5151
; DELIN-NEXT: Compare predicate: {1,+,1}<nuw><nsw><%for.body3> slt) 10
52-
; DELIN-NEXT: Compare predicate: {1,+,1}<nuw><nsw><%for.body3> slt) 10
5352
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %0 = load i64, ptr %arrayidx6, align 8
5453
; DELIN-NEXT: da analyze - consistent flow [0 1]!
5554
; DELIN-NEXT: Runtime Assumptions:
@@ -142,7 +141,6 @@ define void @banerjee1(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
142141
; DELIN-NEXT: Equal predicate: (sext i64 {80,+,80}<%for.cond1.preheader> to i128) == {80,+,80}<nuw><nsw><%for.cond1.preheader>
143142
; DELIN-NEXT: Equal predicate: (sext i64 {160,+,80}<%for.cond1.preheader> to i128) == (80 + (sext i64 {80,+,80}<%for.cond1.preheader> to i128))<nsw>
144143
; DELIN-NEXT: Equal predicate: (15 + (sext i64 {144,+,80}<%for.cond1.preheader> to i128))<nuw><nsw> == (-1 + (sext i64 {160,+,80}<%for.cond1.preheader> to i128))<nsw>
145-
; DELIN-NEXT: Compare predicate: {1,+,1}<nuw><nsw><%for.body3> slt) 10
146144
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %2 = load i64, ptr %arrayidx6, align 8
147145
; DELIN-NEXT: da analyze - consistent flow [0 1]!
148146
; DELIN-NEXT: Runtime Assumptions:
@@ -160,7 +158,6 @@ define void @banerjee1(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
160158
; DELIN-NEXT: Equal predicate: (sext i64 {80,+,80}<%for.cond1.preheader> to i128) == {80,+,80}<nuw><nsw><%for.cond1.preheader>
161159
; DELIN-NEXT: Equal predicate: (sext i64 {160,+,80}<%for.cond1.preheader> to i128) == (80 + (sext i64 {80,+,80}<%for.cond1.preheader> to i128))<nsw>
162160
; DELIN-NEXT: Equal predicate: (15 + (sext i64 {144,+,80}<%for.cond1.preheader> to i128))<nuw><nsw> == (-1 + (sext i64 {160,+,80}<%for.cond1.preheader> to i128))<nsw>
163-
; DELIN-NEXT: Compare predicate: {0,+,1}<nuw><nsw><%for.body3> slt) 10
164161
; DELIN-NEXT: Src: %2 = load i64, ptr %arrayidx6, align 8 --> Dst: store i64 %2, ptr %B.addr.12, align 8
165162
; DELIN-NEXT: da analyze - confused!
166163
; DELIN-NEXT: Src: store i64 %2, ptr %B.addr.12, align 8 --> Dst: store i64 %2, ptr %B.addr.12, align 8
@@ -352,7 +349,6 @@ define void @banerjee3(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
352349
; DELIN-NEXT: da analyze - consistent input [0 0]!
353350
; DELIN-NEXT: Runtime Assumptions:
354351
; DELIN-NEXT: Compare predicate: {9,+,1}<nuw><nsw><%for.body3> slt) 10
355-
; DELIN-NEXT: Compare predicate: {9,+,1}<nuw><nsw><%for.body3> slt) 10
356352
; DELIN-NEXT: Src: %0 = load i64, ptr %arrayidx7, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
357353
; DELIN-NEXT: da analyze - confused!
358354
; DELIN-NEXT: Src: store i64 %0, ptr %B.addr.11, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
@@ -527,7 +523,6 @@ define void @banerjee5(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
527523
; DELIN-NEXT: da analyze - consistent input [0 0]!
528524
; DELIN-NEXT: Runtime Assumptions:
529525
; DELIN-NEXT: Compare predicate: {-9,+,1}<nsw><%for.body3> sge) 0
530-
; DELIN-NEXT: Compare predicate: {-9,+,1}<nsw><%for.body3> sge) 0
531526
; DELIN-NEXT: Src: %0 = load i64, ptr %arrayidx6, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
532527
; DELIN-NEXT: da analyze - confused!
533528
; DELIN-NEXT: Src: store i64 %0, ptr %B.addr.11, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
@@ -617,7 +612,6 @@ define void @banerjee6(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
617612
; DELIN-NEXT: da analyze - consistent input [0 0]!
618613
; DELIN-NEXT: Runtime Assumptions:
619614
; DELIN-NEXT: Compare predicate: {9,+,1}<nuw><nsw><%for.body3> slt) 10
620-
; DELIN-NEXT: Compare predicate: {9,+,1}<nuw><nsw><%for.body3> slt) 10
621615
; DELIN-NEXT: Src: %0 = load i64, ptr %arrayidx7, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
622616
; DELIN-NEXT: da analyze - confused!
623617
; DELIN-NEXT: Src: store i64 %0, ptr %B.addr.11, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
@@ -792,7 +786,6 @@ define void @banerjee8(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
792786
; DELIN-NEXT: da analyze - consistent input [0 0]!
793787
; DELIN-NEXT: Runtime Assumptions:
794788
; DELIN-NEXT: Compare predicate: {1,+,1}<nuw><nsw><%for.body3> slt) 10
795-
; DELIN-NEXT: Compare predicate: {1,+,1}<nuw><nsw><%for.body3> slt) 10
796789
; DELIN-NEXT: Src: %0 = load i64, ptr %arrayidx7, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
797790
; DELIN-NEXT: da analyze - confused!
798791
; DELIN-NEXT: Src: store i64 %0, ptr %B.addr.11, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
@@ -874,7 +867,6 @@ define void @banerjee9(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
874867
; DELIN-NEXT: da analyze - consistent output [0 0]!
875868
; DELIN-NEXT: Runtime Assumptions:
876869
; DELIN-NEXT: Compare predicate: {0,+,30}<nuw><nsw><%for.cond1.preheader> slt) 500
877-
; DELIN-NEXT: Compare predicate: {0,+,30}<nuw><nsw><%for.cond1.preheader> slt) 500
878870
; DELIN-NEXT: Src: store i64 0, ptr %arrayidx, align 8 --> Dst: %1 = load i64, ptr %arrayidx7, align 8
879871
; DELIN-NEXT: da analyze - flow [< 0]!
880872
; DELIN-NEXT: Runtime Assumptions:
@@ -1056,7 +1048,6 @@ define void @banerjee11(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
10561048
; DELIN-NEXT: da analyze - consistent input [0 0]!
10571049
; DELIN-NEXT: Runtime Assumptions:
10581050
; DELIN-NEXT: Compare predicate: {11,+,-1}<nsw><%for.body3> sge) 0
1059-
; DELIN-NEXT: Compare predicate: {11,+,-1}<nsw><%for.body3> sge) 0
10601051
; DELIN-NEXT: Src: %0 = load i64, ptr %arrayidx6, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
10611052
; DELIN-NEXT: da analyze - confused!
10621053
; DELIN-NEXT: Src: store i64 %0, ptr %B.addr.11, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
@@ -1146,7 +1137,6 @@ define void @banerjee12(ptr %A, ptr %B, i64 %m, i64 %n) nounwind uwtable ssp {
11461137
; DELIN-NEXT: da analyze - consistent input [0 0]!
11471138
; DELIN-NEXT: Runtime Assumptions:
11481139
; DELIN-NEXT: Compare predicate: {11,+,-1}<nsw><%for.body3> sge) 0
1149-
; DELIN-NEXT: Compare predicate: {11,+,-1}<nsw><%for.body3> sge) 0
11501140
; DELIN-NEXT: Src: %0 = load i64, ptr %arrayidx6, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8
11511141
; DELIN-NEXT: da analyze - confused!
11521142
; DELIN-NEXT: Src: store i64 %0, ptr %B.addr.11, align 8 --> Dst: store i64 %0, ptr %B.addr.11, align 8

llvm/test/Analysis/DependenceAnalysis/Constraints.ll

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ define void @dep_constraint_crash_test(i32 %M, i32 %N) {
4040
; CHECK-NEXT: da analyze - consistent output [S 0 0]!
4141
; CHECK-NEXT: Runtime Assumptions:
4242
; CHECK-NEXT: Compare predicate: {10,+,10}<nuw><nsw><%.lr.ph4> slt) 111
43-
; CHECK-NEXT: Compare predicate: {10,+,10}<nuw><nsw><%.lr.ph4> slt) 111
4443
; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: %18 = load i32, ptr %17, align 4
4544
; CHECK-NEXT: da analyze - flow [S * *|<]!
4645
; CHECK-NEXT: Src: store i32 0, ptr %13, align 4 --> Dst: %20 = load i32, ptr %19, align 4
@@ -84,7 +83,6 @@ define void @dep_constraint_crash_test(i32 %M, i32 %N) {
8483
; CHECK-NEXT: da analyze - consistent input [S 0 S 0]!
8584
; CHECK-NEXT: Runtime Assumptions:
8685
; CHECK-NEXT: Compare predicate: {1,+,1}<nuw><nsw><%.lr.ph> slt) 11
87-
; CHECK-NEXT: Compare predicate: {1,+,1}<nuw><nsw><%.lr.ph> slt) 11
8886
; CHECK-NEXT: Src: %20 = load i32, ptr %19, align 4 --> Dst: %23 = load i32, ptr %22, align 4
8987
; CHECK-NEXT: da analyze - input [S * * *|<]!
9088
; CHECK-NEXT: Src: %20 = load i32, ptr %19, align 4 --> Dst: store i32 %24, ptr %25, align 4
@@ -132,7 +130,6 @@ define void @dep_constraint_crash_test(i32 %M, i32 %N) {
132130
; CHECK-NEXT: da analyze - consistent input [S 0 0]!
133131
; CHECK-NEXT: Runtime Assumptions:
134132
; CHECK-NEXT: Compare predicate: {10,+,11}<%.lr.ph4> slt) 111
135-
; CHECK-NEXT: Compare predicate: {10,+,11}<%.lr.ph4> slt) 111
136133
; CHECK-NEXT: Src: %27 = load i32, ptr %26, align 4 --> Dst: %29 = load i32, ptr %28, align 4
137134
; CHECK-NEXT: da analyze - none!
138135
; CHECK-NEXT: Src: %27 = load i32, ptr %26, align 4 --> Dst: store i32 %30, ptr %31, align 4
@@ -145,7 +142,6 @@ define void @dep_constraint_crash_test(i32 %M, i32 %N) {
145142
; CHECK-NEXT: da analyze - consistent input [S 0 0]!
146143
; CHECK-NEXT: Runtime Assumptions:
147144
; CHECK-NEXT: Compare predicate: {1,+,1}<nw><%.lr.ph4> slt) 11
148-
; CHECK-NEXT: Compare predicate: {1,+,1}<nw><%.lr.ph4> slt) 11
149145
; CHECK-NEXT: Src: %29 = load i32, ptr %28, align 4 --> Dst: store i32 %30, ptr %31, align 4
150146
; CHECK-NEXT: da analyze - none!
151147
; CHECK-NEXT: Src: %29 = load i32, ptr %28, align 4 --> Dst: %32 = load i32, ptr %6, align 4
@@ -156,7 +152,6 @@ define void @dep_constraint_crash_test(i32 %M, i32 %N) {
156152
; CHECK-NEXT: da analyze - consistent output [S 0 0]!
157153
; CHECK-NEXT: Runtime Assumptions:
158154
; CHECK-NEXT: Compare predicate: {1,+,1}<nw><%.lr.ph4> slt) 11
159-
; CHECK-NEXT: Compare predicate: {1,+,1}<nw><%.lr.ph4> slt) 11
160155
; CHECK-NEXT: Src: store i32 %30, ptr %31, align 4 --> Dst: %32 = load i32, ptr %6, align 4
161156
; CHECK-NEXT: da analyze - flow [S|<]!
162157
; CHECK-NEXT: Src: store i32 %30, ptr %31, align 4 --> Dst: store i32 %33, ptr @out_l, align 4

0 commit comments

Comments
 (0)