xref: /llvm-project/llvm/test/Transforms/InstCombine/fdiv-cos-sin.ll (revision 2caaec65c04ea7d0e9568b7895b7a46d6100cb75)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -passes=instcombine < %s | FileCheck %s
3
4define double @fdiv_cos_sin(double %a) {
5; CHECK-LABEL: @fdiv_cos_sin(
6; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.cos.f64(double [[A:%.*]])
7; CHECK-NEXT:    [[TMP2:%.*]] = call double @llvm.sin.f64(double [[A]])
8; CHECK-NEXT:    [[DIV:%.*]] = fdiv double [[TMP1]], [[TMP2]]
9; CHECK-NEXT:    ret double [[DIV]]
10;
11  %1 = call double @llvm.cos.f64(double %a)
12  %2 = call double @llvm.sin.f64(double %a)
13  %div = fdiv double %1, %2
14  ret double %div
15}
16
17define double @fdiv_strict_cos_strict_sin_reassoc(double %a) {
18; CHECK-LABEL: @fdiv_strict_cos_strict_sin_reassoc(
19; CHECK-NEXT:    [[TMP1:%.*]] = call double @llvm.cos.f64(double [[A:%.*]])
20; CHECK-NEXT:    [[TMP2:%.*]] = call reassoc double @llvm.sin.f64(double [[A]])
21; CHECK-NEXT:    [[DIV:%.*]] = fdiv double [[TMP1]], [[TMP2]]
22; CHECK-NEXT:    ret double [[DIV]]
23;
24  %1 = call double @llvm.cos.f64(double %a)
25  %2 = call reassoc double @llvm.sin.f64(double %a)
26  %div = fdiv double %1, %2
27  ret double %div
28}
29
30define double @fdiv_reassoc_cos_strict_sin_strict(double %a, ptr dereferenceable(2) %dummy) {
31; CHECK-LABEL: @fdiv_reassoc_cos_strict_sin_strict(
32; CHECK-NEXT:    [[TAN:%.*]] = call reassoc double @tan(double [[A:%.*]]) #[[ATTR1:[0-9]+]]
33; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc double 1.000000e+00, [[TAN]]
34; CHECK-NEXT:    ret double [[DIV]]
35;
36  %1 = call double @llvm.cos.f64(double %a)
37  %2 = call double @llvm.sin.f64(double %a)
38  %div = fdiv reassoc double %1, %2
39  ret double %div
40}
41
42define double @fdiv_reassoc_cos_reassoc_sin_strict(double %a) {
43; CHECK-LABEL: @fdiv_reassoc_cos_reassoc_sin_strict(
44; CHECK-NEXT:    [[TAN:%.*]] = call reassoc double @tan(double [[A:%.*]]) #[[ATTR1]]
45; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc double 1.000000e+00, [[TAN]]
46; CHECK-NEXT:    ret double [[DIV]]
47;
48  %1 = call reassoc double @llvm.cos.f64(double %a)
49  %2 = call double @llvm.sin.f64(double %a)
50  %div = fdiv reassoc double %1, %2
51  ret double %div
52}
53
54define double @fdiv_cos_sin_reassoc_multiple_uses(double %a) {
55; CHECK-LABEL: @fdiv_cos_sin_reassoc_multiple_uses(
56; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc double @llvm.cos.f64(double [[A:%.*]])
57; CHECK-NEXT:    [[TMP2:%.*]] = call reassoc double @llvm.sin.f64(double [[A]])
58; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc double [[TMP1]], [[TMP2]]
59; CHECK-NEXT:    call void @use(double [[TMP2]])
60; CHECK-NEXT:    ret double [[DIV]]
61;
62  %1 = call reassoc double @llvm.cos.f64(double %a)
63  %2 = call reassoc double @llvm.sin.f64(double %a)
64  %div = fdiv reassoc double %1, %2
65  call void @use(double %2)
66  ret double %div
67}
68
69define double @fdiv_cos_sin_reassoc(double %a) {
70; CHECK-LABEL: @fdiv_cos_sin_reassoc(
71; CHECK-NEXT:    [[TAN:%.*]] = call reassoc double @tan(double [[A:%.*]]) #[[ATTR1]]
72; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc double 1.000000e+00, [[TAN]]
73; CHECK-NEXT:    ret double [[DIV]]
74;
75  %1 = call reassoc double @llvm.cos.f64(double %a)
76  %2 = call reassoc double @llvm.sin.f64(double %a)
77  %div = fdiv reassoc double %1, %2
78  ret double %div
79}
80
81define half @fdiv_cosf16_sinf16_reassoc(half %a) {
82; CHECK-LABEL: @fdiv_cosf16_sinf16_reassoc(
83; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc half @llvm.cos.f16(half [[A:%.*]])
84; CHECK-NEXT:    [[TMP2:%.*]] = call reassoc half @llvm.sin.f16(half [[A]])
85; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc half [[TMP1]], [[TMP2]]
86; CHECK-NEXT:    ret half [[DIV]]
87;
88  %1 = call reassoc half @llvm.cos.f16(half %a)
89  %2 = call reassoc half @llvm.sin.f16(half %a)
90  %div = fdiv reassoc half %1, %2
91  ret half %div
92}
93
94define float @fdiv_cosf_sinf_reassoc(float %a) {
95; CHECK-LABEL: @fdiv_cosf_sinf_reassoc(
96; CHECK-NEXT:    [[TANF:%.*]] = call reassoc float @tanf(float [[A:%.*]]) #[[ATTR1]]
97; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc float 1.000000e+00, [[TANF]]
98; CHECK-NEXT:    ret float [[DIV]]
99;
100  %1 = call reassoc float @llvm.cos.f32(float %a)
101  %2 = call reassoc float @llvm.sin.f32(float %a)
102  %div = fdiv reassoc float %1, %2
103  ret float %div
104}
105
106define fp128 @fdiv_cosfp128_sinfp128_reassoc(fp128 %a) {
107; CHECK-LABEL: @fdiv_cosfp128_sinfp128_reassoc(
108; CHECK-NEXT:    [[TANL:%.*]] = call reassoc fp128 @tanl(fp128 [[A:%.*]]) #[[ATTR1]]
109; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc fp128 0xL00000000000000003FFF000000000000, [[TANL]]
110; CHECK-NEXT:    ret fp128 [[DIV]]
111;
112  %1 = call reassoc fp128 @llvm.cos.fp128(fp128 %a)
113  %2 = call reassoc fp128 @llvm.sin.fp128(fp128 %a)
114  %div = fdiv reassoc fp128 %1, %2
115  ret fp128 %div
116}
117
118declare half @llvm.cos.f16(half) #1
119declare float @llvm.cos.f32(float) #1
120declare double @llvm.cos.f64(double) #1
121declare fp128 @llvm.cos.fp128(fp128) #1
122
123declare half @llvm.sin.f16(half) #1
124declare float @llvm.sin.f32(float) #1
125declare double @llvm.sin.f64(double) #1
126declare fp128 @llvm.sin.fp128(fp128) #1
127
128declare void @use(double)
129
130attributes #0 = { nounwind readnone speculatable }
131attributes #1 = { nounwind readnone }
132