Skip to content

Commit 18ee0a9

Browse files
committed
Add memoperands
1 parent fd143e9 commit 18ee0a9

File tree

2 files changed

+19
-29
lines changed

2 files changed

+19
-29
lines changed

llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1851,6 +1851,7 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) {
18511851
SDValue Ops[] = {Node->getOperand(1), Node->getOperand(2),
18521852
Node->getOperand(3), Node->getOperand(4), Chain};
18531853
MachineSDNode *New = CurDAG->getMachineNode(RISCV::QC_SETWMI, DL, VTs, Ops);
1854+
CurDAG->setNodeMemRefs(New, {cast<MemSDNode>(Node)->getMemOperand()});
18541855
ReplaceNode(Node, New);
18551856
return;
18561857
}

llvm/lib/Target/RISCV/RISCVSelectionDAGInfo.cpp

Lines changed: 18 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -86,21 +86,24 @@ SDValue RISCVSelectionDAGInfo::EmitTargetCodeForMemset(
8686
return SDValue();
8787

8888
SmallVector<SDValue, 8> OutChains;
89-
SDValue SizeWords, OffsetSetwmi;
9089
SDValue SrcValueReplicated = DAG.getNode(ISD::ZERO_EXTEND, dl, MVT::i32, Src);
9190
int NumberOfWords = NumberOfBytesToWrite / 4;
91+
MachineFunction &MF = DAG.getMachineFunction();
9292

9393
// Helper for constructing the QC_SETWMI instruction
94-
auto getSetwmiNode = [&](SDValue SizeWords, SDValue OffsetSetwmi) -> SDValue {
95-
SDValue Ops[] = {Chain, SrcValueReplicated, Dst, SizeWords, OffsetSetwmi};
96-
return DAG.getNode(RISCVISD::QC_SETWMI, dl, MVT::Other, Ops);
94+
auto getSetwmiNode = [&](uint8_t SizeWords, uint8_t OffsetSetwmi) -> SDValue {
95+
SDValue Ops[] = {Chain, SrcValueReplicated, Dst,
96+
DAG.getTargetConstant(SizeWords, dl, MVT::i32),
97+
DAG.getTargetConstant(OffsetSetwmi, dl, MVT::i32)};
98+
MachineMemOperand *BaseMemOperand = MF.getMachineMemOperand(
99+
DstPtrInfo, MachineMemOperand::MOStore, SizeWords * 4, Align(4));
100+
return DAG.getMemIntrinsicNode(RISCVISD::QC_SETWMI, dl,
101+
DAG.getVTList(MVT::Other), Ops, MVT::i32,
102+
BaseMemOperand);
97103
};
98104

99-
bool IsZeroVal =
100-
isa<ConstantSDNode>(Src) && cast<ConstantSDNode>(Src)->isZero();
101-
102105
// If i8 type and constant non-zero value.
103-
if ((Src.getValueType() == MVT::i8) && !IsZeroVal)
106+
if ((Src.getValueType() == MVT::i8) && !isNullConstant(Src))
104107
// Replicate byte to word by multiplication with 0x01010101.
105108
SrcValueReplicated =
106109
DAG.getNode(ISD::MUL, dl, MVT::i32, SrcValueReplicated,
@@ -133,33 +136,19 @@ SDValue RISCVSelectionDAGInfo::EmitTargetCodeForMemset(
133136

134137
if (NumberOfWords <= 16) {
135138
// 1 - 16 words
136-
SizeWords = DAG.getTargetConstant(NumberOfWords, dl, MVT::i32);
137-
SDValue OffsetSetwmi = DAG.getTargetConstant(0, dl, MVT::i32);
138-
return getSetwmiNode(SizeWords, OffsetSetwmi);
139+
return getSetwmiNode(NumberOfWords, 0);
139140
}
140141

141142
if (NumberOfWords <= 32) {
142143
// 17 - 32 words
143-
SizeWords = DAG.getTargetConstant(NumberOfWords - 16, dl, MVT::i32);
144-
OffsetSetwmi = DAG.getTargetConstant(64, dl, MVT::i32);
145-
OutChains.push_back(getSetwmiNode(SizeWords, OffsetSetwmi));
146-
147-
SizeWords = DAG.getTargetConstant(16, dl, MVT::i32);
148-
OffsetSetwmi = DAG.getTargetConstant(0, dl, MVT::i32);
149-
OutChains.push_back(getSetwmiNode(SizeWords, OffsetSetwmi));
144+
OutChains.push_back(getSetwmiNode(NumberOfWords - 16, 64));
145+
OutChains.push_back(getSetwmiNode(16, 0));
150146
} else {
151147
// 33 - 47 words
152-
SizeWords = DAG.getTargetConstant(NumberOfWords - 31, dl, MVT::i32);
153-
OffsetSetwmi = DAG.getTargetConstant(124, dl, MVT::i32);
154-
OutChains.push_back(getSetwmiNode(SizeWords, OffsetSetwmi));
155-
156-
SizeWords = DAG.getTargetConstant(15, dl, MVT::i32);
157-
OffsetSetwmi = DAG.getTargetConstant(64, dl, MVT::i32);
158-
OutChains.push_back(getSetwmiNode(SizeWords, OffsetSetwmi));
159-
160-
SizeWords = DAG.getTargetConstant(16, dl, MVT::i32);
161-
OffsetSetwmi = DAG.getTargetConstant(0, dl, MVT::i32);
162-
OutChains.push_back(getSetwmiNode(SizeWords, OffsetSetwmi));
148+
OutChains.push_back(getSetwmiNode(NumberOfWords - 31, 124));
149+
OutChains.push_back(getSetwmiNode(15, 64));
150+
OutChains.push_back(getSetwmiNode(16, 0));
163151
}
152+
164153
return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, OutChains);
165154
}

0 commit comments

Comments
 (0)