Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / Generic / replace-intrinsics-with-veclib.ll
blobdf8b7c498bd002563f0988c172d65486e3ede453
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --check-attributes
2 ; RUN: opt -vector-library=SVML -replace-with-veclib -S < %s | FileCheck %s  --check-prefixes=COMMON,SVML
3 ; RUN: opt -vector-library=LIBMVEC-X86 -replace-with-veclib -S < %s | FileCheck %s  --check-prefixes=COMMON,LIBMVEC-X86
4 ; RUN: opt -vector-library=MASSV -replace-with-veclib -S < %s | FileCheck %s  --check-prefixes=COMMON,MASSV
5 ; RUN: opt -vector-library=Accelerate -replace-with-veclib -S < %s | FileCheck %s  --check-prefixes=COMMON,ACCELERATE
7 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
8 target triple = "x86_64-unknown-linux-gnu"
10 define <4 x double> @exp_v4(<4 x double> %in) {
11 ; SVML-LABEL: define {{[^@]+}}@exp_v4
12 ; SVML-SAME: (<4 x double> [[IN:%.*]]) {
13 ; SVML-NEXT:    [[TMP1:%.*]] = call <4 x double> @__svml_exp4(<4 x double> [[IN]])
14 ; SVML-NEXT:    ret <4 x double> [[TMP1]]
16 ; LIBMVEC-X86-LABEL: define {{[^@]+}}@exp_v4
17 ; LIBMVEC-X86-SAME: (<4 x double> [[IN:%.*]]) {
18 ; LIBMVEC-X86-NEXT:    [[TMP1:%.*]] = call <4 x double> @_ZGVdN4v_exp(<4 x double> [[IN]])
19 ; LIBMVEC-X86-NEXT:    ret <4 x double> [[TMP1]]
21 ; MASSV-LABEL: define {{[^@]+}}@exp_v4
22 ; MASSV-SAME: (<4 x double> [[IN:%.*]]) {
23 ; MASSV-NEXT:    [[CALL:%.*]] = call <4 x double> @llvm.exp.v4f64(<4 x double> [[IN]])
24 ; MASSV-NEXT:    ret <4 x double> [[CALL]]
26 ; ACCELERATE-LABEL: define {{[^@]+}}@exp_v4
27 ; ACCELERATE-SAME: (<4 x double> [[IN:%.*]]) {
28 ; ACCELERATE-NEXT:    [[CALL:%.*]] = call <4 x double> @llvm.exp.v4f64(<4 x double> [[IN]])
29 ; ACCELERATE-NEXT:    ret <4 x double> [[CALL]]
31   %call = call <4 x double> @llvm.exp.v4f64(<4 x double> %in)
32   ret <4 x double> %call
35 declare <4 x double> @llvm.exp.v4f64(<4 x double>) #0
37 define <4 x float> @exp_f32(<4 x float> %in) {
38 ; SVML-LABEL: define {{[^@]+}}@exp_f32
39 ; SVML-SAME: (<4 x float> [[IN:%.*]]) {
40 ; SVML-NEXT:    [[TMP1:%.*]] = call <4 x float> @__svml_expf4(<4 x float> [[IN]])
41 ; SVML-NEXT:    ret <4 x float> [[TMP1]]
43 ; LIBMVEC-X86-LABEL: define {{[^@]+}}@exp_f32
44 ; LIBMVEC-X86-SAME: (<4 x float> [[IN:%.*]]) {
45 ; LIBMVEC-X86-NEXT:    [[TMP1:%.*]] = call <4 x float> @_ZGVbN4v_expf(<4 x float> [[IN]])
46 ; LIBMVEC-X86-NEXT:    ret <4 x float> [[TMP1]]
48 ; MASSV-LABEL: define {{[^@]+}}@exp_f32
49 ; MASSV-SAME: (<4 x float> [[IN:%.*]]) {
50 ; MASSV-NEXT:    [[TMP1:%.*]] = call <4 x float> @__expf4(<4 x float> [[IN]])
51 ; MASSV-NEXT:    ret <4 x float> [[TMP1]]
53 ; ACCELERATE-LABEL: define {{[^@]+}}@exp_f32
54 ; ACCELERATE-SAME: (<4 x float> [[IN:%.*]]) {
55 ; ACCELERATE-NEXT:    [[TMP1:%.*]] = call <4 x float> @vexpf(<4 x float> [[IN]])
56 ; ACCELERATE-NEXT:    ret <4 x float> [[TMP1]]
58   %call = call <4 x float> @llvm.exp.v4f32(<4 x float> %in)
59   ret <4 x float> %call
62 declare <4 x float> @llvm.exp.v4f32(<4 x float>) #0
64 ; No replacement should take place for non-vector intrinsic.
65 define double @exp_f64(double %in) {
66 ; COMMON-LABEL: define {{[^@]+}}@exp_f64
67 ; COMMON-SAME: (double [[IN:%.*]]) {
68 ; COMMON-NEXT:    [[CALL:%.*]] = call double @llvm.exp.f64(double [[IN]])
69 ; COMMON-NEXT:    ret double [[CALL]]
71   %call = call double @llvm.exp.f64(double %in)
72   ret double %call
75 declare double @llvm.exp.f64(double) #0
77 ; Check that the pass works with scalar operands on
78 ; vector intrinsics. No vector library has a substitute for powi.
79 define <4 x double> @powi_v4(<4 x double> %in){
80 ; COMMON-LABEL: define {{[^@]+}}@powi_v4
81 ; COMMON-SAME: (<4 x double> [[IN:%.*]]) {
82 ; COMMON-NEXT:    [[CALL:%.*]] = call <4 x double> @llvm.powi.v4f64.i32(<4 x double> [[IN]], i32 3)
83 ; COMMON-NEXT:    ret <4 x double> [[CALL]]
85   %call = call <4 x double> @llvm.powi.v4f64.i32(<4 x double> %in, i32 3)
86   ret <4 x double> %call
89 declare <4 x double> @llvm.powi.v4f64.i32(<4 x double>, i32) #0
91 ; Replacement should not take place if the vector length
92 ; does not match exactly.
93 define <3 x double> @exp_v3(<3 x double> %in) {
94 ; COMMON-LABEL: define {{[^@]+}}@exp_v3
95 ; COMMON-SAME: (<3 x double> [[IN:%.*]]) {
96 ; COMMON-NEXT:    [[CALL:%.*]] = call <3 x double> @llvm.exp.v3f64(<3 x double> [[IN]])
97 ; COMMON-NEXT:    ret <3 x double> [[CALL]]
99   %call = call <3 x double> @llvm.exp.v3f64(<3 x double> %in)
100   ret <3 x double> %call
103 declare <3 x double> @llvm.exp.v3f64(<3 x double>) #0
105 attributes #0 = {nounwind readnone}