Skip to content

Commit 1360b9d

Browse files
committed
[LV] Add test for diff check creation order.
Add a test where diff checks are generated initial and then re-generated when re-trying with runtime checks. At the moment, the order doesn't match the order they are created in, as the DiffChecks field in LAI isn't cleared as other fields holding runtime checks.
1 parent b8b8275 commit 1360b9d

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

llvm/test/Transforms/LoopVectorize/runtime-checks-difference-simplifications.ll

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,78 @@ loop:
222222
exit:
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

Comments
 (0)