Skip to content

Commit 97469d4

Browse files
committed
[SLP] Add additional memory version tests.
1 parent 6b0f359 commit 97469d4

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

llvm/test/Transforms/SLPVectorizer/AArch64/memory-runtime-checks.ll

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,103 @@ bb1: ; preds = %bb
352352
bb15: ; preds = %bb15, %bb14
353353
br label %bb15
354354
}
355+
356+
%struct = type { i32, i32, float, float }
357+
358+
; Some points we collected as candidates for runtime checks have been removed
359+
; before generating runtime checks. Make sure versioning is skipped.
360+
define void @test_bounds_removed_before_runtime_checks(%struct * %A, i32** %B, i1 %c) {
361+
; CHECK-LABEL: @test_bounds_removed_before_runtime_checks(
362+
; CHECK-NEXT: entry:
363+
; CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds [[STRUCT:%.*]], %struct* [[A:%.*]], i64 0, i32 0
364+
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds [[STRUCT]], %struct* [[A]], i64 0, i32 1
365+
; CHECK-NEXT: [[TMP0:%.*]] = bitcast i32* [[TMP11]] to <2 x i32>*
366+
; CHECK-NEXT: store <2 x i32> <i32 10, i32 300>, <2 x i32>* [[TMP0]], align 8
367+
; CHECK-NEXT: [[TMP13:%.*]] = load i32*, i32** [[B:%.*]], align 8
368+
; CHECK-NEXT: br i1 [[C:%.*]], label [[BB23:%.*]], label [[BB14:%.*]]
369+
; CHECK: bb14:
370+
; CHECK-NEXT: [[TMP15:%.*]] = sext i32 10 to i64
371+
; CHECK-NEXT: [[TMP16:%.*]] = add nsw i64 2, [[TMP15]]
372+
; CHECK-NEXT: [[TMP17:%.*]] = getelementptr inbounds i32, i32* [[TMP13]], i64 [[TMP16]]
373+
; CHECK-NEXT: [[TMP18:%.*]] = bitcast i32* [[TMP17]] to i8*
374+
; CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds i8, i8* [[TMP18]], i64 3
375+
; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds [[STRUCT]], %struct* [[A]], i64 0, i32 2
376+
; CHECK-NEXT: store float 0.000000e+00, float* [[TMP20]], align 8
377+
; CHECK-NEXT: [[TMP21:%.*]] = load i8, i8* [[TMP19]], align 1
378+
; CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds [[STRUCT]], %struct* [[A]], i64 0, i32 3
379+
; CHECK-NEXT: store float 0.000000e+00, float* [[TMP22]], align 4
380+
; CHECK-NEXT: br label [[BB23]]
381+
; CHECK: bb23:
382+
; CHECK-NEXT: ret void
383+
;
384+
entry:
385+
%tmp1 = fmul float 10.0, 20.0
386+
%tmp2 = fptosi float %tmp1 to i32
387+
%tmp3 = fmul float 30.0, 20.0
388+
%tmp4 = fptosi float %tmp3 to i32
389+
%tmp5 = icmp sgt i32 100, %tmp2
390+
%tmp6 = select i1 %tmp5, i32 %tmp2, i32 10
391+
%tmp7 = select i1 false, i32 0, i32 %tmp6
392+
%tmp8 = icmp sgt i32 200, %tmp4
393+
%tmp9 = select i1 %tmp8, i32 %tmp4, i32 300
394+
%tmp10 = select i1 false, i32 0, i32 %tmp9
395+
%tmp11 = getelementptr inbounds %struct, %struct* %A, i64 0, i32 0
396+
store i32 %tmp7, i32* %tmp11, align 8
397+
%tmp12 = getelementptr inbounds %struct, %struct* %A, i64 0, i32 1
398+
store i32 %tmp10, i32* %tmp12, align 4
399+
%tmp13 = load i32*, i32** %B, align 8
400+
br i1 %c, label %bb23, label %bb14
401+
402+
bb14:
403+
%tmp15 = sext i32 %tmp7 to i64
404+
%tmp16 = add nsw i64 2, %tmp15
405+
%tmp17 = getelementptr inbounds i32, i32* %tmp13, i64 %tmp16
406+
%tmp18 = bitcast i32* %tmp17 to i8*
407+
%tmp19 = getelementptr inbounds i8, i8* %tmp18, i64 3
408+
%tmp20 = getelementptr inbounds %struct, %struct* %A, i64 0, i32 2
409+
store float 0.0, float* %tmp20, align 8
410+
%tmp21 = load i8, i8* %tmp19, align 1
411+
%tmp22 = getelementptr inbounds %struct, %struct* %A, i64 0, i32 3
412+
store float 0.0, float* %tmp22, align 4
413+
br label %bb23
414+
415+
bb23:
416+
ret void
417+
}
418+
419+
; In this test there's a single bound, do not generate runtime checks.
420+
define void @single_membound(double* %arg, double* %arg1, double %x) {
421+
; CHECK-LABEL: @single_membound(
422+
; CHECK-NEXT: entry:
423+
; CHECK-NEXT: [[TMP:%.*]] = fsub double [[X:%.*]], 9.900000e+01
424+
; CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds double, double* [[ARG:%.*]], i64 1
425+
; CHECK-NEXT: store double [[TMP]], double* [[TMP9]], align 8
426+
; CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds double, double* [[ARG1:%.*]], i64 0
427+
; CHECK-NEXT: [[TMP12:%.*]] = load double, double* [[TMP10]], align 8
428+
; CHECK-NEXT: [[TMP13:%.*]] = fsub double 1.000000e+00, [[TMP12]]
429+
; CHECK-NEXT: [[TMP14:%.*]] = getelementptr inbounds double, double* [[ARG]], i64 2
430+
; CHECK-NEXT: br label [[BB15:%.*]]
431+
; CHECK: bb15:
432+
; CHECK-NEXT: [[TMP16:%.*]] = fmul double [[TMP]], 2.000000e+01
433+
; CHECK-NEXT: store double [[TMP16]], double* [[TMP9]], align 8
434+
; CHECK-NEXT: [[TMP17:%.*]] = fmul double [[TMP13]], 3.000000e+01
435+
; CHECK-NEXT: store double [[TMP17]], double* [[TMP14]], align 8
436+
; CHECK-NEXT: ret void
437+
;
438+
entry:
439+
%tmp = fsub double %x, 99.0
440+
%tmp9 = getelementptr inbounds double, double* %arg, i64 1
441+
store double %tmp, double* %tmp9, align 8
442+
%tmp10 = getelementptr inbounds double, double* %arg1, i64 0
443+
%tmp12 = load double, double* %tmp10, align 8
444+
%tmp13 = fsub double 1.0, %tmp12
445+
%tmp14 = getelementptr inbounds double, double* %arg, i64 2
446+
br label %bb15
447+
448+
bb15:
449+
%tmp16 = fmul double %tmp, 20.0
450+
store double %tmp16, double* %tmp9, align 8
451+
%tmp17 = fmul double %tmp13, 30.0
452+
store double %tmp17, double* %tmp14, align 8
453+
ret void
454+
}

0 commit comments

Comments
 (0)