Skip to content

Commit 3799b25

Browse files
committed
Bugfix for FCLASS incorrect regbankselect; includes test file sed support similar to llc update script
Signed-off-by: Luke Quinn <[email protected]>
1 parent f67ba58 commit 3799b25

File tree

3 files changed

+228
-86
lines changed

3 files changed

+228
-86
lines changed

llvm/lib/Target/RISCV/GISel/RISCVRegisterBankInfo.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ bool RISCVRegisterBankInfo::onlyUsesFP(const MachineInstr &MI,
151151
switch (MI.getOpcode()) {
152152
case RISCV::G_FCVT_W_RV64:
153153
case RISCV::G_FCVT_WU_RV64:
154+
case RISCV::G_FCLASS:
154155
case TargetOpcode::G_FPTOSI:
155156
case TargetOpcode::G_FPTOUI:
156157
case TargetOpcode::G_FCMP:
@@ -326,19 +327,21 @@ RISCVRegisterBankInfo::getInstrMapping(const MachineInstr &MI) const {
326327
// Use FPR64 for s64 loads on rv32.
327328
if (GPRSize == 32 && Size.getFixedValue() == 64) {
328329
assert(MF.getSubtarget<RISCVSubtarget>().hasStdExtD());
329-
OpdsMapping[0] = getFPValueMapping(Ty.getSizeInBits());
330+
OpdsMapping[0] = getFPValueMapping(Size);
330331
break;
331332
}
332333

333334
// Check if that load feeds fp instructions.
334335
// In that case, we want the default mapping to be on FPR
335336
// instead of blind map every scalar to GPR.
336-
if (anyUseOnlyUseFP(MI.getOperand(0).getReg(), MRI, TRI))
337+
if (anyUseOnlyUseFP(MI.getOperand(0).getReg(), MRI, TRI)) {
337338
// If we have at least one direct use in a FP instruction,
338339
// assume this was a floating point load in the IR. If it was
339340
// not, we would have had a bitcast before reaching that
340341
// instruction.
341-
OpdsMapping[0] = getFPValueMapping(Ty.getSizeInBits());
342+
OpdsMapping[0] = getFPValueMapping(Size);
343+
break;
344+
}
342345

343346
break;
344347
}
Lines changed: 198 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2-
# RUN: llc -mtriple=riscv32 -mattr=+d,+zfh -run-pass=regbankselect \
3-
# RUN: -disable-gisel-legality-check -simplify-mir -verify-machineinstrs %s \
4-
# RUN: -o - | FileCheck %s --check-prefixes=CHECK
5-
# RUN: llc -mtriple=riscv64 -mattr=+d,+zfh -run-pass=regbankselect \
6-
# RUN: -disable-gisel-legality-check -simplify-mir -verify-machineinstrs %s \
7-
# RUN: -o - | FileCheck %s --check-prefixes=CHECK
2+
# RUN: sed 's/XLen/32/g' %s | llc -mtriple=riscv32 -mattr=+d,+zfh -run-pass=regbankselect \
3+
# RUN: -disable-gisel-legality-check -simplify-mir -verify-machineinstrs -x mir \
4+
# RUN: -o - | FileCheck %s --check-prefixes=CHECK-RV32
5+
# RUN: sed 's/XLen/64/g' %s | llc -mtriple=riscv64 -mattr=+d,+zfh -run-pass=regbankselect \
6+
# RUN: -disable-gisel-legality-check -simplify-mir -verify-machineinstrs -x mir \
7+
# RUN: -o - | FileCheck %s --check-prefixes=CHECK-RV64
88

99
---
1010
name: fp_store_fp_def_f32
@@ -14,15 +14,25 @@ body: |
1414
bb.1:
1515
liveins: $x10, $f10_f, $f11_f
1616
17-
; CHECK-LABEL: name: fp_store_fp_def_f32
18-
; CHECK: liveins: $x10, $f10_f, $f11_f
19-
; CHECK-NEXT: {{ $}}
20-
; CHECK-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
21-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f10_f
22-
; CHECK-NEXT: [[COPY2:%[0-9]+]]:fprb(s32) = COPY $f11_f
23-
; CHECK-NEXT: [[FADD:%[0-9]+]]:fprb(s32) = G_FADD [[COPY1]], [[COPY2]]
24-
; CHECK-NEXT: G_STORE [[FADD]](s32), [[COPY]](p0) :: (store (s32))
25-
; CHECK-NEXT: PseudoRET
17+
; CHECK-RV32-LABEL: name: fp_store_fp_def_f32
18+
; CHECK-RV32: liveins: $x10, $f10_f, $f11_f
19+
; CHECK-RV32-NEXT: {{ $}}
20+
; CHECK-RV32-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
21+
; CHECK-RV32-NEXT: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f10_f
22+
; CHECK-RV32-NEXT: [[COPY2:%[0-9]+]]:fprb(s32) = COPY $f11_f
23+
; CHECK-RV32-NEXT: [[FADD:%[0-9]+]]:fprb(s32) = G_FADD [[COPY1]], [[COPY2]]
24+
; CHECK-RV32-NEXT: G_STORE [[FADD]](s32), [[COPY]](p0) :: (store (s32))
25+
; CHECK-RV32-NEXT: PseudoRET
26+
;
27+
; CHECK-RV64-LABEL: name: fp_store_fp_def_f32
28+
; CHECK-RV64: liveins: $x10, $f10_f, $f11_f
29+
; CHECK-RV64-NEXT: {{ $}}
30+
; CHECK-RV64-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
31+
; CHECK-RV64-NEXT: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f10_f
32+
; CHECK-RV64-NEXT: [[COPY2:%[0-9]+]]:fprb(s32) = COPY $f11_f
33+
; CHECK-RV64-NEXT: [[FADD:%[0-9]+]]:fprb(s32) = G_FADD [[COPY1]], [[COPY2]]
34+
; CHECK-RV64-NEXT: G_STORE [[FADD]](s32), [[COPY]](p0) :: (store (s32))
35+
; CHECK-RV64-NEXT: PseudoRET
2636
%0:_(p0) = COPY $x10
2737
%1:_(s32) = COPY $f10_f
2838
%2:_(s32) = COPY $f11_f
@@ -39,15 +49,25 @@ body: |
3949
bb.1:
4050
liveins: $x10, $f10_d, $f11_d
4151
42-
; CHECK-LABEL: name: fp_store_fp_def_f64
43-
; CHECK: liveins: $x10, $f10_d, $f11_d
44-
; CHECK-NEXT: {{ $}}
45-
; CHECK-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
46-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
47-
; CHECK-NEXT: [[COPY2:%[0-9]+]]:fprb(s64) = COPY $f11_d
48-
; CHECK-NEXT: [[FADD:%[0-9]+]]:fprb(s64) = G_FADD [[COPY1]], [[COPY2]]
49-
; CHECK-NEXT: G_STORE [[FADD]](s64), [[COPY]](p0) :: (store (s64))
50-
; CHECK-NEXT: PseudoRET
52+
; CHECK-RV32-LABEL: name: fp_store_fp_def_f64
53+
; CHECK-RV32: liveins: $x10, $f10_d, $f11_d
54+
; CHECK-RV32-NEXT: {{ $}}
55+
; CHECK-RV32-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
56+
; CHECK-RV32-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
57+
; CHECK-RV32-NEXT: [[COPY2:%[0-9]+]]:fprb(s64) = COPY $f11_d
58+
; CHECK-RV32-NEXT: [[FADD:%[0-9]+]]:fprb(s64) = G_FADD [[COPY1]], [[COPY2]]
59+
; CHECK-RV32-NEXT: G_STORE [[FADD]](s64), [[COPY]](p0) :: (store (s64))
60+
; CHECK-RV32-NEXT: PseudoRET
61+
;
62+
; CHECK-RV64-LABEL: name: fp_store_fp_def_f64
63+
; CHECK-RV64: liveins: $x10, $f10_d, $f11_d
64+
; CHECK-RV64-NEXT: {{ $}}
65+
; CHECK-RV64-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
66+
; CHECK-RV64-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
67+
; CHECK-RV64-NEXT: [[COPY2:%[0-9]+]]:fprb(s64) = COPY $f11_d
68+
; CHECK-RV64-NEXT: [[FADD:%[0-9]+]]:fprb(s64) = G_FADD [[COPY1]], [[COPY2]]
69+
; CHECK-RV64-NEXT: G_STORE [[FADD]](s64), [[COPY]](p0) :: (store (s64))
70+
; CHECK-RV64-NEXT: PseudoRET
5171
%0:_(p0) = COPY $x10
5272
%1:_(s64) = COPY $f10_d
5373
%2:_(s64) = COPY $f11_d
@@ -64,13 +84,21 @@ body: |
6484
bb.1:
6585
liveins: $x10, $f10_d
6686
67-
; CHECK-LABEL: name: fp_store_no_def_f64
68-
; CHECK: liveins: $x10, $f10_d
69-
; CHECK-NEXT: {{ $}}
70-
; CHECK-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
71-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
72-
; CHECK-NEXT: G_STORE [[COPY1]](s64), [[COPY]](p0) :: (store (s64))
73-
; CHECK-NEXT: PseudoRET
87+
; CHECK-RV32-LABEL: name: fp_store_no_def_f64
88+
; CHECK-RV32: liveins: $x10, $f10_d
89+
; CHECK-RV32-NEXT: {{ $}}
90+
; CHECK-RV32-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
91+
; CHECK-RV32-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
92+
; CHECK-RV32-NEXT: G_STORE [[COPY1]](s64), [[COPY]](p0) :: (store (s64))
93+
; CHECK-RV32-NEXT: PseudoRET
94+
;
95+
; CHECK-RV64-LABEL: name: fp_store_no_def_f64
96+
; CHECK-RV64: liveins: $x10, $f10_d
97+
; CHECK-RV64-NEXT: {{ $}}
98+
; CHECK-RV64-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
99+
; CHECK-RV64-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
100+
; CHECK-RV64-NEXT: G_STORE [[COPY1]](s64), [[COPY]](p0) :: (store (s64))
101+
; CHECK-RV64-NEXT: PseudoRET
74102
%0:_(p0) = COPY $x10
75103
%1:_(s64) = COPY $f10_d
76104
G_STORE %1(s64), %0(p0) :: (store (s64))
@@ -85,15 +113,25 @@ body: |
85113
bb.1:
86114
liveins: $x10, $f10_f
87115
88-
; CHECK-LABEL: name: fp_load_fp_use_f32
89-
; CHECK: liveins: $x10, $f10_f
90-
; CHECK-NEXT: {{ $}}
91-
; CHECK-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
92-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f10_f
93-
; CHECK-NEXT: [[LOAD:%[0-9]+]]:fprb(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
94-
; CHECK-NEXT: [[FADD:%[0-9]+]]:fprb(s32) = G_FADD [[LOAD]], [[COPY1]]
95-
; CHECK-NEXT: $f10_f = COPY [[FADD]](s32)
96-
; CHECK-NEXT: PseudoRET implicit $f10_f
116+
; CHECK-RV32-LABEL: name: fp_load_fp_use_f32
117+
; CHECK-RV32: liveins: $x10, $f10_f
118+
; CHECK-RV32-NEXT: {{ $}}
119+
; CHECK-RV32-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
120+
; CHECK-RV32-NEXT: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f10_f
121+
; CHECK-RV32-NEXT: [[LOAD:%[0-9]+]]:fprb(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
122+
; CHECK-RV32-NEXT: [[FADD:%[0-9]+]]:fprb(s32) = G_FADD [[LOAD]], [[COPY1]]
123+
; CHECK-RV32-NEXT: $f10_f = COPY [[FADD]](s32)
124+
; CHECK-RV32-NEXT: PseudoRET implicit $f10_f
125+
;
126+
; CHECK-RV64-LABEL: name: fp_load_fp_use_f32
127+
; CHECK-RV64: liveins: $x10, $f10_f
128+
; CHECK-RV64-NEXT: {{ $}}
129+
; CHECK-RV64-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
130+
; CHECK-RV64-NEXT: [[COPY1:%[0-9]+]]:fprb(s32) = COPY $f10_f
131+
; CHECK-RV64-NEXT: [[LOAD:%[0-9]+]]:fprb(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
132+
; CHECK-RV64-NEXT: [[FADD:%[0-9]+]]:fprb(s32) = G_FADD [[LOAD]], [[COPY1]]
133+
; CHECK-RV64-NEXT: $f10_f = COPY [[FADD]](s32)
134+
; CHECK-RV64-NEXT: PseudoRET implicit $f10_f
97135
%0:_(p0) = COPY $x10
98136
%1:_(s32) = COPY $f10_f
99137
%2:_(s32) = G_LOAD %0(p0) :: (load (s32))
@@ -110,15 +148,25 @@ body: |
110148
bb.1:
111149
liveins: $x10, $f10_d
112150
113-
; CHECK-LABEL: name: fp_load_fp_use_f64
114-
; CHECK: liveins: $x10, $f10_d
115-
; CHECK-NEXT: {{ $}}
116-
; CHECK-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
117-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
118-
; CHECK-NEXT: [[LOAD:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY]](p0) :: (load (s64))
119-
; CHECK-NEXT: [[FADD:%[0-9]+]]:fprb(s64) = G_FADD [[LOAD]], [[COPY1]]
120-
; CHECK-NEXT: $f10_d = COPY [[FADD]](s64)
121-
; CHECK-NEXT: PseudoRET implicit $f10_d
151+
; CHECK-RV32-LABEL: name: fp_load_fp_use_f64
152+
; CHECK-RV32: liveins: $x10, $f10_d
153+
; CHECK-RV32-NEXT: {{ $}}
154+
; CHECK-RV32-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
155+
; CHECK-RV32-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
156+
; CHECK-RV32-NEXT: [[LOAD:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY]](p0) :: (load (s64))
157+
; CHECK-RV32-NEXT: [[FADD:%[0-9]+]]:fprb(s64) = G_FADD [[LOAD]], [[COPY1]]
158+
; CHECK-RV32-NEXT: $f10_d = COPY [[FADD]](s64)
159+
; CHECK-RV32-NEXT: PseudoRET implicit $f10_d
160+
;
161+
; CHECK-RV64-LABEL: name: fp_load_fp_use_f64
162+
; CHECK-RV64: liveins: $x10, $f10_d
163+
; CHECK-RV64-NEXT: {{ $}}
164+
; CHECK-RV64-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
165+
; CHECK-RV64-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
166+
; CHECK-RV64-NEXT: [[LOAD:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY]](p0) :: (load (s64))
167+
; CHECK-RV64-NEXT: [[FADD:%[0-9]+]]:fprb(s64) = G_FADD [[LOAD]], [[COPY1]]
168+
; CHECK-RV64-NEXT: $f10_d = COPY [[FADD]](s64)
169+
; CHECK-RV64-NEXT: PseudoRET implicit $f10_d
122170
%0:_(p0) = COPY $x10
123171
%1:_(s64) = COPY $f10_d
124172
%2:_(s64) = G_LOAD %0(p0) :: (load (s64))
@@ -135,14 +183,23 @@ body: |
135183
bb.1:
136184
liveins: $x10, $f10_d
137185
138-
; CHECK-LABEL: name: fp_load_no_use_f64
139-
; CHECK: liveins: $x10, $f10_d
140-
; CHECK-NEXT: {{ $}}
141-
; CHECK-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
142-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
143-
; CHECK-NEXT: [[LOAD:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY]](p0) :: (load (s64))
144-
; CHECK-NEXT: $f10_d = COPY [[LOAD]](s64)
145-
; CHECK-NEXT: PseudoRET implicit $f10_d
186+
; CHECK-RV32-LABEL: name: fp_load_no_use_f64
187+
; CHECK-RV32: liveins: $x10, $f10_d
188+
; CHECK-RV32-NEXT: {{ $}}
189+
; CHECK-RV32-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
190+
; CHECK-RV32-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
191+
; CHECK-RV32-NEXT: [[LOAD:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY]](p0) :: (load (s64))
192+
; CHECK-RV32-NEXT: $f10_d = COPY [[LOAD]](s64)
193+
; CHECK-RV32-NEXT: PseudoRET implicit $f10_d
194+
;
195+
; CHECK-RV64-LABEL: name: fp_load_no_use_f64
196+
; CHECK-RV64: liveins: $x10, $f10_d
197+
; CHECK-RV64-NEXT: {{ $}}
198+
; CHECK-RV64-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
199+
; CHECK-RV64-NEXT: [[COPY1:%[0-9]+]]:fprb(s64) = COPY $f10_d
200+
; CHECK-RV64-NEXT: [[LOAD:%[0-9]+]]:fprb(s64) = G_LOAD [[COPY]](p0) :: (load (s64))
201+
; CHECK-RV64-NEXT: $f10_d = COPY [[LOAD]](s64)
202+
; CHECK-RV64-NEXT: PseudoRET implicit $f10_d
146203
%0:_(p0) = COPY $x10
147204
%1:_(s64) = COPY $f10_d
148205
%2:_(s64) = G_LOAD %0(p0) :: (load (s64))
@@ -158,15 +215,25 @@ body: |
158215
bb.1:
159216
liveins: $x10, $f10_h, $f11_h
160217
161-
; CHECK-LABEL: name: fp_store_fp_def_f16
162-
; CHECK: liveins: $x10, $f10_h, $f11_h
163-
; CHECK-NEXT: {{ $}}
164-
; CHECK-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
165-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fprb(s16) = COPY $f10_h
166-
; CHECK-NEXT: [[COPY2:%[0-9]+]]:fprb(s16) = COPY $f11_h
167-
; CHECK-NEXT: [[FADD:%[0-9]+]]:fprb(s16) = G_FADD [[COPY1]], [[COPY2]]
168-
; CHECK-NEXT: G_STORE [[FADD]](s16), [[COPY]](p0) :: (store (s16))
169-
; CHECK-NEXT: PseudoRET
218+
; CHECK-RV32-LABEL: name: fp_store_fp_def_f16
219+
; CHECK-RV32: liveins: $x10, $f10_h, $f11_h
220+
; CHECK-RV32-NEXT: {{ $}}
221+
; CHECK-RV32-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
222+
; CHECK-RV32-NEXT: [[COPY1:%[0-9]+]]:fprb(s16) = COPY $f10_h
223+
; CHECK-RV32-NEXT: [[COPY2:%[0-9]+]]:fprb(s16) = COPY $f11_h
224+
; CHECK-RV32-NEXT: [[FADD:%[0-9]+]]:fprb(s16) = G_FADD [[COPY1]], [[COPY2]]
225+
; CHECK-RV32-NEXT: G_STORE [[FADD]](s16), [[COPY]](p0) :: (store (s16))
226+
; CHECK-RV32-NEXT: PseudoRET
227+
;
228+
; CHECK-RV64-LABEL: name: fp_store_fp_def_f16
229+
; CHECK-RV64: liveins: $x10, $f10_h, $f11_h
230+
; CHECK-RV64-NEXT: {{ $}}
231+
; CHECK-RV64-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
232+
; CHECK-RV64-NEXT: [[COPY1:%[0-9]+]]:fprb(s16) = COPY $f10_h
233+
; CHECK-RV64-NEXT: [[COPY2:%[0-9]+]]:fprb(s16) = COPY $f11_h
234+
; CHECK-RV64-NEXT: [[FADD:%[0-9]+]]:fprb(s16) = G_FADD [[COPY1]], [[COPY2]]
235+
; CHECK-RV64-NEXT: G_STORE [[FADD]](s16), [[COPY]](p0) :: (store (s16))
236+
; CHECK-RV64-NEXT: PseudoRET
170237
%0:_(p0) = COPY $x10
171238
%1:_(s16) = COPY $f10_h
172239
%2:_(s16) = COPY $f11_h
@@ -183,15 +250,25 @@ body: |
183250
bb.1:
184251
liveins: $x10, $f10_h
185252
186-
; CHECK-LABEL: name: fp_load_fp_use_f16
187-
; CHECK: liveins: $x10, $f10_h
188-
; CHECK-NEXT: {{ $}}
189-
; CHECK-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
190-
; CHECK-NEXT: [[COPY1:%[0-9]+]]:fprb(s16) = COPY $f10_h
191-
; CHECK-NEXT: [[LOAD:%[0-9]+]]:fprb(s16) = G_LOAD [[COPY]](p0) :: (load (s16))
192-
; CHECK-NEXT: [[FADD:%[0-9]+]]:fprb(s16) = G_FADD [[LOAD]], [[COPY1]]
193-
; CHECK-NEXT: $f10_h = COPY [[FADD]](s16)
194-
; CHECK-NEXT: PseudoRET implicit $f10_h
253+
; CHECK-RV32-LABEL: name: fp_load_fp_use_f16
254+
; CHECK-RV32: liveins: $x10, $f10_h
255+
; CHECK-RV32-NEXT: {{ $}}
256+
; CHECK-RV32-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
257+
; CHECK-RV32-NEXT: [[COPY1:%[0-9]+]]:fprb(s16) = COPY $f10_h
258+
; CHECK-RV32-NEXT: [[LOAD:%[0-9]+]]:fprb(s16) = G_LOAD [[COPY]](p0) :: (load (s16))
259+
; CHECK-RV32-NEXT: [[FADD:%[0-9]+]]:fprb(s16) = G_FADD [[LOAD]], [[COPY1]]
260+
; CHECK-RV32-NEXT: $f10_h = COPY [[FADD]](s16)
261+
; CHECK-RV32-NEXT: PseudoRET implicit $f10_h
262+
;
263+
; CHECK-RV64-LABEL: name: fp_load_fp_use_f16
264+
; CHECK-RV64: liveins: $x10, $f10_h
265+
; CHECK-RV64-NEXT: {{ $}}
266+
; CHECK-RV64-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
267+
; CHECK-RV64-NEXT: [[COPY1:%[0-9]+]]:fprb(s16) = COPY $f10_h
268+
; CHECK-RV64-NEXT: [[LOAD:%[0-9]+]]:fprb(s16) = G_LOAD [[COPY]](p0) :: (load (s16))
269+
; CHECK-RV64-NEXT: [[FADD:%[0-9]+]]:fprb(s16) = G_FADD [[LOAD]], [[COPY1]]
270+
; CHECK-RV64-NEXT: $f10_h = COPY [[FADD]](s16)
271+
; CHECK-RV64-NEXT: PseudoRET implicit $f10_h
195272
%0:_(p0) = COPY $x10
196273
%1:_(s16) = COPY $f10_h
197274
%2:_(s16) = G_LOAD %0(p0) :: (load (s16))
@@ -200,3 +277,49 @@ body: |
200277
PseudoRET implicit $f10_h
201278
202279
...
280+
---
281+
name: fpclass
282+
legalized: true
283+
tracksRegLiveness: true
284+
liveins:
285+
- { reg: '$x10' }
286+
body: |
287+
bb.1:
288+
liveins: $x10
289+
290+
; CHECK-RV32-LABEL: name: fpclass
291+
; CHECK-RV32: liveins: $x10
292+
; CHECK-RV32-NEXT: {{ $}}
293+
; CHECK-RV32-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
294+
; CHECK-RV32-NEXT: [[LOAD:%[0-9]+]]:fprb(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
295+
; CHECK-RV32-NEXT: [[C:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 927
296+
; CHECK-RV32-NEXT: [[C1:%[0-9]+]]:gprb(s32) = G_CONSTANT i32 0
297+
; CHECK-RV32-NEXT: [[FCLASS:%[0-9]+]]:gprb(s32) = G_FCLASS [[LOAD]](s32)
298+
; CHECK-RV32-NEXT: [[AND:%[0-9]+]]:gprb(s32) = G_AND [[FCLASS]], [[C]]
299+
; CHECK-RV32-NEXT: [[ICMP:%[0-9]+]]:gprb(s32) = G_ICMP intpred(ne), [[AND]](s32), [[C1]]
300+
; CHECK-RV32-NEXT: $x10 = COPY [[ICMP]](s32)
301+
; CHECK-RV32-NEXT: PseudoRET implicit $x10
302+
;
303+
; CHECK-RV64-LABEL: name: fpclass
304+
; CHECK-RV64: liveins: $x10
305+
; CHECK-RV64-NEXT: {{ $}}
306+
; CHECK-RV64-NEXT: [[COPY:%[0-9]+]]:gprb(p0) = COPY $x10
307+
; CHECK-RV64-NEXT: [[LOAD:%[0-9]+]]:fprb(s32) = G_LOAD [[COPY]](p0) :: (load (s32))
308+
; CHECK-RV64-NEXT: [[C:%[0-9]+]]:gprb(s64) = G_CONSTANT i64 927
309+
; CHECK-RV64-NEXT: [[C1:%[0-9]+]]:gprb(s64) = G_CONSTANT i64 0
310+
; CHECK-RV64-NEXT: [[FCLASS:%[0-9]+]]:gprb(s64) = G_FCLASS [[LOAD]](s32)
311+
; CHECK-RV64-NEXT: [[AND:%[0-9]+]]:gprb(s64) = G_AND [[FCLASS]], [[C]]
312+
; CHECK-RV64-NEXT: [[ICMP:%[0-9]+]]:gprb(s64) = G_ICMP intpred(ne), [[AND]](s64), [[C1]]
313+
; CHECK-RV64-NEXT: $x10 = COPY [[ICMP]](s64)
314+
; CHECK-RV64-NEXT: PseudoRET implicit $x10
315+
%0:_(p0) = COPY $x10
316+
%1:_(s32) = G_LOAD %0(p0) :: (load (s32))
317+
%4:_(sXLen) = G_CONSTANT iXLen 927
318+
%5:_(sXLen) = G_CONSTANT iXLen 0
319+
%6:_(sXLen) = G_FCLASS %1(s32)
320+
%7:_(sXLen) = G_AND %6, %4
321+
%8:_(sXLen) = G_ICMP intpred(ne), %7(sXLen), %5
322+
$x10 = COPY %8(sXLen)
323+
PseudoRET implicit $x10
324+
325+
...

0 commit comments

Comments
 (0)