Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / AArch64 / widen-call-with-intrinsic-or-libfunc.ll
blobf67b932b04a0d6b71c514e6a9d2742ad19ccc9c7
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 @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: No successors
37 ; CHECK-NEXT: }
39 ; CHECK:      VPlan 'Initial VPlan for VF={4},UF>=1' {
40 ; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF
41 ; CHECK-NEXT: Live-in vp<[[VTC:%.+]]> = vector-trip-count
42 ; CHECK-NEXT: Live-in ir<1024> = original trip-count
43 ; CHECK-EMPTY:
44 ; CHECK-NEXT: vector.ph:
45 ; CHECK-NEXT: Successor(s): vector loop
46 ; CHECK-EMPTY:
47 ; CHECK-NEXT: <x1> vector loop: {
48 ; CHECK-NEXT:   vector.body:
49 ; CHECK-NEXT:     EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION
50 ; CHECK-NEXT:     vp<[[STEPS:%.+]]>    = SCALAR-STEPS vp<[[CAN_IV]]>, ir<1>
51 ; CHECK-NEXT:     CLONE ir<%gep.src> = getelementptr inbounds ir<%src>, vp<[[STEPS]]>
52 ; CHECK-NEXT:     vp<[[VEC_PTR:%.+]]> = vector-pointer ir<%gep.src>
53 ; CHECK-NEXT:     WIDEN ir<%l> = load vp<[[VEC_PTR]]>
54 ; CHECK-NEXT:     WIDEN-CAST ir<%conv> = fpext ir<%l> to double
55 ; CHECK-NEXT:     WIDEN-CALL ir<%s> = call @llvm.sin.f64(ir<%conv>) (using vector intrinsic)
56 ; CHECK-NEXT:     REPLICATE ir<%gep.dst> = getelementptr inbounds ir<%dst>, vp<[[STEPS]]>
57 ; CHECK-NEXT:     REPLICATE store ir<%s>, ir<%gep.dst>
58 ; CHECK-NEXT:     EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]>
59 ; CHECK-NEXT:     EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VTC]]>
60 ; CHECK-NEXT:   No successors
61 ; CHECK-NEXT: }
62 ; CHECK-NEXT: Successor(s): middle.block
63 ; CHECK-EMPTY:
64 ; CHECK-NEXT: middle.block:
65 ; CHECK-NEXT: No successors
66 ; CHECK-NEXT: }
69 define void @test(ptr noalias %src, ptr noalias %dst) {
70 ; CHECK-LABEL: @test(
71 ; CHECK:       vector.body:
72 ; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %vector.ph ], [ [[INDEX_NEXT:%.*]], %vector.body ]
73 ; CHECK-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
74 ; CHECK-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 1
75 ; CHECK-NEXT:    [[TMP2:%.*]] = getelementptr inbounds float, ptr [[SRC:%.*]], i64 [[TMP0]]
76 ; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds float, ptr [[TMP2]], i32 0
77 ; CHECK-NEXT:    [[WIDE_LOAD:%.*]] = load <2 x float>, ptr [[TMP3]], align 4
78 ; CHECK-NEXT:    [[TMP4:%.*]] = fpext <2 x float> [[WIDE_LOAD]] to <2 x double>
79 ; CHECK-NEXT:    [[TMP5:%.*]] = call fast <2 x double> @__simd_sin_v2f64(<2 x double> [[TMP4]])
80 ; CHECK-NEXT:    [[TMP6:%.*]] = getelementptr inbounds float, ptr [[DST:%.*]], i64 [[TMP0]]
81 ; CHECK-NEXT:    [[TMP7:%.*]] = getelementptr inbounds float, ptr [[DST]], i64 [[TMP1]]
82 ; CHECK-NEXT:    [[TMP8:%.*]] = extractelement <2 x double> [[TMP5]], i32 0
83 ; CHECK-NEXT:    store double [[TMP8]], ptr [[TMP6]], align 8
84 ; CHECK-NEXT:    [[TMP9:%.*]] = extractelement <2 x double> [[TMP5]], i32 1
85 ; CHECK-NEXT:    store double [[TMP9]], ptr [[TMP7]], align 8
86 ; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
87 ; CHECK-NEXT:    [[TMP10:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1024
88 ; CHECK-NEXT:    br i1 [[TMP10]], label %middle.block, label %vector.body
90 entry:
91   br label %loop
93 loop:
94   %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
95   %gep.src = getelementptr inbounds float, ptr %src, i64 %iv
96   %l = load float, ptr %gep.src, align 4
97   %conv = fpext float %l to double
98   %s = call fast double @llvm.sin.f64(double %conv) #0
99   %gep.dst = getelementptr inbounds float, ptr %dst, i64 %iv
100   store double %s, ptr %gep.dst
101   %iv.next = add nsw i64 %iv, 1
102   %cmp = icmp ne i64 %iv.next, 1024
103   br i1 %cmp, label %loop, label %exit
105 exit:
106   ret void
109 declare double @llvm.sin.f64(double)
111 declare <2 x double> @__simd_sin_v2f64(<2 x double>)
113 attributes #0 = { "vector-function-abi-variant"="_ZGV_LLVM_N2v_llvm.sin.f64(__simd_sin_v2f64)" }