@@ -17,6 +17,14 @@ declare float @llvm.sin.f32(float)
17
17
declare double @tan (double )
18
18
declare fp128 @tanl (fp128 )
19
19
20
+ declare double @fabs (double )
21
+ declare double @llvm.fabs.f64 (double )
22
+ declare float @fabsf (float )
23
+ declare float @llvm.fabs.f32 (float )
24
+
25
+ declare double @llvm.copysign (double , double )
26
+ declare float @llvm.copysign.f32 (float , float )
27
+
20
28
; cos(-x) -> cos(x);
21
29
22
30
define double @cos_negated_arg (double %x ) {
@@ -100,6 +108,71 @@ define float @cosf_unary_negated_arg_FMF(float %x) {
100
108
ret float %r
101
109
}
102
110
111
+ ; cos(fabs(x)) -> cos(x)
112
+
113
+ define double @cos_unary_fabs_arg (double %x ) {
114
+ ; ANY-LABEL: @cos_unary_fabs_arg(
115
+ ; ANY-NEXT: [[COS:%.*]] = call double @cos(double [[X:%.*]])
116
+ ; ANY-NEXT: ret double [[COS]]
117
+ ;
118
+ %fabs = tail call double @llvm.fabs.f64 (double %x )
119
+ %r = call double @cos (double %fabs )
120
+ ret double %r
121
+ }
122
+
123
+ define float @cosf_unary_fabs_arg (float %x ) {
124
+ ; ANY-LABEL: @cosf_unary_fabs_arg(
125
+ ; ANY-NEXT: [[COS:%.*]] = call float @cosf(float [[X:%.*]])
126
+ ; ANY-NEXT: ret float [[COS]]
127
+ ;
128
+ %fabs = tail call float @llvm.fabs.f32 (float %x )
129
+ %r = call float @cosf (float %fabs )
130
+ ret float %r
131
+ }
132
+
133
+ define float @cosf_unary_fabs_arg_FMF (float %x ) {
134
+ ; ANY-LABEL: @cosf_unary_fabs_arg_FMF(
135
+ ; ANY-NEXT: [[COS:%.*]] = call reassoc nnan float @cosf(float [[X:%.*]])
136
+ ; ANY-NEXT: ret float [[COS]]
137
+ ;
138
+ %fabs = tail call float @llvm.fabs.f32 (float %x )
139
+ %r = call nnan reassoc float @cosf (float %fabs )
140
+ ret float %r
141
+ }
142
+
143
+ ; cos(copysign(x, y)) -> cos(x)
144
+
145
+ define double @cos_copysign_arg (double %x , double %y ) {
146
+ ; ANY-LABEL: @cos_copysign_arg(
147
+ ; ANY-NEXT: [[COS:%.*]] = call double @cos(double [[X:%.*]])
148
+ ; ANY-NEXT: ret double [[COS]]
149
+ ;
150
+ %copysign = tail call double @llvm.copysign (double %x , double %y )
151
+ %r = call double @cos (double %copysign )
152
+ ret double %r
153
+ }
154
+
155
+
156
+ define float @cosf_unary_copysign_arg (float %x ) {
157
+ ; ANY-LABEL: @cosf_unary_copysign_arg(
158
+ ; ANY-NEXT: [[COS:%.*]] = call float @cosf(float [[X:%.*]])
159
+ ; ANY-NEXT: ret float [[COS]]
160
+ ;
161
+ %copysign = tail call float @llvm.copysign.f32 (float %x , float 1 .0 )
162
+ %r = call float @cosf (float %copysign )
163
+ ret float %r
164
+ }
165
+
166
+ define float @cosf_copysign_arg_FMF (float %x , float %y ) {
167
+ ; ANY-LABEL: @cosf_copysign_arg_FMF(
168
+ ; ANY-NEXT: [[COS:%.*]] = call reassoc nnan float @cosf(float [[X:%.*]])
169
+ ; ANY-NEXT: ret float [[COS]]
170
+ ;
171
+ %copysign = tail call float @llvm.copysign.f32 (float %x , float %y )
172
+ %r = call nnan reassoc float @cosf (float %copysign )
173
+ ret float %r
174
+ }
175
+
103
176
; sin(-x) -> -sin(x);
104
177
105
178
define double @sin_negated_arg (double %x ) {
0 commit comments