[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / AArch64 / runtime-check-size-based-threshold.ll
blobccb57dee6cbf8f22f0c9ce8d790ed1ccb325c194
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) {
13 entry:
14   br label %loop
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
56 exit:
57   ret void
60 ; FIXME
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) {
66 entry:
67   br label %loop
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
109 exit:
110   ret void