Skip to content

Commit 3fb0bea

Browse files
committed
[RISCV][GISel] Add register class to some isel output patterns so they can be imported.
This makes (fcopysign X, (fneg Y)) patterns work.
1 parent e26af09 commit 3fb0bea

File tree

5 files changed

+14
-11
lines changed

5 files changed

+14
-11
lines changed

llvm/lib/Target/RISCV/RISCVInstrInfoD.td

+4-3
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,8 @@ def : Pat<(riscv_fclass FPR64:$rs1), (FCLASS_D $rs1)>;
285285

286286
def : PatFprFpr<fcopysign, FSGNJ_D, FPR64, f64>;
287287
def : PatFprFpr<riscv_fsgnjx, FSGNJX_D, FPR64, f64>;
288-
def : Pat<(fcopysign FPR64:$rs1, (fneg FPR64:$rs2)), (FSGNJN_D $rs1, $rs2)>;
288+
def : Pat<(fcopysign FPR64:$rs1, (fneg FPR64:$rs2)),
289+
(FSGNJN_D FPR64:$rs1, FPR64:$rs2)>;
289290
def : Pat<(fcopysign FPR64:$rs1, FPR32:$rs2), (FSGNJ_D $rs1, (FCVT_D_S $rs2,
290291
FRM_RNE))>;
291292
def : Pat<(fcopysign FPR32:$rs1, FPR64:$rs2), (FSGNJ_S $rs1, (FCVT_S_D $rs2,
@@ -323,7 +324,7 @@ def : Pat<(riscv_fclass FPR64INX:$rs1), (FCLASS_D_INX $rs1)>;
323324
def : PatFprFpr<fcopysign, FSGNJ_D_INX, FPR64INX, f64>;
324325
def : PatFprFpr<riscv_fsgnjx, FSGNJX_D_INX, FPR64INX, f64>;
325326
def : Pat<(fcopysign FPR64INX:$rs1, (fneg FPR64INX:$rs2)),
326-
(FSGNJN_D_INX $rs1, $rs2)>;
327+
(FSGNJN_D_INX FPR64INX:$rs1, FPR64INX:$rs2)>;
327328
def : Pat<(fcopysign FPR64INX:$rs1, FPR32INX:$rs2),
328329
(FSGNJ_D_INX $rs1, (f64 (FCVT_D_S_INX $rs2, FRM_RNE)))>;
329330
def : Pat<(fcopysign FPR32INX:$rs1, FPR64INX:$rs2),
@@ -361,7 +362,7 @@ def : Pat<(riscv_fclass FPR64IN32X:$rs1), (FCLASS_D_IN32X $rs1)>;
361362
def : PatFprFpr<fcopysign, FSGNJ_D_IN32X, FPR64IN32X, f64>;
362363
def : PatFprFpr<riscv_fsgnjx, FSGNJX_D_IN32X, FPR64IN32X, f64>;
363364
def : Pat<(fcopysign FPR64IN32X:$rs1, (fneg FPR64IN32X:$rs2)),
364-
(FSGNJN_D_IN32X $rs1, $rs2)>;
365+
(FSGNJN_D_IN32X FPR64IN32X:$rs1, FPR64IN32X:$rs2)>;
365366
def : Pat<(fcopysign FPR64IN32X:$rs1, FPR32INX:$rs2),
366367
(FSGNJ_D_IN32X $rs1, (FCVT_D_S_IN32X $rs2, FRM_RNE))>;
367368
def : Pat<(fcopysign FPR32INX:$rs1, FPR64IN32X:$rs2),

llvm/lib/Target/RISCV/RISCVInstrInfoF.td

+4-2
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,8 @@ defm : PatFprFpr_m<riscv_fsgnjx, FSGNJX_S, Ext>;
570570
}
571571

572572
let Predicates = [HasStdExtF] in {
573-
def : Pat<(fcopysign FPR32:$rs1, (fneg FPR32:$rs2)), (FSGNJN_S $rs1, $rs2)>;
573+
def : Pat<(fcopysign FPR32:$rs1, (fneg FPR32:$rs2)),
574+
(FSGNJN_S FPR32:$rs1, FPR32:$rs2)>;
574575

575576
// fmadd: rs1 * rs2 + rs3
576577
def : Pat<(any_fma FPR32:$rs1, FPR32:$rs2, FPR32:$rs3),
@@ -594,7 +595,8 @@ def : Pat<(fneg (any_fma_nsz FPR32:$rs1, FPR32:$rs2, FPR32:$rs3)),
594595
} // Predicates = [HasStdExtF]
595596

596597
let Predicates = [HasStdExtZfinx] in {
597-
def : Pat<(fcopysign FPR32INX:$rs1, (fneg FPR32INX:$rs2)), (FSGNJN_S_INX $rs1, $rs2)>;
598+
def : Pat<(fcopysign FPR32INX:$rs1, (fneg FPR32INX:$rs2)),
599+
(FSGNJN_S_INX FPR32INX:$rs1, FPR32INX:$rs2)>;
598600

599601
// fmadd: rs1 * rs2 + rs3
600602
def : Pat<(any_fma FPR32INX:$rs1, FPR32INX:$rs2, FPR32INX:$rs3),

llvm/lib/Target/RISCV/RISCVInstrInfoZfh.td

+4-2
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,8 @@ def : Pat<(riscv_fclass (f16 FPR16:$rs1)), (FCLASS_H $rs1)>;
291291

292292
def : PatFprFpr<fcopysign, FSGNJ_H, FPR16, f16>;
293293
def : PatFprFpr<riscv_fsgnjx, FSGNJX_H, FPR16, f16>;
294-
def : Pat<(f16 (fcopysign FPR16:$rs1, (f16 (fneg FPR16:$rs2)))), (FSGNJN_H $rs1, $rs2)>;
294+
def : Pat<(f16 (fcopysign FPR16:$rs1, (f16 (fneg FPR16:$rs2)))),
295+
(FSGNJN_H FPR16:$rs1, FPR16:$rs2)>;
295296
def : Pat<(f16 (fcopysign FPR16:$rs1, FPR32:$rs2)),
296297
(FSGNJ_H $rs1, (f16 (FCVT_H_S $rs2, FRM_DYN)))>;
297298

@@ -334,7 +335,8 @@ def : Pat<(riscv_fclass FPR16INX:$rs1), (FCLASS_H_INX $rs1)>;
334335

335336
def : PatFprFpr<fcopysign, FSGNJ_H_INX, FPR16INX, f16>;
336337
def : PatFprFpr<riscv_fsgnjx, FSGNJX_H_INX, FPR16INX, f16>;
337-
def : Pat<(fcopysign FPR16INX:$rs1, (fneg FPR16INX:$rs2)), (FSGNJN_H_INX $rs1, $rs2)>;
338+
def : Pat<(fcopysign FPR16INX:$rs1, (fneg FPR16INX:$rs2)),
339+
(FSGNJN_H_INX FPR16INX:$rs1, FPR16INX:$rs2)>;
338340
def : Pat<(fcopysign FPR16INX:$rs1, FPR32INX:$rs2),
339341
(FSGNJ_H_INX $rs1, (FCVT_H_S_INX $rs2, FRM_DYN))>;
340342

llvm/test/CodeGen/RISCV/GlobalISel/double-arith.ll

+1-2
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,7 @@ define double @fsgnjn_d(double %a, double %b) nounwind {
186186
;
187187
; CHECKIFD-LABEL: fsgnjn_d:
188188
; CHECKIFD: # %bb.0:
189-
; CHECKIFD-NEXT: fneg.d fa5, fa1
190-
; CHECKIFD-NEXT: fsgnj.d fa0, fa0, fa5
189+
; CHECKIFD-NEXT: fsgnjn.d fa0, fa0, fa1
191190
; CHECKIFD-NEXT: ret
192191
;
193192
; RV32I-LABEL: fsgnjn_d:

llvm/test/CodeGen/RISCV/GlobalISel/float-arith.ll

+1-2
Original file line numberDiff line numberDiff line change
@@ -183,8 +183,7 @@ define float @fsgnjn_s(float %a, float %b) nounwind {
183183
; CHECKIF-LABEL: fsgnjn_s:
184184
; CHECKIF: # %bb.0:
185185
; CHECKIF-NEXT: fadd.s fa5, fa0, fa1
186-
; CHECKIF-NEXT: fneg.s fa5, fa5
187-
; CHECKIF-NEXT: fsgnj.s fa0, fa0, fa5
186+
; CHECKIF-NEXT: fsgnjn.s fa0, fa0, fa5
188187
; CHECKIF-NEXT: ret
189188
;
190189
; RV32I-LABEL: fsgnjn_s:

0 commit comments

Comments
 (0)