xref: /llvm-project/llvm/test/Transforms/InstCombine/fdiv-sqrt.ll (revision a105877646d68e48cdeeeadd9d1e075dc3c5d68d)
142902d22SZain Jaffal; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
242902d22SZain Jaffal; RUN: opt -S -passes=instcombine < %s | FileCheck %s
342902d22SZain Jaffal
442902d22SZain Jaffaldeclare double @llvm.sqrt.f64(double)
542902d22SZain Jaffal
642902d22SZain Jaffaldefine double @sqrt_div_fast(double %x, double %y, double %z) {
742902d22SZain Jaffal; CHECK-LABEL: @sqrt_div_fast(
842902d22SZain Jaffal; CHECK-NEXT:  entry:
9f5811494SZain Jaffal; CHECK-NEXT:    [[TMP0:%.*]] = fdiv fast double [[Z:%.*]], [[Y:%.*]]
10f5811494SZain Jaffal; CHECK-NEXT:    [[TMP1:%.*]] = call fast double @llvm.sqrt.f64(double [[TMP0]])
11*a1058776SNikita Popov; CHECK-NEXT:    [[DIV1:%.*]] = fmul fast double [[X:%.*]], [[TMP1]]
1242902d22SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
1342902d22SZain Jaffal;
1442902d22SZain Jaffalentry:
1542902d22SZain Jaffal  %div = fdiv fast double %y, %z
1642902d22SZain Jaffal  %sqrt = call fast double @llvm.sqrt.f64(double %div)
1742902d22SZain Jaffal  %div1 = fdiv fast double %x, %sqrt
1842902d22SZain Jaffal  ret double %div1
1942902d22SZain Jaffal}
2042902d22SZain Jaffal
2142902d22SZain Jaffaldefine double @sqrt_div(double %x, double %y, double %z) {
2242902d22SZain Jaffal; CHECK-LABEL: @sqrt_div(
2342902d22SZain Jaffal; CHECK-NEXT:  entry:
2442902d22SZain Jaffal; CHECK-NEXT:    [[DIV:%.*]] = fdiv double [[Y:%.*]], [[Z:%.*]]
2542902d22SZain Jaffal; CHECK-NEXT:    [[SQRT:%.*]] = call double @llvm.sqrt.f64(double [[DIV]])
2642902d22SZain Jaffal; CHECK-NEXT:    [[DIV1:%.*]] = fdiv double [[X:%.*]], [[SQRT]]
2742902d22SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
2842902d22SZain Jaffal;
2942902d22SZain Jaffalentry:
3042902d22SZain Jaffal  %div = fdiv double %y, %z
3142902d22SZain Jaffal  %sqrt = call double @llvm.sqrt.f64(double %div)
3242902d22SZain Jaffal  %div1 = fdiv double %x, %sqrt
3342902d22SZain Jaffal  ret double %div1
3442902d22SZain Jaffal}
3542902d22SZain Jaffal
3642902d22SZain Jaffaldefine double @sqrt_div_reassoc_arcp(double %x, double %y, double %z) {
3742902d22SZain Jaffal; CHECK-LABEL: @sqrt_div_reassoc_arcp(
3842902d22SZain Jaffal; CHECK-NEXT:  entry:
39f5811494SZain Jaffal; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc arcp double [[Z:%.*]], [[Y:%.*]]
40f5811494SZain Jaffal; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[TMP0]])
41*a1058776SNikita Popov; CHECK-NEXT:    [[DIV1:%.*]] = fmul reassoc arcp double [[X:%.*]], [[TMP1]]
4242902d22SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
4342902d22SZain Jaffal;
4442902d22SZain Jaffalentry:
45e50189b0SZain Jaffal  %div = fdiv arcp reassoc double %y, %z
46e50189b0SZain Jaffal  %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div)
47e50189b0SZain Jaffal  %div1 = fdiv arcp reassoc double %x, %sqrt
48e50189b0SZain Jaffal  ret double %div1
49e50189b0SZain Jaffal}
50e50189b0SZain Jaffal
51e50189b0SZain Jaffaldefine double @sqrt_div_reassoc_missing(double %x, double %y, double %z) {
52e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_reassoc_missing(
53e50189b0SZain Jaffal; CHECK-NEXT:  entry:
54e50189b0SZain Jaffal; CHECK-NEXT:    [[DIV:%.*]] = fdiv arcp double [[Y:%.*]], [[Z:%.*]]
55e50189b0SZain Jaffal; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[DIV]])
56e50189b0SZain Jaffal; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]]
57e50189b0SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
58e50189b0SZain Jaffal;
59e50189b0SZain Jaffalentry:
60e50189b0SZain Jaffal  %div = fdiv arcp double %y, %z
61e50189b0SZain Jaffal  %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div)
62e50189b0SZain Jaffal  %div1 = fdiv arcp reassoc double %x, %sqrt
63e50189b0SZain Jaffal  ret double %div1
64e50189b0SZain Jaffal}
65e50189b0SZain Jaffal
66e50189b0SZain Jaffaldefine double @sqrt_div_reassoc_missing2(double %x, double %y, double %z) {
67e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_reassoc_missing2(
68e50189b0SZain Jaffal; CHECK-NEXT:  entry:
69e50189b0SZain Jaffal; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
70e50189b0SZain Jaffal; CHECK-NEXT:    [[SQRT:%.*]] = call arcp double @llvm.sqrt.f64(double [[DIV]])
71e50189b0SZain Jaffal; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]]
72e50189b0SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
73e50189b0SZain Jaffal;
74e50189b0SZain Jaffalentry:
75e50189b0SZain Jaffal  %div = fdiv arcp reassoc double %y, %z
76e50189b0SZain Jaffal  %sqrt = call arcp double @llvm.sqrt.f64(double %div)
77e50189b0SZain Jaffal  %div1 = fdiv arcp reassoc double %x, %sqrt
78e50189b0SZain Jaffal  ret double %div1
79e50189b0SZain Jaffal}
80e50189b0SZain Jaffal
81e50189b0SZain Jaffaldefine double @sqrt_div_reassoc_missing3(double %x, double %y, double %z) {
82e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_reassoc_missing3(
83e50189b0SZain Jaffal; CHECK-NEXT:  entry:
84e50189b0SZain Jaffal; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
85e50189b0SZain Jaffal; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[DIV]])
86e50189b0SZain Jaffal; CHECK-NEXT:    [[DIV1:%.*]] = fdiv arcp double [[X:%.*]], [[SQRT]]
87e50189b0SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
88e50189b0SZain Jaffal;
89e50189b0SZain Jaffalentry:
90e50189b0SZain Jaffal  %div = fdiv arcp reassoc double %y, %z
91e50189b0SZain Jaffal  %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div)
92e50189b0SZain Jaffal  %div1 = fdiv arcp double %x, %sqrt
93e50189b0SZain Jaffal  ret double %div1
94e50189b0SZain Jaffal}
95e50189b0SZain Jaffal
96e50189b0SZain Jaffaldefine double @sqrt_div_arcp_missing(double %x, double %y, double %z) {
97e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_arcp_missing(
98e50189b0SZain Jaffal; CHECK-NEXT:  entry:
99f5811494SZain Jaffal; CHECK-NEXT:    [[TMP0:%.*]] = fdiv reassoc double [[Z:%.*]], [[Y:%.*]]
100f5811494SZain Jaffal; CHECK-NEXT:    [[TMP1:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[TMP0]])
101*a1058776SNikita Popov; CHECK-NEXT:    [[DIV1:%.*]] = fmul reassoc arcp double [[X:%.*]], [[TMP1]]
102e50189b0SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
103e50189b0SZain Jaffal;
104e50189b0SZain Jaffalentry:
105e50189b0SZain Jaffal  %div = fdiv reassoc double %y, %z
106e50189b0SZain Jaffal  %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div)
107e50189b0SZain Jaffal  %div1 = fdiv arcp reassoc double %x, %sqrt
108e50189b0SZain Jaffal  ret double %div1
109e50189b0SZain Jaffal}
110e50189b0SZain Jaffal
111e50189b0SZain Jaffaldefine double @sqrt_div_arcp_missing2(double %x, double %y, double %z) {
112e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_arcp_missing2(
113e50189b0SZain Jaffal; CHECK-NEXT:  entry:
114e50189b0SZain Jaffal; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
115e50189b0SZain Jaffal; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc double @llvm.sqrt.f64(double [[DIV]])
116e50189b0SZain Jaffal; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc arcp double [[X:%.*]], [[SQRT]]
117e50189b0SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
118e50189b0SZain Jaffal;
119e50189b0SZain Jaffalentry:
120e50189b0SZain Jaffal  %div = fdiv arcp reassoc double %y, %z
121e50189b0SZain Jaffal  %sqrt = call reassoc double @llvm.sqrt.f64(double %div)
122e50189b0SZain Jaffal  %div1 = fdiv arcp reassoc double %x, %sqrt
123e50189b0SZain Jaffal  ret double %div1
124e50189b0SZain Jaffal}
125e50189b0SZain Jaffal
126e50189b0SZain Jaffaldefine double @sqrt_div_arcp_missing3(double %x, double %y, double %z) {
127e50189b0SZain Jaffal; CHECK-LABEL: @sqrt_div_arcp_missing3(
128e50189b0SZain Jaffal; CHECK-NEXT:  entry:
129e50189b0SZain Jaffal; CHECK-NEXT:    [[DIV:%.*]] = fdiv reassoc arcp double [[Y:%.*]], [[Z:%.*]]
130e50189b0SZain Jaffal; CHECK-NEXT:    [[SQRT:%.*]] = call reassoc arcp double @llvm.sqrt.f64(double [[DIV]])
131e50189b0SZain Jaffal; CHECK-NEXT:    [[DIV1:%.*]] = fdiv reassoc double [[X:%.*]], [[SQRT]]
132e50189b0SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
133e50189b0SZain Jaffal;
134e50189b0SZain Jaffalentry:
135e50189b0SZain Jaffal  %div = fdiv arcp reassoc double %y, %z
136e50189b0SZain Jaffal  %sqrt = call arcp reassoc double @llvm.sqrt.f64(double %div)
137e50189b0SZain Jaffal  %div1 = fdiv reassoc double %x, %sqrt
13842902d22SZain Jaffal  ret double %div1
13942902d22SZain Jaffal}
14042902d22SZain Jaffal
14142902d22SZain Jaffaldeclare void @use(double)
14242902d22SZain Jaffaldefine double @sqrt_div_fast_multiple_uses_1(double %x, double %y, double %z) {
14342902d22SZain Jaffal; CHECK-LABEL: @sqrt_div_fast_multiple_uses_1(
14442902d22SZain Jaffal; CHECK-NEXT:  entry:
14542902d22SZain Jaffal; CHECK-NEXT:    [[DIV:%.*]] = fdiv fast double [[Y:%.*]], [[Z:%.*]]
14642902d22SZain Jaffal; CHECK-NEXT:    call void @use(double [[DIV]])
14742902d22SZain Jaffal; CHECK-NEXT:    [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[DIV]])
14842902d22SZain Jaffal; CHECK-NEXT:    [[DIV1:%.*]] = fdiv fast double [[X:%.*]], [[SQRT]]
14942902d22SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
15042902d22SZain Jaffal;
15142902d22SZain Jaffalentry:
15242902d22SZain Jaffal  %div = fdiv fast double %y, %z
15342902d22SZain Jaffal  call void @use(double %div)
15442902d22SZain Jaffal  %sqrt = call fast double @llvm.sqrt.f64(double %div)
15542902d22SZain Jaffal  %div1 = fdiv fast double %x, %sqrt
15642902d22SZain Jaffal  ret double %div1
15742902d22SZain Jaffal}
15842902d22SZain Jaffal
15942902d22SZain Jaffaldefine double @sqrt_div_fast_multiple_uses_2(double %x, double %y, double %z) {
16042902d22SZain Jaffal; CHECK-LABEL: @sqrt_div_fast_multiple_uses_2(
16142902d22SZain Jaffal; CHECK-NEXT:  entry:
16242902d22SZain Jaffal; CHECK-NEXT:    [[DIV:%.*]] = fdiv fast double [[Y:%.*]], [[Z:%.*]]
16342902d22SZain Jaffal; CHECK-NEXT:    [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[DIV]])
16442902d22SZain Jaffal; CHECK-NEXT:    call void @use(double [[SQRT]])
16542902d22SZain Jaffal; CHECK-NEXT:    [[DIV1:%.*]] = fdiv fast double [[X:%.*]], [[SQRT]]
16642902d22SZain Jaffal; CHECK-NEXT:    ret double [[DIV1]]
16742902d22SZain Jaffal;
16842902d22SZain Jaffalentry:
16942902d22SZain Jaffal  %div = fdiv fast double %y, %z
17042902d22SZain Jaffal  %sqrt = call fast double @llvm.sqrt.f64(double %div)
17142902d22SZain Jaffal  call void @use(double %sqrt)
17242902d22SZain Jaffal  %div1 = fdiv fast double %x, %sqrt
17342902d22SZain Jaffal  ret double %div1
17442902d22SZain Jaffal}
17542902d22SZain Jaffal
176f5811494SZain Jaffaldefine float @sqrt_non_div_operator(float %a) {
177f5811494SZain Jaffal; CHECK-LABEL: @sqrt_non_div_operator(
178f5811494SZain Jaffal; CHECK-NEXT:  entry:
179f5811494SZain Jaffal; CHECK-NEXT:    [[CONV:%.*]] = fpext float [[A:%.*]] to double
180f5811494SZain Jaffal; CHECK-NEXT:    [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[CONV]])
181f5811494SZain Jaffal; CHECK-NEXT:    [[DIV:%.*]] = fdiv fast double [[CONV]], [[SQRT]]
182f5811494SZain Jaffal; CHECK-NEXT:    [[CONV2:%.*]] = fptrunc double [[DIV]] to float
183f5811494SZain Jaffal; CHECK-NEXT:    ret float [[CONV2]]
184f5811494SZain Jaffal;
185f5811494SZain Jaffalentry:
186f5811494SZain Jaffal  %conv = fpext float %a to double
187f5811494SZain Jaffal  %sqrt = call fast double @llvm.sqrt.f64(double %conv)
188f5811494SZain Jaffal  %div = fdiv fast double %conv, %sqrt
189f5811494SZain Jaffal  %conv2 = fptrunc double %div to float
190f5811494SZain Jaffal  ret float %conv2
191f5811494SZain Jaffal}
192