[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / InstCombine / fdiv-sqrt.ll
blobc5078ff1efc5abc5308635888bf6f7d816aec93a
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(
8 ; CHECK-NEXT:  entry:
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]]
14 entry:
15   %div = fdiv fast double %y, %z
16   %sqrt = call fast double @llvm.sqrt.f64(double %div)
17   %div1 = fdiv fast double %x, %sqrt
18   ret double %div1
21 define double @sqrt_div(double %x, double %y, double %z) {
22 ; CHECK-LABEL: @sqrt_div(
23 ; CHECK-NEXT:  entry:
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]]
29 entry:
30   %div = fdiv double %y, %z
31   %sqrt = call double @llvm.sqrt.f64(double %div)
32   %div1 = fdiv double %x, %sqrt
33   ret double %div1
36 define double @sqrt_div_reassoc_arcp(double %x, double %y, double %z) {
37 ; CHECK-LABEL: @sqrt_div_reassoc_arcp(
38 ; CHECK-NEXT:  entry:
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]]
44 entry:
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
48   ret double %div1
51 define double @sqrt_div_reassoc_missing(double %x, double %y, double %z) {
52 ; CHECK-LABEL: @sqrt_div_reassoc_missing(
53 ; CHECK-NEXT:  entry:
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]]
59 entry:
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
63   ret double %div1
66 define double @sqrt_div_reassoc_missing2(double %x, double %y, double %z) {
67 ; CHECK-LABEL: @sqrt_div_reassoc_missing2(
68 ; CHECK-NEXT:  entry:
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]]
74 entry:
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
78   ret double %div1
81 define double @sqrt_div_reassoc_missing3(double %x, double %y, double %z) {
82 ; CHECK-LABEL: @sqrt_div_reassoc_missing3(
83 ; CHECK-NEXT:  entry:
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]]
89 entry:
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
93   ret double %div1
96 define double @sqrt_div_arcp_missing(double %x, double %y, double %z) {
97 ; CHECK-LABEL: @sqrt_div_arcp_missing(
98 ; CHECK-NEXT:  entry:
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]]
104 entry:
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
108   ret double %div1
111 define double @sqrt_div_arcp_missing2(double %x, double %y, double %z) {
112 ; CHECK-LABEL: @sqrt_div_arcp_missing2(
113 ; CHECK-NEXT:  entry:
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]]
119 entry:
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
123   ret double %div1
126 define double @sqrt_div_arcp_missing3(double %x, double %y, double %z) {
127 ; CHECK-LABEL: @sqrt_div_arcp_missing3(
128 ; CHECK-NEXT:  entry:
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]]
134 entry:
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
138   ret double %div1
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(
144 ; CHECK-NEXT:  entry:
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]]
151 entry:
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
156   ret double %div1
159 define double @sqrt_div_fast_multiple_uses_2(double %x, double %y, double %z) {
160 ; CHECK-LABEL: @sqrt_div_fast_multiple_uses_2(
161 ; CHECK-NEXT:  entry:
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]]
168 entry:
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
173   ret double %div1
176 define float @sqrt_non_div_operator(float %a) {
177 ; CHECK-LABEL: @sqrt_non_div_operator(
178 ; CHECK-NEXT:  entry:
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]]
185 entry:
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
190   ret float %conv2