@@ -172,18 +172,29 @@ exit:
172
172
ret void
173
173
}
174
174
175
- ; FIXME: Full no-overlap checks are required instead of difference checks, as
175
+ ; Full no-overlap checks are required instead of difference checks, as
176
176
; one of the add-recs used is invariant in the inner loop.
177
177
; Test case for PR57315.
178
178
define void @nested_loop_outer_iv_addrec_invariant_in_inner1 (ptr %a , ptr %b , i64 %n ) {
179
179
; CHECK-LABEL: @nested_loop_outer_iv_addrec_invariant_in_inner1(
180
- ; CHECK: entry:
181
- ; CHECK-NEXT: [[B:%.*]] = ptrtoint ptr %b to i64
182
- ; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr %a to i64
180
+ ; CHECK: entry:
181
+ ; CHECK-NEXT: [[N_SHL_2:%.]] = shl i64 %n, 2
182
+ ; CHECK-NEXT: [[B_GEP_UPPER:%.*]] = getelementptr i8, ptr %b, i64 [[N_SHL_2]]
183
+ ; CHECK-NEXT: br label %outer
184
+
185
+ ; CHECK: outer.header:
186
+ ; CHECK: [[OUTER_IV_SHL_2:%.]] = shl i64 %outer.iv, 2
187
+ ; CHECK-NEXT: [[A_GEP_UPPER:%.*]] = getelementptr i8, ptr %a, i64 [[OUTER_IV_SHL_2]]
188
+ ; CHECK-NEXT: [[OUTER_IV_4:%.]] = add i64 [[OUTER_IV_SHL_2]], 4
189
+ ; CHECK-NEXT: [[A_GEP_UPPER_4:%.*]] = getelementptr i8, ptr %a, i64 [[OUTER_IV_4]]
190
+ ; CHECK: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N:%.*]], 4
191
+ ; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %scalar.ph, label %vector.memcheck
192
+
183
193
; CHECK: vector.memcheck:
184
- ; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[A]], [[B]]
185
- ; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP1]], 16
186
- ; CHECK-NEXT: br i1 [[DIFF_CHECK]], label %scalar.ph, label %vector.ph
194
+ ; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr [[A_GEP_UPPER]], [[B_GEP_UPPER]]
195
+ ; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr %b, [[A_GEP_UPPER_4]]
196
+ ; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
197
+ ; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label %scalar.ph, label %vector.ph
187
198
;
188
199
entry:
189
200
br label %outer.header
@@ -216,13 +227,24 @@ exit:
216
227
; sink and source swapped.
217
228
define void @nested_loop_outer_iv_addrec_invariant_in_inner2 (ptr %a , ptr %b , i64 %n ) {
218
229
; CHECK-LABEL: @nested_loop_outer_iv_addrec_invariant_in_inner2(
219
- ; CHECK: entry:
220
- ; CHECK-NEXT: [[A:%.*]] = ptrtoint ptr %a to i64
221
- ; CHECK-NEXT: [[B:%.*]] = ptrtoint ptr %b to i64
230
+ ; CHECK: entry:
231
+ ; CHECK-NEXT: [[N_SHL_2:%.]] = shl i64 %n, 2
232
+ ; CHECK-NEXT: [[B_GEP_UPPER:%.*]] = getelementptr i8, ptr %b, i64 [[N_SHL_2]]
233
+ ; CHECK-NEXT: br label %outer
234
+
235
+ ; CHECK: outer.header:
236
+ ; CHECK: [[OUTER_IV_SHL_2:%.]] = shl i64 %outer.iv, 2
237
+ ; CHECK-NEXT: [[A_GEP_UPPER:%.*]] = getelementptr i8, ptr %a, i64 [[OUTER_IV_SHL_2]]
238
+ ; CHECK-NEXT: [[OUTER_IV_4:%.]] = add i64 [[OUTER_IV_SHL_2]], 4
239
+ ; CHECK-NEXT: [[A_GEP_UPPER_4:%.*]] = getelementptr i8, ptr %a, i64 [[OUTER_IV_4]]
240
+ ; CHECK: [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N:%.*]], 4
241
+ ; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label %scalar.ph, label %vector.memcheck
242
+
222
243
; CHECK: vector.memcheck:
223
- ; CHECK-NEXT: [[TMP1:%.*]] = sub i64 [[B]], [[A]]
224
- ; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP1]], 16
225
- ; CHECK-NEXT: br i1 [[DIFF_CHECK]], label %scalar.ph, label %vector.ph
244
+ ; CHECK-NEXT: [[BOUND0:%.*]] = icmp ult ptr %b, [[A_GEP_UPPER_4]]
245
+ ; CHECK-NEXT: [[BOUND1:%.*]] = icmp ult ptr [[A_GEP_UPPER]], [[B_GEP_UPPER]]
246
+ ; CHECK-NEXT: [[FOUND_CONFLICT:%.*]] = and i1 [[BOUND0]], [[BOUND1]]
247
+ ; CHECK-NEXT: br i1 [[FOUND_CONFLICT]], label %scalar.ph, label %vector.ph
226
248
;
227
249
entry:
228
250
br label %outer.header
0 commit comments