Skip to content

Commit bb4c8f9

Browse files
authored
[SCEV] Don't add predicates already implied by UnionPredicate. (#93397)
Update SCEVUnionPredicate::add to only add predicates from another union predicate, if they aren't alread implied by the union predicate we add them to. Note that there exists logic elsewhere to avoid adding predicates if they are already implied, but this logic misses cases when only some predicates of a union predicate are implied by the current set of predicates. PR: #93397
1 parent 686600b commit bb4c8f9

File tree

2 files changed

+16
-21
lines changed

2 files changed

+16
-21
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14751,7 +14751,9 @@ void SCEVUnionPredicate::add(const SCEVPredicate *N) {
1475114751
return;
1475214752
}
1475314753

14754-
Preds.push_back(N);
14754+
// Only add predicate if it is not already implied by this union predicate.
14755+
if (!implies(N))
14756+
Preds.push_back(N);
1475514757
}
1475614758

1475714759
PredicatedScalarEvolution::PredicatedScalarEvolution(ScalarEvolution &SE,

llvm/test/Transforms/LoopVectorize/scev-predicate-reasoning.ll

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,6 @@ for.end: ; preds = %for.cond
152152

153153
@h = global i64 0
154154

155-
; TODO: Currently we generate SCEV check code for the same predicate twice.
156155
define void @implied_wrap_predicate(ptr %A, ptr %B, ptr %C) {
157156
; CHECK-LABEL: define void @implied_wrap_predicate
158157
; CHECK-SAME: (ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]]) {
@@ -184,17 +183,11 @@ define void @implied_wrap_predicate(ptr %A, ptr %B, ptr %C) {
184183
; CHECK-NEXT: [[TMP16:%.*]] = icmp ult i16 [[TMP15]], 2
185184
; CHECK-NEXT: [[TMP17:%.*]] = icmp ugt i64 [[TMP8]], 65535
186185
; CHECK-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]]
187-
; CHECK-NEXT: [[TMP19:%.*]] = trunc i64 [[TMP8]] to i16
188-
; CHECK-NEXT: [[TMP20:%.*]] = add i16 1, [[TMP19]]
189-
; CHECK-NEXT: [[TMP21:%.*]] = icmp ult i16 [[TMP20]], 1
190-
; CHECK-NEXT: [[TMP22:%.*]] = icmp ugt i64 [[TMP8]], 65535
191-
; CHECK-NEXT: [[TMP23:%.*]] = or i1 [[TMP21]], [[TMP22]]
192-
; CHECK-NEXT: [[TMP24:%.*]] = or i1 [[TMP13]], [[TMP18]]
193-
; CHECK-NEXT: [[TMP25:%.*]] = or i1 [[TMP24]], [[TMP23]]
194-
; CHECK-NEXT: br i1 [[TMP25]], label [[SCALAR_PH]], label [[VECTOR_MEMCHECK:%.*]]
186+
; CHECK-NEXT: [[TMP19:%.*]] = or i1 [[TMP13]], [[TMP18]]
187+
; CHECK-NEXT: br i1 [[TMP19]], label [[SCALAR_PH]], label [[VECTOR_MEMCHECK:%.*]]
195188
; CHECK: vector.memcheck:
196-
; CHECK-NEXT: [[TMP26:%.*]] = sub i64 [[C2]], [[A3]]
197-
; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP26]], 32
189+
; CHECK-NEXT: [[TMP20:%.*]] = sub i64 [[C2]], [[A3]]
190+
; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP20]], 32
198191
; CHECK-NEXT: br i1 [[DIFF_CHECK]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
199192
; CHECK: vector.ph:
200193
; CHECK-NEXT: [[N_MOD_VF:%.*]] = urem i64 [[TMP4]], 4
@@ -206,16 +199,16 @@ define void @implied_wrap_predicate(ptr %A, ptr %B, ptr %C) {
206199
; CHECK: vector.body:
207200
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
208201
; CHECK-NEXT: [[OFFSET_IDX:%.*]] = add i64 1, [[INDEX]]
209-
; CHECK-NEXT: [[TMP27:%.*]] = add i64 [[OFFSET_IDX]], 0
210-
; CHECK-NEXT: [[TMP28:%.*]] = getelementptr i64, ptr [[A]], i64 [[TMP27]]
211-
; CHECK-NEXT: [[TMP29:%.*]] = getelementptr i64, ptr [[TMP28]], i32 0
212-
; CHECK-NEXT: store <4 x i64> zeroinitializer, ptr [[TMP29]], align 4
213-
; CHECK-NEXT: [[TMP30:%.*]] = getelementptr i64, ptr [[C]], i64 [[TMP27]]
214-
; CHECK-NEXT: [[TMP31:%.*]] = getelementptr i64, ptr [[TMP30]], i32 0
215-
; CHECK-NEXT: store <4 x i64> zeroinitializer, ptr [[TMP31]], align 4
202+
; CHECK-NEXT: [[TMP21:%.*]] = add i64 [[OFFSET_IDX]], 0
203+
; CHECK-NEXT: [[TMP22:%.*]] = getelementptr i64, ptr [[A]], i64 [[TMP21]]
204+
; CHECK-NEXT: [[TMP23:%.*]] = getelementptr i64, ptr [[TMP22]], i32 0
205+
; CHECK-NEXT: store <4 x i64> zeroinitializer, ptr [[TMP23]], align 4
206+
; CHECK-NEXT: [[TMP24:%.*]] = getelementptr i64, ptr [[C]], i64 [[TMP21]]
207+
; CHECK-NEXT: [[TMP25:%.*]] = getelementptr i64, ptr [[TMP24]], i32 0
208+
; CHECK-NEXT: store <4 x i64> zeroinitializer, ptr [[TMP25]], align 4
216209
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
217-
; CHECK-NEXT: [[TMP32:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
218-
; CHECK-NEXT: br i1 [[TMP32]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
210+
; CHECK-NEXT: [[TMP26:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
211+
; CHECK-NEXT: br i1 [[TMP26]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP6:![0-9]+]]
219212
; CHECK: middle.block:
220213
; CHECK-NEXT: [[CMP_N:%.*]] = icmp eq i64 [[TMP4]], [[N_VEC]]
221214
; CHECK-NEXT: br i1 [[CMP_N]], label [[EXIT:%.*]], label [[SCALAR_PH]]

0 commit comments

Comments
 (0)