Skip to content

Commit 037f804

Browse files
authored
[RISCV][GISel] Add fcopysign tests with mismatched types. NFC (#115364)
fcopysign takes two operands, one for the magnitude and exponent and the other for the sign. The result type is determined by the magnitude and exponent operand. The sign operand does not need to be the same type. Note, in IR all 3 types must match. We have isel patterns for all possible combinations of types and the legalizer thinks they are all legal, but we had no tests for it. I was unable to find any combiner rules that would create an instruction with mismatch types.
1 parent 74deb66 commit 037f804

File tree

6 files changed

+438
-24
lines changed

6 files changed

+438
-24
lines changed

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/fp-arith-f16.mir

Lines changed: 104 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2-
# RUN: llc -mtriple=riscv32 -mattr=+zfh -run-pass=instruction-select \
2+
# RUN: llc -mtriple=riscv32 -mattr=+zfh,+d -run-pass=instruction-select \
33
# RUN: -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s
4-
# RUN: llc -mtriple=riscv64 -mattr=+zfh -run-pass=instruction-select \
4+
# RUN: llc -mtriple=riscv64 -mattr=+zfh,+d -run-pass=instruction-select \
55
# RUN: -simplify-mir -verify-machineinstrs %s -o - | FileCheck %s
66

77
---
@@ -241,15 +241,15 @@ body: |
241241
242242
...
243243
---
244-
name: fcopysign_f16
244+
name: fcopysign_f16_f16
245245
legalized: true
246246
regBankSelected: true
247247
tracksRegLiveness: true
248248
body: |
249249
bb.0:
250250
liveins: $f10_h, $f11_h
251251
252-
; CHECK-LABEL: name: fcopysign_f16
252+
; CHECK-LABEL: name: fcopysign_f16_f16
253253
; CHECK: liveins: $f10_h, $f11_h
254254
; CHECK-NEXT: {{ $}}
255255
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr16 = COPY $f10_h
@@ -264,3 +264,103 @@ body: |
264264
PseudoRET implicit $f10_h
265265
266266
...
267+
---
268+
name: fcopysign_f16_f32
269+
legalized: true
270+
regBankSelected: true
271+
tracksRegLiveness: true
272+
body: |
273+
bb.0:
274+
liveins: $f10_h, $f11_f
275+
276+
; CHECK-LABEL: name: fcopysign_f16_f32
277+
; CHECK: liveins: $f10_h, $f11_f
278+
; CHECK-NEXT: {{ $}}
279+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr16 = COPY $f10_h
280+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr32 = COPY $f11_f
281+
; CHECK-NEXT: [[FCVT_H_S:%[0-9]+]]:fpr16 = nofpexcept FCVT_H_S [[COPY1]], 7
282+
; CHECK-NEXT: [[FSGNJ_H:%[0-9]+]]:fpr16 = FSGNJ_H [[COPY]], [[FCVT_H_S]]
283+
; CHECK-NEXT: $f10_h = COPY [[FSGNJ_H]]
284+
; CHECK-NEXT: PseudoRET implicit $f10_h
285+
%0:fprb(s16) = COPY $f10_h
286+
%1:fprb(s32) = COPY $f11_f
287+
%2:fprb(s16) = G_FCOPYSIGN %0, %1
288+
$f10_h = COPY %2(s16)
289+
PseudoRET implicit $f10_h
290+
291+
...
292+
---
293+
name: fcopysign_f32_f16
294+
legalized: true
295+
regBankSelected: true
296+
tracksRegLiveness: true
297+
body: |
298+
bb.0:
299+
liveins: $f10_f, $f11_h
300+
301+
; CHECK-LABEL: name: fcopysign_f32_f16
302+
; CHECK: liveins: $f10_f, $f11_h
303+
; CHECK-NEXT: {{ $}}
304+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr32 = COPY $f10_f
305+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr16 = COPY $f11_h
306+
; CHECK-NEXT: [[FCVT_S_H:%[0-9]+]]:fpr32 = nofpexcept FCVT_S_H [[COPY1]], 0
307+
; CHECK-NEXT: [[FSGNJ_S:%[0-9]+]]:fpr32 = FSGNJ_S [[COPY]], [[FCVT_S_H]]
308+
; CHECK-NEXT: $f10_f = COPY [[FSGNJ_S]]
309+
; CHECK-NEXT: PseudoRET implicit $f10_f
310+
%0:fprb(s32) = COPY $f10_f
311+
%1:fprb(s16) = COPY $f11_h
312+
%2:fprb(s32) = G_FCOPYSIGN %0, %1
313+
$f10_f = COPY %2(s32)
314+
PseudoRET implicit $f10_f
315+
316+
...
317+
---
318+
name: fcopysign_f16_f64
319+
legalized: true
320+
regBankSelected: true
321+
tracksRegLiveness: true
322+
body: |
323+
bb.0:
324+
liveins: $f10_h, $f11_d
325+
326+
; CHECK-LABEL: name: fcopysign_f16_f64
327+
; CHECK: liveins: $f10_h, $f11_d
328+
; CHECK-NEXT: {{ $}}
329+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr16 = COPY $f10_h
330+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $f11_d
331+
; CHECK-NEXT: [[FCVT_H_D:%[0-9]+]]:fpr16 = nofpexcept FCVT_H_D [[COPY1]], 7
332+
; CHECK-NEXT: [[FSGNJ_H:%[0-9]+]]:fpr16 = FSGNJ_H [[COPY]], [[FCVT_H_D]]
333+
; CHECK-NEXT: $f10_h = COPY [[FSGNJ_H]]
334+
; CHECK-NEXT: PseudoRET implicit $f10_h
335+
%0:fprb(s16) = COPY $f10_h
336+
%1:fprb(s64) = COPY $f11_d
337+
%2:fprb(s16) = G_FCOPYSIGN %0, %1
338+
$f10_h = COPY %2(s16)
339+
PseudoRET implicit $f10_h
340+
341+
...
342+
---
343+
name: fcopysign_f64_f16
344+
legalized: true
345+
regBankSelected: true
346+
tracksRegLiveness: true
347+
body: |
348+
bb.0:
349+
liveins: $f10_d, $f11_h
350+
351+
; CHECK-LABEL: name: fcopysign_f64_f16
352+
; CHECK: liveins: $f10_d, $f11_h
353+
; CHECK-NEXT: {{ $}}
354+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f10_d
355+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr16 = COPY $f11_h
356+
; CHECK-NEXT: [[FCVT_D_H:%[0-9]+]]:fpr64 = nofpexcept FCVT_D_H [[COPY1]], 0
357+
; CHECK-NEXT: [[FSGNJ_D:%[0-9]+]]:fpr64 = FSGNJ_D [[COPY]], [[FCVT_D_H]]
358+
; CHECK-NEXT: $f10_d = COPY [[FSGNJ_D]]
359+
; CHECK-NEXT: PseudoRET implicit $f10_d
360+
%0:fprb(s64) = COPY $f10_d
361+
%1:fprb(s16) = COPY $f11_h
362+
%2:fprb(s64) = G_FCOPYSIGN %0, %1
363+
$f10_d = COPY %2(s64)
364+
PseudoRET implicit $f10_d
365+
366+
...

llvm/test/CodeGen/RISCV/GlobalISel/instruction-select/fp-arith.mir

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -241,15 +241,15 @@ body: |
241241
242242
...
243243
---
244-
name: fcopysign_f32
244+
name: fcopysign_f32_f32
245245
legalized: true
246246
regBankSelected: true
247247
tracksRegLiveness: true
248248
body: |
249249
bb.0:
250250
liveins: $f10_f, $f11_f
251251
252-
; CHECK-LABEL: name: fcopysign_f32
252+
; CHECK-LABEL: name: fcopysign_f32_f32
253253
; CHECK: liveins: $f10_f, $f11_f
254254
; CHECK-NEXT: {{ $}}
255255
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr32 = COPY $f10_f
@@ -263,6 +263,31 @@ body: |
263263
$f10_f = COPY %2(s32)
264264
PseudoRET implicit $f10_f
265265
266+
...
267+
---
268+
name: fcopysign_f32_f64
269+
legalized: true
270+
regBankSelected: true
271+
tracksRegLiveness: true
272+
body: |
273+
bb.0:
274+
liveins: $f10_f, $f11_d
275+
276+
; CHECK-LABEL: name: fcopysign_f32_f64
277+
; CHECK: liveins: $f10_f, $f11_d
278+
; CHECK-NEXT: {{ $}}
279+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr32 = COPY $f10_f
280+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr64 = COPY $f11_d
281+
; CHECK-NEXT: [[FCVT_S_D:%[0-9]+]]:fpr32 = nofpexcept FCVT_S_D [[COPY1]], 7
282+
; CHECK-NEXT: [[FSGNJ_S:%[0-9]+]]:fpr32 = FSGNJ_S [[COPY]], [[FCVT_S_D]]
283+
; CHECK-NEXT: $f10_f = COPY [[FSGNJ_S]]
284+
; CHECK-NEXT: PseudoRET implicit $f10_f
285+
%0:fprb(s32) = COPY $f10_f
286+
%1:fprb(s64) = COPY $f11_d
287+
%2:fprb(s32) = G_FCOPYSIGN %0, %1
288+
$f10_f = COPY %2(s32)
289+
PseudoRET implicit $f10_f
290+
266291
...
267292
---
268293
name: fadd_f64
@@ -501,15 +526,15 @@ body: |
501526
502527
...
503528
---
504-
name: fcopysign_f64
529+
name: fcopysign_f64_f64
505530
legalized: true
506531
regBankSelected: true
507532
tracksRegLiveness: true
508533
body: |
509534
bb.0:
510535
liveins: $f10_d, $f11_d
511536
512-
; CHECK-LABEL: name: fcopysign_f64
537+
; CHECK-LABEL: name: fcopysign_f64_f64
513538
; CHECK: liveins: $f10_d, $f11_d
514539
; CHECK-NEXT: {{ $}}
515540
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f10_d
@@ -524,3 +549,28 @@ body: |
524549
PseudoRET implicit $f10_d
525550
526551
...
552+
---
553+
name: fcopysign_f64_f32
554+
legalized: true
555+
regBankSelected: true
556+
tracksRegLiveness: true
557+
body: |
558+
bb.0:
559+
liveins: $f10_d, $f11_f
560+
561+
; CHECK-LABEL: name: fcopysign_f64_f32
562+
; CHECK: liveins: $f10_d, $f11_f
563+
; CHECK-NEXT: {{ $}}
564+
; CHECK-NEXT: [[COPY:%[0-9]+]]:fpr64 = COPY $f10_d
565+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fpr32 = COPY $f11_f
566+
; CHECK-NEXT: [[FCVT_D_S:%[0-9]+]]:fpr64 = nofpexcept FCVT_D_S [[COPY1]], 0
567+
; CHECK-NEXT: [[FSGNJ_D:%[0-9]+]]:fpr64 = FSGNJ_D [[COPY]], [[FCVT_D_S]]
568+
; CHECK-NEXT: $f10_d = COPY [[FSGNJ_D]]
569+
; CHECK-NEXT: PseudoRET implicit $f10_d
570+
%0:fprb(s64) = COPY $f10_d
571+
%1:fprb(s32) = COPY $f11_f
572+
%2:fprb(s64) = G_FCOPYSIGN %0, %1
573+
$f10_d = COPY %2(s64)
574+
PseudoRET implicit $f10_d
575+
576+
...

llvm/test/CodeGen/RISCV/GlobalISel/legalizer/legalize-fp-arith-f16.mir

Lines changed: 88 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2-
# RUN: llc -mtriple=riscv32 -mattr=+zfh -run-pass=legalizer %s -o - \
2+
# RUN: llc -mtriple=riscv32 -mattr=+zfh,+d -run-pass=legalizer %s -o - \
33
# RUN: | FileCheck %s
4-
# RUN: llc -mtriple=riscv64 -mattr=+zfh -run-pass=legalizer %s -o - \
4+
# RUN: llc -mtriple=riscv64 -mattr=+zfh,+d -run-pass=legalizer %s -o - \
55
# RUN: | FileCheck %s
66

77
---
@@ -211,12 +211,12 @@ body: |
211211
212212
...
213213
---
214-
name: fcopysign_f16
214+
name: fcopysign_f16_f16
215215
body: |
216216
bb.0:
217217
liveins: $f10_h, $f11_h
218218
219-
; CHECK-LABEL: name: fcopysign_f16
219+
; CHECK-LABEL: name: fcopysign_f16_f16
220220
; CHECK: liveins: $f10_h, $f11_h
221221
; CHECK-NEXT: {{ $}}
222222
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $f10_h
@@ -231,3 +231,87 @@ body: |
231231
PseudoRET implicit $f10_h
232232
233233
...
234+
---
235+
name: fcopysign_f16_f32
236+
body: |
237+
bb.0:
238+
liveins: $f10_h, $f11_f
239+
240+
; CHECK-LABEL: name: fcopysign_f16_f32
241+
; CHECK: liveins: $f10_h, $f11_f
242+
; CHECK-NEXT: {{ $}}
243+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $f10_h
244+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s32) = COPY $f11_f
245+
; CHECK-NEXT: [[FCOPYSIGN:%[0-9]+]]:_(s16) = G_FCOPYSIGN [[COPY]], [[COPY1]](s32)
246+
; CHECK-NEXT: $f10_h = COPY [[FCOPYSIGN]](s16)
247+
; CHECK-NEXT: PseudoRET implicit $f10_h
248+
%0:_(s16) = COPY $f10_h
249+
%1:_(s32) = COPY $f11_f
250+
%2:_(s16) = G_FCOPYSIGN %0, %1
251+
$f10_h = COPY %2(s16)
252+
PseudoRET implicit $f10_h
253+
254+
...
255+
---
256+
name: fcopysign_f32_f16
257+
body: |
258+
bb.0:
259+
liveins: $f10_f, $f11_h
260+
261+
; CHECK-LABEL: name: fcopysign_f32_f16
262+
; CHECK: liveins: $f10_f, $f11_h
263+
; CHECK-NEXT: {{ $}}
264+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s32) = COPY $f10_f
265+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s16) = COPY $f11_h
266+
; CHECK-NEXT: [[FCOPYSIGN:%[0-9]+]]:_(s32) = G_FCOPYSIGN [[COPY]], [[COPY1]](s16)
267+
; CHECK-NEXT: $f10_f = COPY [[FCOPYSIGN]](s32)
268+
; CHECK-NEXT: PseudoRET implicit $f10_f
269+
%0:_(s32) = COPY $f10_f
270+
%1:_(s16) = COPY $f11_h
271+
%2:_(s32) = G_FCOPYSIGN %0, %1
272+
$f10_f = COPY %2(s32)
273+
PseudoRET implicit $f10_f
274+
275+
...
276+
---
277+
name: fcopysign_f16_f64
278+
body: |
279+
bb.0:
280+
liveins: $f10_h, $f11_d
281+
282+
; CHECK-LABEL: name: fcopysign_f16_f64
283+
; CHECK: liveins: $f10_h, $f11_d
284+
; CHECK-NEXT: {{ $}}
285+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s16) = COPY $f10_h
286+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s64) = COPY $f11_d
287+
; CHECK-NEXT: [[FCOPYSIGN:%[0-9]+]]:_(s16) = G_FCOPYSIGN [[COPY]], [[COPY1]](s64)
288+
; CHECK-NEXT: $f10_h = COPY [[FCOPYSIGN]](s16)
289+
; CHECK-NEXT: PseudoRET implicit $f10_h
290+
%0:_(s16) = COPY $f10_h
291+
%1:_(s64) = COPY $f11_d
292+
%2:_(s16) = G_FCOPYSIGN %0, %1
293+
$f10_h = COPY %2(s16)
294+
PseudoRET implicit $f10_h
295+
296+
...
297+
---
298+
name: fcopysign_f64_f16
299+
body: |
300+
bb.0:
301+
liveins: $f10_d, $f11_h
302+
303+
; CHECK-LABEL: name: fcopysign_f64_f16
304+
; CHECK: liveins: $f10_d, $f11_h
305+
; CHECK-NEXT: {{ $}}
306+
; CHECK-NEXT: [[COPY:%[0-9]+]]:_(s64) = COPY $f10_d
307+
; CHECK-NEXT: [[COPY1:%[0-9]+]]:_(s16) = COPY $f11_h
308+
; CHECK-NEXT: [[FCOPYSIGN:%[0-9]+]]:_(s64) = G_FCOPYSIGN [[COPY]], [[COPY1]](s16)
309+
; CHECK-NEXT: $f10_d = COPY [[FCOPYSIGN]](s64)
310+
; CHECK-NEXT: PseudoRET implicit $f10_d
311+
%0:_(s64) = COPY $f10_d
312+
%1:_(s16) = COPY $f11_h
313+
%2:_(s64) = G_FCOPYSIGN %0, %1
314+
$f10_d = COPY %2(s64)
315+
PseudoRET implicit $f10_d
316+
317+
...

0 commit comments

Comments
 (0)