xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/irtranslator-constrained-fp.ll (revision e7900e695e7dfb36be8651d914a31f42a5d6c634)
1; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2; RUN: llc -global-isel -mtriple=amdgcn -stop-after=irtranslator -verify-machineinstrs %s -o - | FileCheck %s
3
4define float @v_constained_fadd_f32_fpexcept_strict(float %x, float %y) #0 {
5  ; CHECK-LABEL: name: v_constained_fadd_f32_fpexcept_strict
6  ; CHECK: bb.1 (%ir-block.0):
7  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
8  ; CHECK-NEXT: {{  $}}
9  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
10  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
11  ; CHECK-NEXT:   [[STRICT_FADD:%[0-9]+]]:_(s32) = G_STRICT_FADD [[COPY]], [[COPY1]]
12  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FADD]](s32)
13  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
14  %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict")
15  ret float %val
16}
17
18define float @v_constained_fadd_f32_fpexcept_strict_flags(float %x, float %y) #0 {
19  ; CHECK-LABEL: name: v_constained_fadd_f32_fpexcept_strict_flags
20  ; CHECK: bb.1 (%ir-block.0):
21  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
22  ; CHECK-NEXT: {{  $}}
23  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
24  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
25  ; CHECK-NEXT:   [[STRICT_FADD:%[0-9]+]]:_(s32) = nsz G_STRICT_FADD [[COPY]], [[COPY1]]
26  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FADD]](s32)
27  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
28  %val = call nsz float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.strict")
29  ret float %val
30}
31
32define float @v_constained_fadd_f32_fpexcept_ignore(float %x, float %y) #0 {
33  ; CHECK-LABEL: name: v_constained_fadd_f32_fpexcept_ignore
34  ; CHECK: bb.1 (%ir-block.0):
35  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
36  ; CHECK-NEXT: {{  $}}
37  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
38  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
39  ; CHECK-NEXT:   [[STRICT_FADD:%[0-9]+]]:_(s32) = nofpexcept G_STRICT_FADD [[COPY]], [[COPY1]]
40  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FADD]](s32)
41  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
42  %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
43  ret float %val
44}
45
46define float @v_constained_fadd_f32_fpexcept_ignore_flags(float %x, float %y) #0 {
47  ; CHECK-LABEL: name: v_constained_fadd_f32_fpexcept_ignore_flags
48  ; CHECK: bb.1 (%ir-block.0):
49  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
50  ; CHECK-NEXT: {{  $}}
51  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
52  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
53  ; CHECK-NEXT:   [[STRICT_FADD:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FADD [[COPY]], [[COPY1]]
54  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FADD]](s32)
55  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
56  %val = call nsz float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
57  ret float %val
58}
59
60define float @v_constained_fadd_f32_fpexcept_maytrap(float %x, float %y) #0 {
61  ; CHECK-LABEL: name: v_constained_fadd_f32_fpexcept_maytrap
62  ; CHECK: bb.1 (%ir-block.0):
63  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
64  ; CHECK-NEXT: {{  $}}
65  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
66  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
67  ; CHECK-NEXT:   [[STRICT_FADD:%[0-9]+]]:_(s32) = G_STRICT_FADD [[COPY]], [[COPY1]]
68  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FADD]](s32)
69  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
70  %val = call float @llvm.experimental.constrained.fadd.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap")
71  ret float %val
72}
73
74define <2 x float> @v_constained_fadd_v2f32_fpexcept_strict(<2 x float> %x, <2 x float> %y) #0 {
75  ; CHECK-LABEL: name: v_constained_fadd_v2f32_fpexcept_strict
76  ; CHECK: bb.1 (%ir-block.0):
77  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
78  ; CHECK-NEXT: {{  $}}
79  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
80  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
81  ; CHECK-NEXT:   [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32)
82  ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
83  ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
84  ; CHECK-NEXT:   [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY2]](s32), [[COPY3]](s32)
85  ; CHECK-NEXT:   [[STRICT_FADD:%[0-9]+]]:_(<2 x s32>) = G_STRICT_FADD [[BUILD_VECTOR]], [[BUILD_VECTOR1]]
86  ; CHECK-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[STRICT_FADD]](<2 x s32>)
87  ; CHECK-NEXT:   $vgpr0 = COPY [[UV]](s32)
88  ; CHECK-NEXT:   $vgpr1 = COPY [[UV1]](s32)
89  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0, implicit $vgpr1
90  %val = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %x, <2 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.strict")
91  ret <2 x float> %val
92}
93
94define <2 x float> @v_constained_fadd_v2f32_fpexcept_ignore(<2 x float> %x, <2 x float> %y) #0 {
95  ; CHECK-LABEL: name: v_constained_fadd_v2f32_fpexcept_ignore
96  ; CHECK: bb.1 (%ir-block.0):
97  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
98  ; CHECK-NEXT: {{  $}}
99  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
100  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
101  ; CHECK-NEXT:   [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32)
102  ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
103  ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
104  ; CHECK-NEXT:   [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY2]](s32), [[COPY3]](s32)
105  ; CHECK-NEXT:   [[STRICT_FADD:%[0-9]+]]:_(<2 x s32>) = nofpexcept G_STRICT_FADD [[BUILD_VECTOR]], [[BUILD_VECTOR1]]
106  ; CHECK-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[STRICT_FADD]](<2 x s32>)
107  ; CHECK-NEXT:   $vgpr0 = COPY [[UV]](s32)
108  ; CHECK-NEXT:   $vgpr1 = COPY [[UV1]](s32)
109  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0, implicit $vgpr1
110  %val = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %x, <2 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
111  ret <2 x float> %val
112}
113
114define <2 x float> @v_constained_fadd_v2f32_fpexcept_maytrap(<2 x float> %x, <2 x float> %y) #0 {
115  ; CHECK-LABEL: name: v_constained_fadd_v2f32_fpexcept_maytrap
116  ; CHECK: bb.1 (%ir-block.0):
117  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2, $vgpr3
118  ; CHECK-NEXT: {{  $}}
119  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
120  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
121  ; CHECK-NEXT:   [[BUILD_VECTOR:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY]](s32), [[COPY1]](s32)
122  ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
123  ; CHECK-NEXT:   [[COPY3:%[0-9]+]]:_(s32) = COPY $vgpr3
124  ; CHECK-NEXT:   [[BUILD_VECTOR1:%[0-9]+]]:_(<2 x s32>) = G_BUILD_VECTOR [[COPY2]](s32), [[COPY3]](s32)
125  ; CHECK-NEXT:   [[STRICT_FADD:%[0-9]+]]:_(<2 x s32>) = G_STRICT_FADD [[BUILD_VECTOR]], [[BUILD_VECTOR1]]
126  ; CHECK-NEXT:   [[UV:%[0-9]+]]:_(s32), [[UV1:%[0-9]+]]:_(s32) = G_UNMERGE_VALUES [[STRICT_FADD]](<2 x s32>)
127  ; CHECK-NEXT:   $vgpr0 = COPY [[UV]](s32)
128  ; CHECK-NEXT:   $vgpr1 = COPY [[UV1]](s32)
129  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0, implicit $vgpr1
130  %val = call <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float> %x, <2 x float> %y, metadata !"round.tonearest", metadata !"fpexcept.maytrap")
131  ret <2 x float> %val
132}
133
134define float @v_constained_fsub_f32_fpexcept_ignore_flags(float %x, float %y) #0 {
135  ; CHECK-LABEL: name: v_constained_fsub_f32_fpexcept_ignore_flags
136  ; CHECK: bb.1 (%ir-block.0):
137  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
138  ; CHECK-NEXT: {{  $}}
139  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
140  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
141  ; CHECK-NEXT:   [[STRICT_FSUB:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FSUB [[COPY]], [[COPY1]]
142  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FSUB]](s32)
143  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
144  %val = call nsz float @llvm.experimental.constrained.fsub.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
145  ret float %val
146}
147
148define float @v_constained_fmul_f32_fpexcept_ignore_flags(float %x, float %y) #0 {
149  ; CHECK-LABEL: name: v_constained_fmul_f32_fpexcept_ignore_flags
150  ; CHECK: bb.1 (%ir-block.0):
151  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
152  ; CHECK-NEXT: {{  $}}
153  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
154  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
155  ; CHECK-NEXT:   [[STRICT_FMUL:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FMUL [[COPY]], [[COPY1]]
156  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FMUL]](s32)
157  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
158  %val = call nsz float @llvm.experimental.constrained.fmul.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
159  ret float %val
160}
161
162define float @v_constained_fdiv_f32_fpexcept_ignore_flags(float %x, float %y) #0 {
163  ; CHECK-LABEL: name: v_constained_fdiv_f32_fpexcept_ignore_flags
164  ; CHECK: bb.1 (%ir-block.0):
165  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
166  ; CHECK-NEXT: {{  $}}
167  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
168  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
169  ; CHECK-NEXT:   [[STRICT_FDIV:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FDIV [[COPY]], [[COPY1]]
170  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FDIV]](s32)
171  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
172  %val = call nsz float @llvm.experimental.constrained.fdiv.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
173  ret float %val
174}
175
176define float @v_constained_frem_f32_fpexcept_ignore_flags(float %x, float %y) #0 {
177  ; CHECK-LABEL: name: v_constained_frem_f32_fpexcept_ignore_flags
178  ; CHECK: bb.1 (%ir-block.0):
179  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1
180  ; CHECK-NEXT: {{  $}}
181  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
182  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
183  ; CHECK-NEXT:   [[STRICT_FREM:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FREM [[COPY]], [[COPY1]]
184  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FREM]](s32)
185  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
186  %val = call nsz float @llvm.experimental.constrained.frem.f32(float %x, float %y, metadata !"round.tonearest", metadata !"fpexcept.ignore")
187  ret float %val
188}
189
190define float @v_constained_fma_f32_fpexcept_ignore_flags(float %x, float %y, float %z) #0 {
191  ; CHECK-LABEL: name: v_constained_fma_f32_fpexcept_ignore_flags
192  ; CHECK: bb.1 (%ir-block.0):
193  ; CHECK-NEXT:   liveins: $vgpr0, $vgpr1, $vgpr2
194  ; CHECK-NEXT: {{  $}}
195  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
196  ; CHECK-NEXT:   [[COPY1:%[0-9]+]]:_(s32) = COPY $vgpr1
197  ; CHECK-NEXT:   [[COPY2:%[0-9]+]]:_(s32) = COPY $vgpr2
198  ; CHECK-NEXT:   [[STRICT_FMA:%[0-9]+]]:_(s32) = nsz nofpexcept G_STRICT_FMA [[COPY]], [[COPY1]], [[COPY2]]
199  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FMA]](s32)
200  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
201  %val = call nsz float @llvm.experimental.constrained.fma.f32(float %x, float %y, float %z, metadata !"round.tonearest", metadata !"fpexcept.ignore")
202  ret float %val
203}
204
205define float @v_constained_sqrt_f32_fpexcept_strict(float %x) #0 {
206  ; CHECK-LABEL: name: v_constained_sqrt_f32_fpexcept_strict
207  ; CHECK: bb.1 (%ir-block.0):
208  ; CHECK-NEXT:   liveins: $vgpr0
209  ; CHECK-NEXT: {{  $}}
210  ; CHECK-NEXT:   [[COPY:%[0-9]+]]:_(s32) = COPY $vgpr0
211  ; CHECK-NEXT:   [[STRICT_FSQRT:%[0-9]+]]:_(s32) = G_STRICT_FSQRT [[COPY]]
212  ; CHECK-NEXT:   $vgpr0 = COPY [[STRICT_FSQRT]](s32)
213  ; CHECK-NEXT:   SI_RETURN implicit $vgpr0
214  %val = call float @llvm.experimental.constrained.sqrt.f32(float %x, metadata !"round.tonearest", metadata !"fpexcept.strict")
215  ret float %val
216}
217
218declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata) #1
219declare <2 x float> @llvm.experimental.constrained.fadd.v2f32(<2 x float>, <2 x float>, metadata, metadata) #1
220declare <3 x float> @llvm.experimental.constrained.fadd.v3f32(<3 x float>, <3 x float>, metadata, metadata) #1
221declare float @llvm.experimental.constrained.fsub.f32(float, float, metadata, metadata) #1
222declare float @llvm.experimental.constrained.fmul.f32(float, float, metadata, metadata) #1
223declare float @llvm.experimental.constrained.fdiv.f32(float, float, metadata, metadata) #1
224declare float @llvm.experimental.constrained.frem.f32(float, float, metadata, metadata) #1
225declare float @llvm.experimental.constrained.fma.f32(float, float, float, metadata, metadata) #1
226declare float @llvm.experimental.constrained.sqrt.f32(float, metadata, metadata) #1
227
228attributes #0 = { strictfp }
229attributes #1 = { inaccessiblememonly nounwind willreturn }
230