@@ -1489,6 +1489,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
14891489 ISD::INTRINSIC_WO_CHAIN, ISD::ADD, ISD::SUB, ISD::MUL,
14901490 ISD::AND, ISD::OR, ISD::XOR, ISD::SETCC, ISD::SELECT});
14911491 setTargetDAGCombine(ISD::SRA);
1492+ setTargetDAGCombine(ISD::SIGN_EXTEND_INREG);
14921493
14931494 if (Subtarget.hasStdExtFOrZfinx())
14941495 setTargetDAGCombine({ISD::FADD, ISD::FMAXNUM, ISD::FMINNUM, ISD::FMUL});
@@ -1502,8 +1503,7 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
15021503
15031504 if (Subtarget.hasStdExtZbkb())
15041505 setTargetDAGCombine(ISD::BITREVERSE);
1505- if (Subtarget.hasStdExtZfhminOrZhinxmin())
1506- setTargetDAGCombine(ISD::SIGN_EXTEND_INREG);
1506+
15071507 if (Subtarget.hasStdExtFOrZfinx())
15081508 setTargetDAGCombine({ISD::ZERO_EXTEND, ISD::FP_TO_SINT, ISD::FP_TO_UINT,
15091509 ISD::FP_TO_SINT_SAT, ISD::FP_TO_UINT_SAT});
@@ -14456,15 +14456,23 @@ performSIGN_EXTEND_INREGCombine(SDNode *N, SelectionDAG &DAG,
1445614456 const RISCVSubtarget &Subtarget) {
1445714457 SDValue Src = N->getOperand(0);
1445814458 EVT VT = N->getValueType(0);
14459+ EVT SrcVT = cast<VTSDNode>(N->getOperand(1))->getVT();
14460+ unsigned Opc = Src.getOpcode();
1445914461
1446014462 // Fold (sext_inreg (fmv_x_anyexth X), i16) -> (fmv_x_signexth X)
1446114463 // Don't do this with Zhinx. We need to explicitly sign extend the GPR.
14462- if (Src.getOpcode() == RISCVISD::FMV_X_ANYEXTH &&
14463- cast<VTSDNode>(N->getOperand(1))->getVT().bitsGE(MVT::i16) &&
14464+ if (Opc == RISCVISD::FMV_X_ANYEXTH && SrcVT.bitsGE(MVT::i16) &&
1446414465 Subtarget.hasStdExtZfhmin())
1446514466 return DAG.getNode(RISCVISD::FMV_X_SIGNEXTH, SDLoc(N), VT,
1446614467 Src.getOperand(0));
1446714468
14469+ // Fold (sext_inreg (shl X, Y), i32) -> (sllw X, Y) iff Y u< 32
14470+ if (Opc == ISD::SHL && Subtarget.is64Bit() && SrcVT == MVT::i32 &&
14471+ VT == MVT::i64 && !isa<ConstantSDNode>(Src.getOperand(1)) &&
14472+ DAG.computeKnownBits(Src.getOperand(1)).countMaxActiveBits() <= 5)
14473+ return DAG.getNode(RISCVISD::SLLW, SDLoc(N), VT, Src.getOperand(0),
14474+ Src.getOperand(1));
14475+
1446814476 return SDValue();
1446914477}
1447014478
0 commit comments