@@ -17,6 +17,14 @@ declare float @llvm.sin.f32(float)
1717declare double @tan (double )
1818declare fp128 @tanl (fp128 )
1919
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+
2028; cos(-x) -> cos(x);
2129
2230define double @cos_negated_arg (double %x ) {
@@ -100,6 +108,71 @@ define float @cosf_unary_negated_arg_FMF(float %x) {
100108 ret float %r
101109}
102110
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+
103176; sin(-x) -> -sin(x);
104177
105178define double @sin_negated_arg (double %x ) {
0 commit comments