[llvm] [SelectionDAG] Add space-optimized forms of OPC_EmitRegister (PR #73291)
Wang Pengcheng via llvm-commits
llvm-commits at lists.llvm.org
Tue Dec 12 01:23:21 PST 2023
https://github.com/wangpc-pp updated https://github.com/llvm/llvm-project/pull/73291
>From 9216f54debeccc5647e9bffd50af07c0af67ea68 Mon Sep 17 00:00:00 2001
From: wangpc <wangpengcheng.pp at bytedance.com>
Date: Fri, 24 Nov 2023 15:06:04 +0800
Subject: [PATCH] [SelectionDAG] Add space-optimized forms of OPC_EmitRegister
The followed byte of `OPC_EmitRegister` is a MVT type, which is
usually i32 or i64.
We add `OPC_EmitRegisterI32` and `OPC_EmitRegisterI64` so that we
can reduce one byte.
Overall this reduces the llc binary size with all in-tree targets by
about 10K.
---
llvm/include/llvm/CodeGen/SelectionDAGISel.h | 2 ++
.../CodeGen/SelectionDAG/SelectionDAGISel.cpp | 22 ++++++++++---
llvm/utils/TableGen/DAGISelMatcherEmitter.cpp | 33 ++++++++++++-------
3 files changed, 41 insertions(+), 16 deletions(-)
diff --git a/llvm/include/llvm/CodeGen/SelectionDAGISel.h b/llvm/include/llvm/CodeGen/SelectionDAGISel.h
index 8a0e790bd170b2..2f3d70878af8ec 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAGISel.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAGISel.h
@@ -195,6 +195,8 @@ class SelectionDAGISel : public MachineFunctionPass {
// Space-optimized forms that implicitly encode integer VT.
OPC_EmitStringInteger32,
OPC_EmitRegister,
+ OPC_EmitRegisterI32,
+ OPC_EmitRegisterI64,
OPC_EmitRegister2,
OPC_EmitConvertToTarget,
OPC_EmitConvertToTarget0,
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 09d5a74688e433..1049c0ca7ab2d1 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -3520,12 +3520,24 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch,
CurDAG->getTargetConstant(Val, SDLoc(NodeToMatch), VT), nullptr));
continue;
}
- case OPC_EmitRegister: {
- MVT::SimpleValueType VT =
- static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
+ case OPC_EmitRegister:
+ case OPC_EmitRegisterI32:
+ case OPC_EmitRegisterI64: {
+ MVT::SimpleValueType VT;
+ switch (Opcode) {
+ case OPC_EmitRegisterI32:
+ VT = MVT::i32;
+ break;
+ case OPC_EmitRegisterI64:
+ VT = MVT::i64;
+ break;
+ default:
+ VT = static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
+ break;
+ }
unsigned RegNo = MatcherTable[MatcherIndex++];
- RecordedNodes.push_back(std::pair<SDValue, SDNode*>(
- CurDAG->getRegister(RegNo, VT), nullptr));
+ RecordedNodes.push_back(std::pair<SDValue, SDNode *>(
+ CurDAG->getRegister(RegNo, VT), nullptr));
continue;
}
case OPC_EmitRegister2: {
diff --git a/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp b/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
index c9ee071fd8d35f..e604ec4a5cdf1e 100644
--- a/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
+++ b/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
@@ -717,24 +717,35 @@ EmitMatcher(const Matcher *N, const unsigned Indent, unsigned CurrentIdx,
case Matcher::EmitRegister: {
const EmitRegisterMatcher *Matcher = cast<EmitRegisterMatcher>(N);
const CodeGenRegister *Reg = Matcher->getReg();
+ MVT::SimpleValueType VT = Matcher->getVT();
// If the enum value of the register is larger than one byte can handle,
// use EmitRegister2.
if (Reg && Reg->EnumValue > 255) {
- OS << "OPC_EmitRegister2, " << getEnumName(Matcher->getVT()) << ", ";
+ OS << "OPC_EmitRegister2, " << getEnumName(VT) << ", ";
OS << "TARGET_VAL(" << getQualifiedName(Reg->TheDef) << "),\n";
return 4;
+ }
+ unsigned OpBytes;
+ switch (VT) {
+ case MVT::i32:
+ case MVT::i64:
+ OpBytes = 1;
+ OS << "OPC_EmitRegisterI" << MVT(VT).getSizeInBits() << ", ";
+ break;
+ default:
+ OpBytes = 2;
+ OS << "OPC_EmitRegister, " << getEnumName(VT) << ", ";
+ break;
+ }
+ if (Reg) {
+ OS << getQualifiedName(Reg->TheDef) << ",\n";
} else {
- OS << "OPC_EmitRegister, " << getEnumName(Matcher->getVT()) << ", ";
- if (Reg) {
- OS << getQualifiedName(Reg->TheDef) << ",\n";
- } else {
- OS << "0 ";
- if (!OmitComments)
- OS << "/*zero_reg*/";
- OS << ",\n";
- }
- return 3;
+ OS << "0 ";
+ if (!OmitComments)
+ OS << "/*zero_reg*/";
+ OS << ",\n";
}
+ return OpBytes + 1;
}
case Matcher::EmitConvertToTarget: {
More information about the llvm-commits
mailing list