@@ -171,3 +171,44 @@ loop:
171
171
exit:
172
172
ret void
173
173
}
174
+
175
+ ; FIXME: Full no-overlap checks are required instead of difference checks, as
176
+ ; one of the add-recs used is invariant in the inner loop.
177
+ ; Test case for PR57315.
178
+ define void @nested_loop_outer_iv_addrec_invariant_in_inner (ptr %a , ptr %b , i64 %n ) {
179
+ ; CHECK-LABEL: @nested_loop_outer_iv_addrec_invariant_in_inner(
180
+ ; CHECK: entry:
181
+ ; CHECK-NEXT: [[B2:%.*]] = ptrtoint ptr [[B:%.*]] to i64
182
+ ; CHECK-NEXT: [[A1:%.*]] = ptrtoint ptr [[A:%.*]] to i64
183
+ ; CHECK: vector.memcheck:
184
+ ; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[A1]], [[B2]]
185
+ ; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP1]], 16
186
+ ; CHECK-NEXT: br i1 [[DIFF_CHECK]], label %scalar.ph, label %vector.ph
187
+ ;
188
+ entry:
189
+ br label %outer.header
190
+
191
+ outer.header:
192
+ %outer.iv = phi i64 [ %outer.iv.next , %outer.latch ], [ 0 , %entry ]
193
+ %gep.a = getelementptr inbounds i32 , ptr %a , i64 %outer.iv
194
+ br label %inner.body
195
+
196
+ inner.body:
197
+ %red = phi i32 [ 0 , %outer.header ], [ %red.next , %inner.body ]
198
+ %inner.iv = phi i64 [ 0 , %outer.header ], [ %inner.iv.next , %inner.body ]
199
+ %gep.b = getelementptr inbounds i32 , ptr %b , i64 %inner.iv
200
+ %l = load i32 , ptr %gep.b , align 4
201
+ %red.next = sub i32 %red , %l
202
+ store i32 %red.next , ptr %gep.a , align 4
203
+ %inner.iv.next = add nuw nsw i64 %inner.iv , 1
204
+ %inner.cond = icmp eq i64 %inner.iv.next , %n
205
+ br i1 %inner.cond , label %outer.latch , label %inner.body
206
+
207
+ outer.latch:
208
+ %outer.iv.next = add nuw nsw i64 %outer.iv , 1
209
+ %outer.cond = icmp eq i64 %outer.iv.next , %n
210
+ br i1 %outer.cond , label %exit , label %outer.header
211
+
212
+ exit:
213
+ ret void
214
+ }
0 commit comments