Skip to content

Commit cf3201c

Browse files
authored
[RISCV] Use X0_Pair for storing 0 using Zilsd. (#141847)
When we're creating a Zilsd store from a split i64 value, check if both inputs are 0 and use X0_Pair instead of a REG_SEQUENCE.
1 parent 6e3d668 commit cf3201c

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

llvm/test/CodeGen/RISCV/zilsd.ll

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,8 @@ entry:
110110
define void @store_g() nounwind {
111111
; CHECK-LABEL: store_g:
112112
; CHECK: # %bb.0: # %entyr
113-
; CHECK-NEXT: li a0, 0
114-
; CHECK-NEXT: lui a2, %hi(g)
115-
; CHECK-NEXT: li a1, 0
116-
; CHECK-NEXT: sd a0, %lo(g)(a2)
113+
; CHECK-NEXT: lui a0, %hi(g)
114+
; CHECK-NEXT: sd zero, %lo(g)(a0)
117115
; CHECK-NEXT: ret
118116
entyr:
119117
store i64 0, ptr @g

0 commit comments

Comments
 (0)