@@ -1659,18 +1659,26 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
1659
1659
SDValue Addr = Node->getOperand (3 );
1660
1660
SelectAddrRegImm (Addr, Base, Offset);
1661
1661
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
+ }
1668
1679
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});
1674
1682
CurDAG->setNodeMemRefs (New, {cast<MemSDNode>(Node)->getMemOperand ()});
1675
1683
ReplaceUses (SDValue (Node, 0 ), SDValue (New, 0 ));
1676
1684
CurDAG->RemoveDeadNode (Node);
0 commit comments