@@ -1659,18 +1659,26 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
16591659 SDValue Addr = Node->getOperand (3 );
16601660 SelectAddrRegImm (Addr, Base, Offset);
16611661
1662- SDValue Ops[] = {
1663- CurDAG->getTargetConstant (RISCV::GPRPairRegClassID, DL, MVT::i32 ),
1664- Node->getOperand (1 ),
1665- CurDAG->getTargetConstant (RISCV::sub_gpr_even, DL, MVT::i32 ),
1666- Node->getOperand (2 ),
1667- CurDAG->getTargetConstant (RISCV::sub_gpr_odd, DL, MVT::i32 )};
1662+ SDValue Lo = Node->getOperand (1 );
1663+ SDValue Hi = Node->getOperand (2 );
1664+
1665+ SDValue RegPair;
1666+ // Peephole to use X0_Pair for storing zero.
1667+ if (isNullConstant (Lo) && isNullConstant (Hi)) {
1668+ RegPair = CurDAG->getRegister (RISCV::X0_Pair, MVT::Untyped);
1669+ } else {
1670+ SDValue Ops[] = {
1671+ CurDAG->getTargetConstant (RISCV::GPRPairRegClassID, DL, MVT::i32 ), Lo,
1672+ CurDAG->getTargetConstant (RISCV::sub_gpr_even, DL, MVT::i32 ), Hi,
1673+ CurDAG->getTargetConstant (RISCV::sub_gpr_odd, DL, MVT::i32 )};
1674+
1675+ RegPair = SDValue (CurDAG->getMachineNode (TargetOpcode::REG_SEQUENCE, DL,
1676+ MVT::Untyped, Ops),
1677+ 0 );
1678+ }
16681679
1669- SDNode *RegPair = CurDAG->getMachineNode (TargetOpcode::REG_SEQUENCE, DL,
1670- MVT::Untyped, Ops);
1671- MachineSDNode *New =
1672- CurDAG->getMachineNode (RISCV::SD_RV32, DL, MVT::Other,
1673- {SDValue (RegPair, 0 ), Base, Offset, Chain});
1680+ MachineSDNode *New = CurDAG->getMachineNode (RISCV::SD_RV32, DL, MVT::Other,
1681+ {RegPair, Base, Offset, Chain});
16741682 CurDAG->setNodeMemRefs (New, {cast<MemSDNode>(Node)->getMemOperand ()});
16751683 ReplaceUses (SDValue (Node, 0 ), SDValue (New, 0 ));
16761684 CurDAG->RemoveDeadNode (Node);
0 commit comments