1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes=instcombine < %s | FileCheck %s
4 declare double @llvm.sqrt.f64(double)
6 define double @sqrt_div_fast(double %x, double %y, double %z) {
7 ; CHECK-LABEL: @sqrt_div_fast(
9 ; CHECK-NEXT: [[TMP0:%.*]] = fdiv fast double [[Z:%.*]], [[Y:%.*]]
10 ; CHECK-NEXT: [[TMP1:%.*]] = call fast double @llvm.sqrt.f64(double [[TMP0]])
11 ; CHECK-NEXT: [[DIV1:%.*]] = fmul fast double [[X:%.*]], [[TMP1]]
12 ; CHECK-NEXT: ret double [[DIV1]]
15 %div = fdiv fast double %y, %z
16 %sqrt = call fast double @llvm.sqrt.f64(double %div)
17 %div1 = fdiv fast double %x, %sqrt
21 define double @sqrt_div(double %x, double %y, double %z) {
22 ; CHECK-LABEL: @sqrt_div(
24 ; CHECK-NEXT: [[DIV:%.*]] = fdiv double [[Y:%.*]], [[Z:%.*]]
25 ; CHECK-NEXT: [[SQRT:%.*]] = call double @llvm.sqrt.f64(double [[DIV]])
26 ; CHECK-NEXT: [[DIV1:%.*]] = fdiv double [[X:%.*]], [[SQRT]]
27 ; CHECK-NEXT: ret double [[DIV1]]
30 %div = fdiv double %y, %z
31 %sqrt = call double @llvm.sqrt.f64(double %div)
32 %div1 = fdiv double %x, %sqrt
36 define double @sqrt_div_reassoc_arcp(double %x, double %y, double %z) {
37 ; CHECK-LABEL: @sqrt_div_reassoc_arcp(
39 ; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc arcp double [[Z:%.*]], [[Y:%.*]]
40 ; CHECK-NEXT: [[TMP1:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[TMP0]])
41 ; CHECK-NEXT: [[DIV1:%.*]] = fmul reassoc arcp double [[X:%.*]], [[TMP1]]
42 ; CHECK-NEXT: ret double [[DIV1]]
45 %div = fdiv arcp reassoc double %y, %z
46 %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div)
47 %div1 = fdiv arcp reassoc double %x, %sqrt
51 define double @sqrt_div_reassoc_missing(double %x, double %y, double %z) {
52 ; CHECK-LABEL: @sqrt_div_reassoc_missing(
54 ; CHECK-NEXT: [[DIV:%.*]] = fdiv arcp double [[Y:%.*]], [[Z:%.*]]
55 ; CHECK-NEXT: [[SQRT:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[DIV]])
56 ; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]]
57 ; CHECK-NEXT: ret double [[DIV1]]
60 %div = fdiv arcp double %y, %z
61 %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div)
62 %div1 = fdiv arcp reassoc double %x, %sqrt
66 define double @sqrt_div_reassoc_missing2(double %x, double %y, double %z) {
67 ; CHECK-LABEL: @sqrt_div_reassoc_missing2(
69 ; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
70 ; CHECK-NEXT: [[SQRT:%.*]] = call arcp double @llvm.sqrt.f64(double [[DIV]])
71 ; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]]
72 ; CHECK-NEXT: ret double [[DIV1]]
75 %div = fdiv arcp reassoc double %y, %z
76 %sqrt = call arcp double @llvm.sqrt.f64(double %div)
77 %div1 = fdiv arcp reassoc double %x, %sqrt
81 define double @sqrt_div_reassoc_missing3(double %x, double %y, double %z) {
82 ; CHECK-LABEL: @sqrt_div_reassoc_missing3(
84 ; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
85 ; CHECK-NEXT: [[SQRT:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[DIV]])
86 ; CHECK-NEXT: [[DIV1:%.*]] = fdiv arcp double [[X:%.*]], [[SQRT]]
87 ; CHECK-NEXT: ret double [[DIV1]]
90 %div = fdiv arcp reassoc double %y, %z
91 %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div)
92 %div1 = fdiv arcp double %x, %sqrt
96 define double @sqrt_div_arcp_missing(double %x, double %y, double %z) {
97 ; CHECK-LABEL: @sqrt_div_arcp_missing(
99 ; CHECK-NEXT: [[TMP0:%.*]] = fdiv reassoc double [[Z:%.*]], [[Y:%.*]]
100 ; CHECK-NEXT: [[TMP1:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[TMP0]])
101 ; CHECK-NEXT: [[DIV1:%.*]] = fmul reassoc arcp double [[X:%.*]], [[TMP1]]
102 ; CHECK-NEXT: ret double [[DIV1]]
105 %div = fdiv reassoc double %y, %z
106 %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div)
107 %div1 = fdiv arcp reassoc double %x, %sqrt
111 define double @sqrt_div_arcp_missing2(double %x, double %y, double %z) {
112 ; CHECK-LABEL: @sqrt_div_arcp_missing2(
114 ; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
115 ; CHECK-NEXT: [[SQRT:%.*]] = call reassoc double @llvm.sqrt.f64(double [[DIV]])
116 ; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]]
117 ; CHECK-NEXT: ret double [[DIV1]]
120 %div = fdiv arcp reassoc double %y, %z
121 %sqrt = call reassoc double @llvm.sqrt.f64(double %div)
122 %div1 = fdiv arcp reassoc double %x, %sqrt
126 define double @sqrt_div_arcp_missing3(double %x, double %y, double %z) {
127 ; CHECK-LABEL: @sqrt_div_arcp_missing3(
129 ; CHECK-NEXT: [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
130 ; CHECK-NEXT: [[SQRT:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[DIV]])
131 ; CHECK-NEXT: [[DIV1:%.*]] = fdiv reassoc double [[X:%.*]], [[SQRT]]
132 ; CHECK-NEXT: ret double [[DIV1]]
135 %div = fdiv arcp reassoc double %y, %z
136 %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div)
137 %div1 = fdiv reassoc double %x, %sqrt
141 declare void @use(double)
142 define double @sqrt_div_fast_multiple_uses_1(double %x, double %y, double %z) {
143 ; CHECK-LABEL: @sqrt_div_fast_multiple_uses_1(
145 ; CHECK-NEXT: [[DIV:%.*]] = fdiv fast double [[Y:%.*]], [[Z:%.*]]
146 ; CHECK-NEXT: call void @use(double [[DIV]])
147 ; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[DIV]])
148 ; CHECK-NEXT: [[DIV1:%.*]] = fdiv fast double [[X:%.*]], [[SQRT]]
149 ; CHECK-NEXT: ret double [[DIV1]]
152 %div = fdiv fast double %y, %z
153 call void @use(double %div)
154 %sqrt = call fast double @llvm.sqrt.f64(double %div)
155 %div1 = fdiv fast double %x, %sqrt
159 define double @sqrt_div_fast_multiple_uses_2(double %x, double %y, double %z) {
160 ; CHECK-LABEL: @sqrt_div_fast_multiple_uses_2(
162 ; CHECK-NEXT: [[DIV:%.*]] = fdiv fast double [[Y:%.*]], [[Z:%.*]]
163 ; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[DIV]])
164 ; CHECK-NEXT: call void @use(double [[SQRT]])
165 ; CHECK-NEXT: [[DIV1:%.*]] = fdiv fast double [[X:%.*]], [[SQRT]]
166 ; CHECK-NEXT: ret double [[DIV1]]
169 %div = fdiv fast double %y, %z
170 %sqrt = call fast double @llvm.sqrt.f64(double %div)
171 call void @use(double %sqrt)
172 %div1 = fdiv fast double %x, %sqrt
176 define float @sqrt_non_div_operator(float %a) {
177 ; CHECK-LABEL: @sqrt_non_div_operator(
179 ; CHECK-NEXT: [[CONV:%.*]] = fpext float [[A:%.*]] to double
180 ; CHECK-NEXT: [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[CONV]])
181 ; CHECK-NEXT: [[DIV:%.*]] = fdiv fast double [[CONV]], [[SQRT]]
182 ; CHECK-NEXT: [[CONV2:%.*]] = fptrunc double [[DIV]] to float
183 ; CHECK-NEXT: ret float [[CONV2]]
186 %conv = fpext float %a to double
187 %sqrt = call fast double @llvm.sqrt.f64(double %conv)
188 %div = fdiv fast double %conv, %sqrt
189 %conv2 = fptrunc double %div to float