[Instrumentation] Fix a warning
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / AArch64 / widen-call-with-intrinsic-or-libfunc.ll
blobafc2fd5a049ad19ab428ba950f39c3edfcf82b57
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; REQUIRES: asserts
4 ; RUN: opt -passes=loop-vectorize -force-vector-interleave=1 -vectorizer-maximize-bandwidth -mtriple=arm64-apple-ios -debug -S %s 2>&1 | FileCheck %s
6 target triple = "arm64-apple-ios"
8 ; CHECK-LABEL: LV: Checking a loop in 'test'
9 ; CHECK:      VPlan 'Initial VPlan for VF={2},UF>=1' {
10 ; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
11 ; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
13 ; CHECK-NEXT: Live-in ir<1024> = original trip-count
14 ; CHECK-EMPTY:
15 ; CHECK-NEXT: vector.ph:
16 ; CHECK-NEXT: Successor(s): vector loop
17 ; CHECK-EMPTY:
18 ; CHECK-NEXT: <x1> vector loop: {
19 ; CHECK-NEXT:   vector.body:
20 ; CHECK-NEXT:     EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
21 ; CHECK-NEXT:     vp<[[STEPS:%.+]]>    = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
22 ; CHECK-NEXT:     CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>
23 ; CHECK-NEXT:     vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.src>
24 ; CHECK-NEXT:     WIDEN ir<%l> = load vp<[[VEC_PTR]]>
25 ; CHECK-NEXT:     WIDEN-CAST ir<%conv> = fpext ir<%l> to double
26 ; CHECK-NEXT:     WIDEN-CALL ir<%s> = call reassoc nnan ninf nsz arcp contract afn @llvm.sin.f64(ir<%conv>) (using library function: __simd_sin_v2f64)
27 ; CHECK-NEXT:     REPLICATE ir<%gep.dst> = getelementptr inbounds ir<%dst>, vp<[[STEPS]]>
28 ; CHECK-NEXT:     REPLICATE store ir<%s>, ir<%gep.dst>
29 ; CHECK-NEXT:     EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
30 ; CHECK-NEXT:     EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VTC]]>
31 ; CHECK-NEXT:   No successors
32 ; CHECK-NEXT: }
33 ; CHECK-NEXT: Successor(s): middle.block
34 ; CHECK-EMPTY:
35 ; CHECK-NEXT: middle.block:
36 ; CHECK-NEXT:   EMIT vp<[[CMP:%.+]]> = icmp eq ir<1024>, vp<[[VTC]]>
37 ; CHECK-NEXT:   EMIT branch-on-cond vp<[[CMP]]>
38 ; CHECK-NEXT: Successor(s): ir-bb<exit>, scalar.ph
39 ; CHECK-EMPTY:
40 ; CHECK-NEXT: ir-bb<exit>:
41 ; CHECK-NEXT: No successors
42 ; CHECK-EMPTY:
43 ; CHECK-NEXT: scalar.ph:
44 ; CHECK-NEXT: Successor(s): ir-bb<loop>
45 ; CHECK-EMPTY:
46 ; CHECK-NEXT: ir-bb<loop>:
47 ; CHECK-NEXT:   IR   %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
48 ; CHECK:        IR   %cmp = icmp ne i64 %iv.next, 1024
49 ; CHECK-NEXT: No successors
50 ; CHECK-NEXT: }
52 ; CHECK:      VPlan 'Initial VPlan for VF={4},UF>=1' {
53 ; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
54 ; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
55 ; CHECK-NEXT: Live-in ir<1024> = original trip-count
56 ; CHECK-EMPTY:
57 ; CHECK-NEXT: vector.ph:
58 ; CHECK-NEXT: Successor(s): vector loop
59 ; CHECK-EMPTY:
60 ; CHECK-NEXT: <x1> vector loop: {
61 ; CHECK-NEXT:   vector.body:
62 ; CHECK-NEXT:     EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
63 ; CHECK-NEXT:     vp<[[STEPS:%.+]]>    = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
64 ; CHECK-NEXT:     CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>
65 ; CHECK-NEXT:     vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.src>
66 ; CHECK-NEXT:     WIDEN ir<%l> = load vp<[[VEC_PTR]]>
67 ; CHECK-NEXT:     WIDEN-CAST ir<%conv> = fpext ir<%l> to double
68 ; CHECK-NEXT:     WIDEN-INTRINSIC ir<%s> = call reassoc nnan ninf nsz arcp contract afn llvm.sin(ir<%conv>)
69 ; CHECK-NEXT:     REPLICATE ir<%gep.dst> = getelementptr inbounds ir<%dst>, vp<[[STEPS]]>
70 ; CHECK-NEXT:     REPLICATE store ir<%s>, ir<%gep.dst>
71 ; CHECK-NEXT:     EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
72 ; CHECK-NEXT:     EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VTC]]>
73 ; CHECK-NEXT:   No successors
74 ; CHECK-NEXT: }
75 ; CHECK-NEXT: Successor(s): middle.block
76 ; CHECK-EMPTY:
77 ; CHECK-NEXT: middle.block:
78 ; CHECK-NEXT:   EMIT vp<[[CMP:%.+]]> = icmp eq ir<1024>, vp<[[VTC]]>
79 ; CHECK-NEXT:   EMIT branch-on-cond vp<[[CMP]]>
80 ; CHECK-NEXT: Successor(s): ir-bb<exit>, scalar.ph
81 ; CHECK-EMPTY:
82 ; CHECK-NEXT: ir-bb<exit>:
83 ; CHECK-NEXT: No successors
84 ; CHECK-EMPTY:
85 ; CHECK-NEXT: scalar.ph:
86 ; CHECK-NEXT: Successor(s): ir-bb<loop>
87 ; CHECK-EMPTY:
88 ; CHECK-NEXT: ir-bb<loop>:
89 ; CHECK-NEXT:   IR   %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
90 ; CHECK:        IR   %cmp = icmp ne i64 %iv.next, 1024
91 ; CHECK-NEXT: No successors
92 ; CHECK-NEXT: }
95 define void @test(ptr noalias %src, ptr noalias %dst) {
96 ; CHECK-LABEL: @test(
97 ; CHECK:       vector.body:
98 ; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %vector.ph ], [ [[INDEX_NEXT:%.*]], %vector.body ]
99 ; CHECK-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
100 ; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 1
101 ; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[SRC:%.*]], i64 [[TMP0]]
102 ; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 0
103 ; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x float>, ptr [[TMP3]], align 4
104 ; CHECK-NEXT:    [[TMP4:%.*]] = fpext <2 x float> [[WIDE_LOAD]] to <2 x double>
105 ; CHECK-NEXT:    [[TMP5:%.*]] = call fast <2 x double> @__simd_sin_v2f64(<2 x double> [[TMP4]])
106 ; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds float, ptr [[DST:%.*]], i64 [[TMP0]]
107 ; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds float, ptr [[DST]], i64 [[TMP1]]
108 ; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <2 x double> [[TMP5]], i32 0
109 ; CHECK-NEXT:    store double [[TMP8]], ptr [[TMP6]], align 8
110 ; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <2 x double> [[TMP5]], i32 1
111 ; CHECK-NEXT:    store double [[TMP9]], ptr [[TMP7]], align 8
112 ; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
113 ; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
114 ; CHECK-NEXT:    br i1 [[TMP10]], label %middle.block, label %vector.body
116 entry:
117   br label %loop
119 loop:
120   %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
121   %gep.src = getelementptr inbounds float, ptr %src, i64 %iv
122   %l = load float, ptr %gep.src, align 4
123   %conv = fpext float %l to double
124   %s = call fast double @llvm.sin.f64(double %conv) #0
125   %gep.dst = getelementptr inbounds float, ptr %dst, i64 %iv
126   store double %s, ptr %gep.dst
127   %iv.next = add nsw i64 %iv, 1
128   %cmp = icmp ne i64 %iv.next, 1024
129   br i1 %cmp, label %loop, label %exit
131 exit:
132   ret void
135 declare double @llvm.sin.f64(double)
137 declare <2 x double> @__simd_sin_v2f64(<2 x double>)
139 attributes #0 = { "vector-function-abi-variant"="_ZGV_LLVM_N2v_llvm.sin.f64(__simd_sin_v2f64)" }