[InstCombine] add reflection fold for tan(-x)
[llvm-complete.git] / test / Transforms / InstCombine / cos-1.ll
blob50db2a98e83bda8472f2d1d8ef71d5e0e031ef13
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S                             | FileCheck %s --check-prefixes=ANY,NO-FLOAT-SHRINK
3 ; RUN: opt < %s -instcombine -enable-double-float-shrink -S | FileCheck %s --check-prefixes=ANY,DO-FLOAT-SHRINK
5 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
7 declare double @cos(double)
8 declare double @llvm.cos.f64(double)
9 declare float @cosf(float)
10 declare float @llvm.cos.f32(float)
12 declare double @sin(double)
13 declare double @llvm.sin.f64(double)
14 declare float @sinf(float)
15 declare float @llvm.sin.f32(float)
17 declare double @tan(double)
18 declare fp128 @tanl(fp128)
20 ; cos(-x) -> cos(x);
22 define double @cos_negated_arg(double %x) {
23 ; ANY-LABEL: @cos_negated_arg(
24 ; ANY-NEXT:    [[COS:%.*]] = call double @cos(double [[X:%.*]])
25 ; ANY-NEXT:    ret double [[COS]]
27   %neg = fsub double -0.0, %x
28   %r = call double @cos(double %neg)
29   ret double %r
32 define float @cosf_negated_arg(float %x) {
33 ; ANY-LABEL: @cosf_negated_arg(
34 ; ANY-NEXT:    [[COS:%.*]] = call float @cosf(float [[X:%.*]])
35 ; ANY-NEXT:    ret float [[COS]]
37   %neg = fsub float -0.0, %x
38   %r = call float @cosf(float %neg)
39   ret float %r
42 define float @cosf_negated_arg_FMF(float %x) {
43 ; ANY-LABEL: @cosf_negated_arg_FMF(
44 ; ANY-NEXT:    [[COS:%.*]] = call reassoc nnan float @cosf(float [[X:%.*]])
45 ; ANY-NEXT:    ret float [[COS]]
47   %neg = fsub float -0.0, %x
48   %r = call nnan reassoc float @cosf(float %neg)
49   ret float %r
52 ; sin(-x) -> -sin(x);
54 define double @sin_negated_arg(double %x) {
55 ; ANY-LABEL: @sin_negated_arg(
56 ; ANY-NEXT:    [[TMP1:%.*]] = call double @sin(double [[X:%.*]])
57 ; ANY-NEXT:    [[TMP2:%.*]] = fsub double -0.000000e+00, [[TMP1]]
58 ; ANY-NEXT:    ret double [[TMP2]]
60   %neg = fsub double -0.0, %x
61   %r = call double @sin(double %neg)
62   ret double %r
65 define float @sinf_negated_arg(float %x) {
66 ; ANY-LABEL: @sinf_negated_arg(
67 ; ANY-NEXT:    [[TMP1:%.*]] = call float @sinf(float [[X:%.*]])
68 ; ANY-NEXT:    [[TMP2:%.*]] = fsub float -0.000000e+00, [[TMP1]]
69 ; ANY-NEXT:    ret float [[TMP2]]
71   %neg = fsub float -0.0, %x
72   %r = call float @sinf(float %neg)
73   ret float %r
76 define float @sinf_negated_arg_FMF(float %x) {
77 ; ANY-LABEL: @sinf_negated_arg_FMF(
78 ; ANY-NEXT:    [[TMP1:%.*]] = call nnan afn float @sinf(float [[X:%.*]])
79 ; ANY-NEXT:    [[TMP2:%.*]] = fsub nnan afn float -0.000000e+00, [[TMP1]]
80 ; ANY-NEXT:    ret float [[TMP2]]
82   %neg = fsub ninf float -0.0, %x
83   %r = call afn nnan float @sinf(float %neg)
84   ret float %r
87 declare void @use(double)
89 define double @sin_negated_arg_extra_use(double %x) {
90 ; ANY-LABEL: @sin_negated_arg_extra_use(
91 ; ANY-NEXT:    [[NEG:%.*]] = fsub double -0.000000e+00, [[X:%.*]]
92 ; ANY-NEXT:    [[R:%.*]] = call double @sin(double [[NEG]])
93 ; ANY-NEXT:    call void @use(double [[NEG]])
94 ; ANY-NEXT:    ret double [[R]]
96   %neg = fsub double -0.0, %x
97   %r = call double @sin(double %neg)
98   call void @use(double %neg)
99   ret double %r
102 ; -sin(-x) --> sin(x)
103 ; PR38458: https://bugs.llvm.org/show_bug.cgi?id=38458
105 define double @neg_sin_negated_arg(double %x) {
106 ; ANY-LABEL: @neg_sin_negated_arg(
107 ; ANY-NEXT:    [[TMP1:%.*]] = call double @sin(double [[X:%.*]])
108 ; ANY-NEXT:    ret double [[TMP1]]
110   %neg = fsub double -0.0, %x
111   %r = call double @sin(double %neg)
112   %rn = fsub double -0.0, %r
113   ret double %rn
116 ; tan(-x) -> -tan(x);
118 define double @tan_negated_arg(double %x) {
119 ; ANY-LABEL: @tan_negated_arg(
120 ; ANY-NEXT:    [[TMP1:%.*]] = call double @tan(double [[X:%.*]])
121 ; ANY-NEXT:    [[TMP2:%.*]] = fsub double -0.000000e+00, [[TMP1]]
122 ; ANY-NEXT:    ret double [[TMP2]]
124   %neg = fsub double -0.0, %x
125   %r = call double @tan(double %neg)
126   ret double %r
129 ; tanl(-x) -> -tanl(x);
131 define fp128 @tanl_negated_arg(fp128 %x) {
132 ; ANY-LABEL: @tanl_negated_arg(
133 ; ANY-NEXT:    [[TMP1:%.*]] = call fp128 @tanl(fp128 [[X:%.*]])
134 ; ANY-NEXT:    [[TMP2:%.*]] = fsub fp128 0xL00000000000000008000000000000000, [[TMP1]]
135 ; ANY-NEXT:    ret fp128 [[TMP2]]
137   %neg = fsub fp128 0xL00000000000000008000000000000000, %x
138   %r = call fp128 @tanl(fp128 %neg)
139   ret fp128 %r
142 define float @negated_and_shrinkable_libcall(float %f) {
143 ; NO-FLOAT-SHRINK-LABEL: @negated_and_shrinkable_libcall(
144 ; NO-FLOAT-SHRINK-NEXT:    [[CONV1:%.*]] = fpext float [[F:%.*]] to double
145 ; NO-FLOAT-SHRINK-NEXT:    [[COS1:%.*]] = call double @cos(double [[CONV1]])
146 ; NO-FLOAT-SHRINK-NEXT:    [[CONV2:%.*]] = fptrunc double [[COS1]] to float
147 ; NO-FLOAT-SHRINK-NEXT:    ret float [[CONV2]]
149 ; DO-FLOAT-SHRINK-LABEL: @negated_and_shrinkable_libcall(
150 ; DO-FLOAT-SHRINK-NEXT:    [[COSF:%.*]] = call float @cosf(float [[F:%.*]])
151 ; DO-FLOAT-SHRINK-NEXT:    ret float [[COSF]]
153   %conv1 = fpext float %f to double
154   %neg = fsub double -0.0, %conv1
155   %cos = call double @cos(double %neg)
156   %conv2 = fptrunc double %cos to float
157   ret float %conv2
160 ; TODO: It was ok to shrink the libcall, so the intrinsic should shrink too?
162 define float @negated_and_shrinkable_intrinsic(float %f) {
163 ; ANY-LABEL: @negated_and_shrinkable_intrinsic(
164 ; ANY-NEXT:    [[CONV1:%.*]] = fpext float [[F:%.*]] to double
165 ; ANY-NEXT:    [[COS:%.*]] = call double @llvm.cos.f64(double [[CONV1]])
166 ; ANY-NEXT:    [[CONV2:%.*]] = fptrunc double [[COS]] to float
167 ; ANY-NEXT:    ret float [[CONV2]]
169   %conv1 = fpext float %f to double
170   %neg = fsub double -0.0, %conv1
171   %cos = call double @llvm.cos.f64(double %neg)
172   %conv2 = fptrunc double %cos to float
173   ret float %conv2