1 ; RUN: opt -loop-vectorize -mtriple=arm64-apple-iphoneos -S %s | FileCheck %s
3 ; Tests for loops with large numbers of runtime checks. Check that loops are
4 ; vectorized, if the loop trip counts are large and the impact of the runtime
5 ; checks is very small compared to the expected loop runtimes.
8 ; The trip count in the loop in this function is too to warrant large runtime checks.
9 ; CHECK-LABEL: define {{.*}} @test_tc_too_small
10 ; CHECK-NOT: vector.memcheck
11 ; CHECK-NOT: vector.body
12 define void @test_tc_too_small(i16* %ptr.1, i16* %ptr.2, i16* %ptr.3, i16* %ptr.4, i64 %off.1, i64 %off.2) {
16 loop: ; preds = %bb54, %bb37
17 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
18 %gep.1 = getelementptr inbounds i16, i16* %ptr.1, i64 %iv
19 %lv.1 = load i16, i16* %gep.1, align 2
20 %ext.1 = sext i16 %lv.1 to i32
21 %gep.2 = getelementptr inbounds i16, i16* %ptr.2, i64 %iv
22 %lv.2 = load i16, i16* %gep.2, align 2
23 %ext.2 = sext i16 %lv.2 to i32
24 %gep.off.1 = getelementptr inbounds i16, i16* %gep.2, i64 %off.1
25 %lv.3 = load i16, i16* %gep.off.1, align 2
26 %ext.3 = sext i16 %lv.3 to i32
27 %gep.off.2 = getelementptr inbounds i16, i16* %gep.2, i64 %off.2
28 %lv.4 = load i16, i16* %gep.off.2, align 2
29 %ext.4 = sext i16 %lv.4 to i32
30 %tmp62 = mul nsw i32 %ext.2, 11
31 %tmp66 = mul nsw i32 %ext.3, -4
32 %tmp70 = add nsw i32 %tmp62, 4
33 %tmp71 = add nsw i32 %tmp70, %tmp66
34 %tmp72 = add nsw i32 %tmp71, %ext.4
35 %tmp73 = lshr i32 %tmp72, 3
36 %tmp74 = add nsw i32 %tmp73, %ext.1
37 %tmp75 = lshr i32 %tmp74, 1
38 %tmp76 = mul nsw i32 %ext.2, 5
39 %tmp77 = shl nsw i32 %ext.3, 2
40 %tmp78 = add nsw i32 %tmp76, 4
41 %tmp79 = add nsw i32 %tmp78, %tmp77
42 %tmp80 = sub nsw i32 %tmp79, %ext.4
43 %tmp81 = lshr i32 %tmp80, 3
44 %tmp82 = sub nsw i32 %tmp81, %ext.1
45 %tmp83 = lshr i32 %tmp82, 1
46 %trunc.1 = trunc i32 %tmp75 to i16
47 %gep.3 = getelementptr inbounds i16, i16* %ptr.3, i64 %iv
48 store i16 %trunc.1, i16* %gep.3, align 2
49 %trunc.2 = trunc i32 %tmp83 to i16
50 %gep.4 = getelementptr inbounds i16, i16* %ptr.4, i64 %iv
51 store i16 %trunc.2, i16* %gep.4, align 2
52 %iv.next = add nuw nsw i64 %iv, 1
53 %cmp = icmp ult i64 %iv, 50
54 br i1 %cmp, label %loop, label %exit
61 ; The trip count in the loop in this function high enough to warrant large runtime checks.
62 ; CHECK-LABEL: define {{.*}} @test_tc_big_enough
63 ; CHECK-NOT: vector.memcheck
64 ; CHECK-NOT: vector.body
65 define void @test_tc_big_enough(i16* %ptr.1, i16* %ptr.2, i16* %ptr.3, i16* %ptr.4, i64 %off.1, i64 %off.2) {
69 loop: ; preds = %bb54, %bb37
70 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
71 %gep.1 = getelementptr inbounds i16, i16* %ptr.1, i64 %iv
72 %lv.1 = load i16, i16* %gep.1, align 2
73 %ext.1 = sext i16 %lv.1 to i32
74 %gep.2 = getelementptr inbounds i16, i16* %ptr.2, i64 %iv
75 %lv.2 = load i16, i16* %gep.2, align 2
76 %ext.2 = sext i16 %lv.2 to i32
77 %gep.off.1 = getelementptr inbounds i16, i16* %gep.2, i64 %off.1
78 %lv.3 = load i16, i16* %gep.off.1, align 2
79 %ext.3 = sext i16 %lv.3 to i32
80 %gep.off.2 = getelementptr inbounds i16, i16* %gep.2, i64 %off.2
81 %lv.4 = load i16, i16* %gep.off.2, align 2
82 %ext.4 = sext i16 %lv.4 to i32
83 %tmp62 = mul nsw i32 %ext.2, 11
84 %tmp66 = mul nsw i32 %ext.3, -4
85 %tmp70 = add nsw i32 %tmp62, 4
86 %tmp71 = add nsw i32 %tmp70, %tmp66
87 %tmp72 = add nsw i32 %tmp71, %ext.4
88 %tmp73 = lshr i32 %tmp72, 3
89 %tmp74 = add nsw i32 %tmp73, %ext.1
90 %tmp75 = lshr i32 %tmp74, 1
91 %tmp76 = mul nsw i32 %ext.2, 5
92 %tmp77 = shl nsw i32 %ext.3, 2
93 %tmp78 = add nsw i32 %tmp76, 4
94 %tmp79 = add nsw i32 %tmp78, %tmp77
95 %tmp80 = sub nsw i32 %tmp79, %ext.4
96 %tmp81 = lshr i32 %tmp80, 3
97 %tmp82 = sub nsw i32 %tmp81, %ext.1
98 %tmp83 = lshr i32 %tmp82, 1
99 %trunc.1 = trunc i32 %tmp75 to i16
100 %gep.3 = getelementptr inbounds i16, i16* %ptr.3, i64 %iv
101 store i16 %trunc.1, i16* %gep.3, align 2
102 %trunc.2 = trunc i32 %tmp83 to i16
103 %gep.4 = getelementptr inbounds i16, i16* %ptr.4, i64 %iv
104 store i16 %trunc.2, i16* %gep.4, align 2
105 %iv.next = add nuw nsw i64 %iv, 1
106 %cmp = icmp ult i64 %iv, 500
107 br i1 %cmp, label %loop, label %exit