blob: c9ae39ddaa359327a30e4e6e6eac097af8d74885 [file] [log] [blame]
Matt Arsenaulta1fe17c2016-07-19 23:16:53 +00001; RUN: opt -S -mtriple=amdgcn-- -amdgpu-codegenprepare %s | FileCheck %s
2; RUN: opt -S -amdgpu-codegenprepare %s | FileCheck -check-prefix=NOOP %s
Matt Arsenault86de4862016-06-24 07:07:55 +00003; Make sure this doesn't crash with no triple
4
Matt Arsenaulta1fe17c2016-07-19 23:16:53 +00005; NOOP-LABEL: @noop_fdiv_fpmath(
6; NOOP: %md.25ulp = fdiv float %a, %b, !fpmath !0
7define void @noop_fdiv_fpmath(float addrspace(1)* %out, float %a, float %b) #3 {
8 %md.25ulp = fdiv float %a, %b, !fpmath !0
9 store volatile float %md.25ulp, float addrspace(1)* %out
Matt Arsenault86de4862016-06-24 07:07:55 +000010 ret void
11}
Matt Arsenaulta1fe17c2016-07-19 23:16:53 +000012
13; CHECK-LABEL: @fdiv_fpmath(
14; CHECK: %no.md = fdiv float %a, %b{{$}}
15; CHECK: %md.half.ulp = fdiv float %a, %b, !fpmath !1
16; CHECK: %md.1ulp = fdiv float %a, %b, !fpmath !2
17; CHECK: %md.25ulp = call float @llvm.amdgcn.fdiv.fast(float %a, float %b), !fpmath !0
18; CHECK: %md.3ulp = call float @llvm.amdgcn.fdiv.fast(float %a, float %b), !fpmath !3
19; CHECK: %fast.md.25ulp = call fast float @llvm.amdgcn.fdiv.fast(float %a, float %b), !fpmath !0
20; CHECK: arcp.md.25ulp = call arcp float @llvm.amdgcn.fdiv.fast(float %a, float %b), !fpmath !0
21define void @fdiv_fpmath(float addrspace(1)* %out, float %a, float %b) #1 {
22 %no.md = fdiv float %a, %b
23 store volatile float %no.md, float addrspace(1)* %out
24
25 %md.half.ulp = fdiv float %a, %b, !fpmath !1
26 store volatile float %md.half.ulp, float addrspace(1)* %out
27
28 %md.1ulp = fdiv float %a, %b, !fpmath !2
29 store volatile float %md.1ulp, float addrspace(1)* %out
30
31 %md.25ulp = fdiv float %a, %b, !fpmath !0
32 store volatile float %md.25ulp, float addrspace(1)* %out
33
34 %md.3ulp = fdiv float %a, %b, !fpmath !3
35 store volatile float %md.3ulp, float addrspace(1)* %out
36
37 %fast.md.25ulp = fdiv fast float %a, %b, !fpmath !0
38 store volatile float %fast.md.25ulp, float addrspace(1)* %out
39
40 %arcp.md.25ulp = fdiv arcp float %a, %b, !fpmath !0
41 store volatile float %arcp.md.25ulp, float addrspace(1)* %out
42
43 ret void
44}
45
46; CHECK-LABEL: @rcp_fdiv_fpmath(
47; CHECK: %no.md = fdiv float 1.000000e+00, %x{{$}}
48; CHECK: %md.half.ulp = fdiv float 1.000000e+00, %x, !fpmath !1
49; CHECK: %arcp.no.md = fdiv arcp float 1.000000e+00, %x{{$}}
50; CHECK: %arcp.25ulp = fdiv arcp float 1.000000e+00, %x, !fpmath !0
51; CHECK: %fast.no.md = fdiv fast float 1.000000e+00, %x{{$}}
52; CHECK: %fast.25ulp = fdiv fast float 1.000000e+00, %x, !fpmath !0
53define void @rcp_fdiv_fpmath(float addrspace(1)* %out, float %x) #1 {
54 %no.md = fdiv float 1.0, %x
55 store volatile float %no.md, float addrspace(1)* %out
56
57 %md.half.ulp = fdiv float 1.0, %x, !fpmath !1
58 store volatile float %md.half.ulp, float addrspace(1)* %out
59
60 %arcp.no.md = fdiv arcp float 1.0, %x
61 store volatile float %arcp.no.md, float addrspace(1)* %out
62
63 %arcp.25ulp = fdiv arcp float 1.0, %x, !fpmath !0
64 store volatile float %arcp.25ulp, float addrspace(1)* %out
65
66 %fast.no.md = fdiv fast float 1.0, %x
67 store volatile float %fast.no.md, float addrspace(1)* %out
68
69 %fast.25ulp = fdiv fast float 1.0, %x, !fpmath !0
70 store volatile float %fast.25ulp, float addrspace(1)* %out
71
72 ret void
73}
74
75; CHECK-LABEL: @fdiv_fpmath_vector(
76; CHECK: %no.md = fdiv <2 x float> %a, %b{{$}}
77; CHECK: %md.half.ulp = fdiv <2 x float> %a, %b, !fpmath !1
78; CHECK: %md.1ulp = fdiv <2 x float> %a, %b, !fpmath !2
79
80; CHECK: %[[A0:[0-9]+]] = extractelement <2 x float> %a, i64 0
81; CHECK: %[[B0:[0-9]+]] = extractelement <2 x float> %b, i64 0
82; CHECK: %[[FDIV0:[0-9]+]] = call float @llvm.amdgcn.fdiv.fast(float %[[A0]], float %[[B0]]), !fpmath !0
83; CHECK: %[[INS0:[0-9]+]] = insertelement <2 x float> undef, float %[[FDIV0]], i64 0
84; CHECK: %[[A1:[0-9]+]] = extractelement <2 x float> %a, i64 1
85; CHECK: %[[B1:[0-9]+]] = extractelement <2 x float> %b, i64 1
86; CHECK: %[[FDIV1:[0-9]+]] = call float @llvm.amdgcn.fdiv.fast(float %[[A1]], float %[[B1]]), !fpmath !0
87; CHECK: %md.25ulp = insertelement <2 x float> %[[INS0]], float %[[FDIV1]], i64 1
88define void @fdiv_fpmath_vector(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b) #1 {
89 %no.md = fdiv <2 x float> %a, %b
90 store volatile <2 x float> %no.md, <2 x float> addrspace(1)* %out
91
92 %md.half.ulp = fdiv <2 x float> %a, %b, !fpmath !1
93 store volatile <2 x float> %md.half.ulp, <2 x float> addrspace(1)* %out
94
95 %md.1ulp = fdiv <2 x float> %a, %b, !fpmath !2
96 store volatile <2 x float> %md.1ulp, <2 x float> addrspace(1)* %out
97
98 %md.25ulp = fdiv <2 x float> %a, %b, !fpmath !0
99 store volatile <2 x float> %md.25ulp, <2 x float> addrspace(1)* %out
100
101 ret void
102}
103
104; CHECK-LABEL: @rcp_fdiv_fpmath_vector(
105; CHECK: %no.md = fdiv <2 x float> <float 1.000000e+00, float 1.000000e+00>, %x{{$}}
106; CHECK: %md.half.ulp = fdiv <2 x float> <float 1.000000e+00, float 1.000000e+00>, %x, !fpmath !1
107; CHECK: %arcp.no.md = fdiv arcp <2 x float> <float 1.000000e+00, float 1.000000e+00>, %x{{$}}
108; CHECK: %fast.no.md = fdiv fast <2 x float> <float 1.000000e+00, float 1.000000e+00>, %x{{$}}
109
110; CHECK: extractelement <2 x float> %x
111; CHECK: fdiv arcp float 1.000000e+00, %{{[0-9]+}}, !fpmath !0
112; CHECK: extractelement <2 x float> %x
113; CHECK: fdiv arcp float 1.000000e+00, %{{[0-9]+}}, !fpmath !0
114; CHECK: store volatile <2 x float> %arcp.25ulp
115
116; CHECK: fdiv fast float 1.000000e+00, %{{[0-9]+}}, !fpmath !0
117; CHECK: fdiv fast float 1.000000e+00, %{{[0-9]+}}, !fpmath !0
118; CHECK: store volatile <2 x float> %fast.25ulp, <2 x float> addrspace(1)* %out
119define void @rcp_fdiv_fpmath_vector(<2 x float> addrspace(1)* %out, <2 x float> %x) #1 {
120 %no.md = fdiv <2 x float> <float 1.0, float 1.0>, %x
121 store volatile <2 x float> %no.md, <2 x float> addrspace(1)* %out
122
123 %md.half.ulp = fdiv <2 x float> <float 1.0, float 1.0>, %x, !fpmath !1
124 store volatile <2 x float> %md.half.ulp, <2 x float> addrspace(1)* %out
125
126 %arcp.no.md = fdiv arcp <2 x float> <float 1.0, float 1.0>, %x
127 store volatile <2 x float> %arcp.no.md, <2 x float> addrspace(1)* %out
128
129 %fast.no.md = fdiv fast <2 x float> <float 1.0, float 1.0>, %x
130 store volatile <2 x float> %fast.no.md, <2 x float> addrspace(1)* %out
131
132 %arcp.25ulp = fdiv arcp <2 x float> <float 1.0, float 1.0>, %x, !fpmath !0
133 store volatile <2 x float> %arcp.25ulp, <2 x float> addrspace(1)* %out
134
135 %fast.25ulp = fdiv fast <2 x float> <float 1.0, float 1.0>, %x, !fpmath !0
136 store volatile <2 x float> %fast.25ulp, <2 x float> addrspace(1)* %out
137
138 ret void
139}
140
141; CHECK-LABEL: @rcp_fdiv_fpmath_vector_nonsplat(
142; CHECK: %no.md = fdiv <2 x float> <float 1.000000e+00, float 2.000000e+00>, %x
143; CHECK: %arcp.no.md = fdiv arcp <2 x float> <float 1.000000e+00, float 2.000000e+00>, %x
144; CHECK: %fast.no.md = fdiv fast <2 x float> <float 1.000000e+00, float 2.000000e+00>, %x{{$}}
145
146; CHECK: %[[X0:[0-9]+]] = extractelement <2 x float> %x, i64 0
147; CHECK: fdiv arcp float 1.000000e+00, %[[X0]], !fpmath !0
148; CHECK: %[[X1:[0-9]+]] = extractelement <2 x float> %x, i64 1
149; CHECK: call arcp float @llvm.amdgcn.fdiv.fast(float 2.000000e+00, float %[[X1]]), !fpmath !0
150; CHECK: store volatile <2 x float> %arcp.25ulp
151
152; CHECK: %[[X0:[0-9]+]] = extractelement <2 x float> %x, i64 0
153; CHECK: fdiv fast float 1.000000e+00, %[[X0]], !fpmath !0
154; CHECK: %[[X1:[0-9]+]] = extractelement <2 x float> %x, i64 1
155; CHECK: call fast float @llvm.amdgcn.fdiv.fast(float 2.000000e+00, float %[[X1]]), !fpmath !0
156; CHECK: store volatile <2 x float> %fast.25ulp
157define void @rcp_fdiv_fpmath_vector_nonsplat(<2 x float> addrspace(1)* %out, <2 x float> %x) #1 {
158 %no.md = fdiv <2 x float> <float 1.0, float 2.0>, %x
159 store volatile <2 x float> %no.md, <2 x float> addrspace(1)* %out
160
161 %arcp.no.md = fdiv arcp <2 x float> <float 1.0, float 2.0>, %x
162 store volatile <2 x float> %arcp.no.md, <2 x float> addrspace(1)* %out
163
164 %fast.no.md = fdiv fast <2 x float> <float 1.0, float 2.0>, %x
165 store volatile <2 x float> %fast.no.md, <2 x float> addrspace(1)* %out
166
167 %arcp.25ulp = fdiv arcp <2 x float> <float 1.0, float 2.0>, %x, !fpmath !0
168 store volatile <2 x float> %arcp.25ulp, <2 x float> addrspace(1)* %out
169
170 %fast.25ulp = fdiv fast <2 x float> <float 1.0, float 2.0>, %x, !fpmath !0
171 store volatile <2 x float> %fast.25ulp, <2 x float> addrspace(1)* %out
172
173 ret void
174}
175
176; FIXME: Should be able to get fdiv for 1.0 component
177; CHECK-LABEL: @rcp_fdiv_fpmath_vector_partial_constant(
178; CHECK: call arcp float @llvm.amdgcn.fdiv.fast(float %{{[0-9]+}}, float %{{[0-9]+}}), !fpmath !0
179; CHECK: call arcp float @llvm.amdgcn.fdiv.fast(float %{{[0-9]+}}, float %{{[0-9]+}}), !fpmath !0
180; CHECK: store volatile <2 x float> %arcp.25ulp
181
182; CHECK: call fast float @llvm.amdgcn.fdiv.fast(float %{{[0-9]+}}, float %{{[0-9]+}}), !fpmath !0
183; CHECK: call fast float @llvm.amdgcn.fdiv.fast(float %{{[0-9]+}}, float %{{[0-9]+}}), !fpmath !0
184; CHECK: store volatile <2 x float> %fast.25ulp
185define void @rcp_fdiv_fpmath_vector_partial_constant(<2 x float> addrspace(1)* %out, <2 x float> %x, <2 x float> %y) #1 {
186 %x.insert = insertelement <2 x float> %x, float 1.0, i32 0
187
188 %arcp.25ulp = fdiv arcp <2 x float> %x.insert, %y, !fpmath !0
189 store volatile <2 x float> %arcp.25ulp, <2 x float> addrspace(1)* %out
190
191 %fast.25ulp = fdiv fast <2 x float> %x.insert, %y, !fpmath !0
192 store volatile <2 x float> %fast.25ulp, <2 x float> addrspace(1)* %out
193
194 ret void
195}
196
197; CHECK-LABEL: @fdiv_fpmath_f32_denormals(
198; CHECK: %no.md = fdiv float %a, %b{{$}}
199; CHECK: %md.half.ulp = fdiv float %a, %b, !fpmath !1
200; CHECK: %md.1ulp = fdiv float %a, %b, !fpmath !2
201; CHECK: %md.25ulp = fdiv float %a, %b, !fpmath !0
202; CHECK: %md.3ulp = fdiv float %a, %b, !fpmath !3
203; CHECK: call fast float @llvm.amdgcn.fdiv.fast(float %a, float %b), !fpmath !0
204; CHECK: call arcp float @llvm.amdgcn.fdiv.fast(float %a, float %b), !fpmath !0
205define void @fdiv_fpmath_f32_denormals(float addrspace(1)* %out, float %a, float %b) #2 {
206 %no.md = fdiv float %a, %b
207 store volatile float %no.md, float addrspace(1)* %out
208
209 %md.half.ulp = fdiv float %a, %b, !fpmath !1
210 store volatile float %md.half.ulp, float addrspace(1)* %out
211
212 %md.1ulp = fdiv float %a, %b, !fpmath !2
213 store volatile float %md.1ulp, float addrspace(1)* %out
214
215 %md.25ulp = fdiv float %a, %b, !fpmath !0
216 store volatile float %md.25ulp, float addrspace(1)* %out
217
218 %md.3ulp = fdiv float %a, %b, !fpmath !3
219 store volatile float %md.3ulp, float addrspace(1)* %out
220
221 %fast.md.25ulp = fdiv fast float %a, %b, !fpmath !0
222 store volatile float %fast.md.25ulp, float addrspace(1)* %out
223
224 %arcp.md.25ulp = fdiv arcp float %a, %b, !fpmath !0
225 store volatile float %arcp.md.25ulp, float addrspace(1)* %out
226
227 ret void
228}
229
230attributes #0 = { nounwind optnone noinline }
231attributes #1 = { nounwind }
232attributes #2 = { nounwind "target-features"="+fp32-denormals" }
233
234; CHECK: !0 = !{float 2.500000e+00}
235; CHECK: !1 = !{float 5.000000e-01}
236; CHECK: !2 = !{float 1.000000e+00}
237; CHECK: !3 = !{float 3.000000e+00}
238
239!0 = !{float 2.500000e+00}
240!1 = !{float 5.000000e-01}
241!2 = !{float 1.000000e+00}
242!3 = !{float 3.000000e+00}