@@ -222,3 +222,78 @@ loop:
222222exit:
223223 ret void
224224}
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