@@ -222,3 +222,78 @@ loop:
222
222
exit:
223
223
ret void
224
224
}
225
+
226
+ define void @check_creation_order (ptr %a , ptr %b , i32 %m ) {
227
+ ; CHECK-LABEL: @check_creation_order(
228
+ ; CHECK-NEXT: entry:
229
+ ; CHECK-NEXT: [[B2:%.*]] = ptrtoint ptr [[B:%.*]] to i64
230
+ ; CHECK-NEXT: [[A1:%.*]] = ptrtoint ptr [[A:%.*]] to i64
231
+ ; CHECK-NEXT: [[M_EXT:%.*]] = sext i32 [[M:%.*]] to i64
232
+ ; CHECK-NEXT: [[INVARIANT_GEP:%.*]] = getelementptr double, ptr [[A]], i64 [[M_EXT]]
233
+ ; CHECK-NEXT: br i1 false, label [[SCALAR_PH:%.*]], label [[VECTOR_MEMCHECK:%.*]]
234
+ ; CHECK: vector.memcheck:
235
+ ; CHECK-NEXT: [[TMP0:%.*]] = sub i64 [[A1]], [[B2]]
236
+ ; CHECK-NEXT: [[DIFF_CHECK:%.*]] = icmp ult i64 [[TMP0]], 32
237
+ ; CHECK-NEXT: [[TMP1:%.*]] = mul nsw i64 [[M_EXT]], -8
238
+ ; CHECK-NEXT: [[DIFF_CHECK3:%.*]] = icmp ult i64 [[TMP1]], 32
239
+ ; CHECK-NEXT: [[CONFLICT_RDX:%.*]] = or i1 [[DIFF_CHECK]], [[DIFF_CHECK3]]
240
+ ; CHECK-NEXT: br i1 [[CONFLICT_RDX]], label [[SCALAR_PH]], label [[VECTOR_PH:%.*]]
241
+ ; CHECK: vector.ph:
242
+ ; CHECK-NEXT: br label [[VECTOR_BODY:%.*]]
243
+ ; CHECK: vector.body:
244
+ ; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, [[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], [[VECTOR_BODY]] ]
245
+ ; CHECK-NEXT: [[TMP2:%.*]] = add i64 [[INDEX]], 0
246
+ ; CHECK-NEXT: [[TMP3:%.*]] = getelementptr double, ptr [[INVARIANT_GEP]], i64 [[TMP2]]
247
+ ; CHECK-NEXT: [[TMP4:%.*]] = getelementptr double, ptr [[TMP3]], i32 0
248
+ ; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <4 x double>, ptr [[TMP4]], align 8
249
+ ; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds double, ptr [[B]], i64 [[TMP2]]
250
+ ; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds double, ptr [[TMP5]], i32 0
251
+ ; CHECK-NEXT: [[WIDE_LOAD4:%.*]] = load <4 x double>, ptr [[TMP6]], align 8
252
+ ; CHECK-NEXT: [[TMP7:%.*]] = fadd <4 x double> [[WIDE_LOAD]], [[WIDE_LOAD4]]
253
+ ; CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[TMP2]]
254
+ ; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds double, ptr [[TMP8]], i32 0
255
+ ; CHECK-NEXT: store <4 x double> [[TMP7]], ptr [[TMP9]], align 8
256
+ ; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 4
257
+ ; CHECK-NEXT: [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 31996
258
+ ; CHECK-NEXT: br i1 [[TMP10]], label [[MIDDLE_BLOCK:%.*]], label [[VECTOR_BODY]], !llvm.loop [[LOOP4:![0-9]+]]
259
+ ; CHECK: middle.block:
260
+ ; CHECK-NEXT: br i1 false, label [[EXIT:%.*]], label [[SCALAR_PH]]
261
+ ; CHECK: scalar.ph:
262
+ ; CHECK-NEXT: [[BC_RESUME_VAL:%.*]] = phi i64 [ 31996, [[MIDDLE_BLOCK]] ], [ 0, [[ENTRY:%.*]] ], [ 0, [[VECTOR_MEMCHECK]] ]
263
+ ; CHECK-NEXT: br label [[LOOP:%.*]]
264
+ ; CHECK: loop:
265
+ ; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], [[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
266
+ ; CHECK-NEXT: [[GEP:%.*]] = getelementptr double, ptr [[INVARIANT_GEP]], i64 [[IV]]
267
+ ; CHECK-NEXT: [[L_0:%.*]] = load double, ptr [[GEP]], align 8
268
+ ; CHECK-NEXT: [[GEP_B:%.*]] = getelementptr inbounds double, ptr [[B]], i64 [[IV]]
269
+ ; CHECK-NEXT: [[L_1:%.*]] = load double, ptr [[GEP_B]], align 8
270
+ ; CHECK-NEXT: [[ADD3:%.*]] = fadd double [[L_0]], [[L_1]]
271
+ ; CHECK-NEXT: [[GEP_A:%.*]] = getelementptr inbounds double, ptr [[A]], i64 [[IV]]
272
+ ; CHECK-NEXT: store double [[ADD3]], ptr [[GEP_A]], align 8
273
+ ; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
274
+ ; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i64 [[IV_NEXT]], 31999
275
+ ; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[EXIT]], label [[LOOP]], !llvm.loop [[LOOP5:![0-9]+]]
276
+ ; CHECK: exit:
277
+ ; CHECK-NEXT: ret void
278
+ ;
279
+ entry:
280
+ %m.ext = sext i32 %m to i64
281
+ %invariant.gep = getelementptr double , ptr %a , i64 %m.ext
282
+ br label %loop
283
+
284
+ loop:
285
+ %iv = phi i64 [ 0 , %entry ], [ %iv.next , %loop ]
286
+ %gep = getelementptr double , ptr %invariant.gep , i64 %iv
287
+ %l.0 = load double , ptr %gep , align 8
288
+ %gep.b = getelementptr inbounds double , ptr %b , i64 %iv
289
+ %l.1 = load double , ptr %gep.b , align 8
290
+ %add3 = fadd double %l.0 , %l.1
291
+ %gep.a = getelementptr inbounds double , ptr %a , i64 %iv
292
+ store double %add3 , ptr %gep.a , align 8
293
+ %iv.next = add nuw nsw i64 %iv , 1
294
+ %exitcond.not = icmp eq i64 %iv.next , 31999
295
+ br i1 %exitcond.not , label %exit , label %loop
296
+
297
+ exit:
298
+ ret void
299
+ }
0 commit comments