• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -S -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, i32* dereferenceable(2) %dummy) {
31; CHECK-LABEL: @fdiv_reassoc_cos_strict_sin_strict(
32; CHECK-NEXT:    [[TAN:%.*]] = call reassoc double @tan(double [[A:%.*]]) #1
33; CHECK-NEXT:    [[TMP1:%.*]] = fdiv reassoc double 1.000000e+00, [[TAN]]
34; CHECK-NEXT:    ret double [[TMP1]]
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:%.*]]) #1
45; CHECK-NEXT:    [[TMP1:%.*]] = fdiv reassoc double 1.000000e+00, [[TAN]]
46; CHECK-NEXT:    ret double [[TMP1]]
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:%.*]]) #1
72; CHECK-NEXT:    [[TMP1:%.*]] = fdiv reassoc double 1.000000e+00, [[TAN]]
73; CHECK-NEXT:    ret double [[TMP1]]
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 float @fdiv_cosf_sinf_reassoc(float %a) {
82; CHECK-LABEL: @fdiv_cosf_sinf_reassoc(
83; CHECK-NEXT:    [[TANF:%.*]] = call reassoc float @tanf(float [[A:%.*]]) #1
84; CHECK-NEXT:    [[TMP1:%.*]] = fdiv reassoc float 1.000000e+00, [[TANF]]
85; CHECK-NEXT:    ret float [[TMP1]]
86;
87  %1 = call reassoc float @llvm.cos.f32(float %a)
88  %2 = call reassoc float @llvm.sin.f32(float %a)
89  %div = fdiv reassoc float %1, %2
90  ret float %div
91}
92
93define fp128 @fdiv_cosfp128_sinfp128_reassoc(fp128 %a) {
94; CHECK-LABEL: @fdiv_cosfp128_sinfp128_reassoc(
95; CHECK-NEXT:    [[TANL:%.*]] = call reassoc fp128 @tanl(fp128 [[A:%.*]]) #1
96; CHECK-NEXT:    [[TMP1:%.*]] = fdiv reassoc fp128 0xL00000000000000003FFF000000000000, [[TANL]]
97; CHECK-NEXT:    ret fp128 [[TMP1]]
98;
99  %1 = call reassoc fp128 @llvm.cos.fp128(fp128 %a)
100  %2 = call reassoc fp128 @llvm.sin.fp128(fp128 %a)
101  %div = fdiv reassoc fp128 %1, %2
102  ret fp128 %div
103}
104
105declare double @llvm.cos.f64(double) #1
106declare float @llvm.cos.f32(float) #1
107declare fp128 @llvm.cos.fp128(fp128) #1
108
109declare double @llvm.sin.f64(double) #1
110declare float @llvm.sin.f32(float) #1
111declare fp128 @llvm.sin.fp128(fp128) #1
112
113declare void @use(double)
114
115attributes #0 = { nounwind readnone speculatable }
116attributes #1 = { nounwind readnone }
117