Skip to content

Commit 2f3b738

Browse files
committed
[RISCV] Add optimizations for FMV_X_ANYEXTH similar to FMV_X_ANYEXTW_RV64.
This enables the fneg and fabs combines we have for FMV_X_ANYEXTW_RV64.
1 parent 6606936 commit 2f3b738

File tree

2 files changed

+26
-23
lines changed

2 files changed

+26
-23
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6103,14 +6103,19 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
61036103

61046104
break;
61056105
}
6106+
case RISCVISD::FMV_X_ANYEXTH:
61066107
case RISCVISD::FMV_X_ANYEXTW_RV64: {
61076108
SDLoc DL(N);
61086109
SDValue Op0 = N->getOperand(0);
6110+
MVT VT = N->getSimpleValueType(0);
61096111
// If the input to FMV_X_ANYEXTW_RV64 is just FMV_W_X_RV64 then the
6110-
// conversion is unnecessary and can be replaced with an ANY_EXTEND
6111-
// of the FMV_W_X_RV64 operand.
6112-
if (Op0->getOpcode() == RISCVISD::FMV_W_X_RV64) {
6113-
assert(Op0.getOperand(0).getValueType() == MVT::i64 &&
6112+
// conversion is unnecessary and can be replaced with the FMV_W_X_RV64
6113+
// operand. Similar for FMV_X_ANYEXTH and FMV_H_X.
6114+
if ((N->getOpcode() == RISCVISD::FMV_X_ANYEXTW_RV64 &&
6115+
Op0->getOpcode() == RISCVISD::FMV_W_X_RV64) ||
6116+
(N->getOpcode() == RISCVISD::FMV_X_ANYEXTH &&
6117+
Op0->getOpcode() == RISCVISD::FMV_H_X)) {
6118+
assert(Op0.getOperand(0).getValueType() == VT &&
61146119
"Unexpected value type!");
61156120
return Op0.getOperand(0);
61166121
}
@@ -6122,16 +6127,16 @@ SDValue RISCVTargetLowering::PerformDAGCombine(SDNode *N,
61226127
if (!(Op0.getOpcode() == ISD::FNEG || Op0.getOpcode() == ISD::FABS) ||
61236128
!Op0.getNode()->hasOneUse())
61246129
break;
6125-
SDValue NewFMV = DAG.getNode(RISCVISD::FMV_X_ANYEXTW_RV64, DL, MVT::i64,
6126-
Op0.getOperand(0));
6127-
APInt SignBit = APInt::getSignMask(32).sext(64);
6130+
SDValue NewFMV = DAG.getNode(N->getOpcode(), DL, VT, Op0.getOperand(0));
6131+
unsigned FPBits = N->getOpcode() == RISCVISD::FMV_X_ANYEXTW_RV64 ? 32 : 16;
6132+
APInt SignBit = APInt::getSignMask(FPBits).sextOrSelf(VT.getSizeInBits());
61286133
if (Op0.getOpcode() == ISD::FNEG)
6129-
return DAG.getNode(ISD::XOR, DL, MVT::i64, NewFMV,
6130-
DAG.getConstant(SignBit, DL, MVT::i64));
6134+
return DAG.getNode(ISD::XOR, DL, VT, NewFMV,
6135+
DAG.getConstant(SignBit, DL, VT));
61316136

61326137
assert(Op0.getOpcode() == ISD::FABS);
6133-
return DAG.getNode(ISD::AND, DL, MVT::i64, NewFMV,
6134-
DAG.getConstant(~SignBit, DL, MVT::i64));
6138+
return DAG.getNode(ISD::AND, DL, VT, NewFMV,
6139+
DAG.getConstant(~SignBit, DL, VT));
61356140
}
61366141
case ISD::AND:
61376142
return performANDCombine(N, DCI, Subtarget);

llvm/test/CodeGen/RISCV/half-bitmanip-dagcombines.ll

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,8 @@ define half @fneg(half %a) nounwind {
2323
;
2424
; RV32IZFH-LABEL: fneg:
2525
; RV32IZFH: # %bb.0:
26-
; RV32IZFH-NEXT: fmv.h.x ft0, a0
27-
; RV32IZFH-NEXT: fneg.h ft0, ft0
28-
; RV32IZFH-NEXT: fmv.x.h a0, ft0
26+
; RV32IZFH-NEXT: lui a1, 1048568
27+
; RV32IZFH-NEXT: xor a0, a0, a1
2928
; RV32IZFH-NEXT: ret
3029
;
3130
; RV64I-LABEL: fneg:
@@ -36,9 +35,8 @@ define half @fneg(half %a) nounwind {
3635
;
3736
; RV64IZFH-LABEL: fneg:
3837
; RV64IZFH: # %bb.0:
39-
; RV64IZFH-NEXT: fmv.h.x ft0, a0
40-
; RV64IZFH-NEXT: fneg.h ft0, ft0
41-
; RV64IZFH-NEXT: fmv.x.h a0, ft0
38+
; RV64IZFH-NEXT: lui a1, 1048568
39+
; RV64IZFH-NEXT: xor a0, a0, a1
4240
; RV64IZFH-NEXT: ret
4341
%1 = fneg half %a
4442
ret half %1
@@ -56,9 +54,9 @@ define half @fabs(half %a) nounwind {
5654
;
5755
; RV32IZFH-LABEL: fabs:
5856
; RV32IZFH: # %bb.0:
59-
; RV32IZFH-NEXT: fmv.h.x ft0, a0
60-
; RV32IZFH-NEXT: fabs.h ft0, ft0
61-
; RV32IZFH-NEXT: fmv.x.h a0, ft0
57+
; RV32IZFH-NEXT: lui a1, 8
58+
; RV32IZFH-NEXT: addi a1, a1, -1
59+
; RV32IZFH-NEXT: and a0, a0, a1
6260
; RV32IZFH-NEXT: ret
6361
;
6462
; RV64I-LABEL: fabs:
@@ -70,9 +68,9 @@ define half @fabs(half %a) nounwind {
7068
;
7169
; RV64IZFH-LABEL: fabs:
7270
; RV64IZFH: # %bb.0:
73-
; RV64IZFH-NEXT: fmv.h.x ft0, a0
74-
; RV64IZFH-NEXT: fabs.h ft0, ft0
75-
; RV64IZFH-NEXT: fmv.x.h a0, ft0
71+
; RV64IZFH-NEXT: lui a1, 8
72+
; RV64IZFH-NEXT: addiw a1, a1, -1
73+
; RV64IZFH-NEXT: and a0, a0, a1
7674
; RV64IZFH-NEXT: ret
7775
%1 = call half @llvm.fabs.f16(half %a)
7876
ret half %1

0 commit comments

Comments
 (0)