Skip to content

Commit 9348d43

Browse files
authored
[SelectionDAG] Add space-optimized forms of OPC_EmitRegister (#73291)
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.
1 parent 849c951 commit 9348d43

File tree

3 files changed

+41
-16
lines changed

3 files changed

+41
-16
lines changed

llvm/include/llvm/CodeGen/SelectionDAGISel.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ class SelectionDAGISel : public MachineFunctionPass {
223223
// Space-optimized forms that implicitly encode integer VT.
224224
OPC_EmitStringInteger32,
225225
OPC_EmitRegister,
226+
OPC_EmitRegisterI32,
227+
OPC_EmitRegisterI64,
226228
OPC_EmitRegister2,
227229
OPC_EmitConvertToTarget,
228230
OPC_EmitConvertToTarget0,

llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3612,12 +3612,24 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch,
36123612
CurDAG->getTargetConstant(Val, SDLoc(NodeToMatch), VT), nullptr));
36133613
continue;
36143614
}
3615-
case OPC_EmitRegister: {
3616-
MVT::SimpleValueType VT =
3617-
static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
3615+
case OPC_EmitRegister:
3616+
case OPC_EmitRegisterI32:
3617+
case OPC_EmitRegisterI64: {
3618+
MVT::SimpleValueType VT;
3619+
switch (Opcode) {
3620+
case OPC_EmitRegisterI32:
3621+
VT = MVT::i32;
3622+
break;
3623+
case OPC_EmitRegisterI64:
3624+
VT = MVT::i64;
3625+
break;
3626+
default:
3627+
VT = static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
3628+
break;
3629+
}
36183630
unsigned RegNo = MatcherTable[MatcherIndex++];
3619-
RecordedNodes.push_back(std::pair<SDValue, SDNode*>(
3620-
CurDAG->getRegister(RegNo, VT), nullptr));
3631+
RecordedNodes.push_back(std::pair<SDValue, SDNode *>(
3632+
CurDAG->getRegister(RegNo, VT), nullptr));
36213633
continue;
36223634
}
36233635
case OPC_EmitRegister2: {

llvm/utils/TableGen/DAGISelMatcherEmitter.cpp

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -737,24 +737,35 @@ EmitMatcher(const Matcher *N, const unsigned Indent, unsigned CurrentIdx,
737737
case Matcher::EmitRegister: {
738738
const EmitRegisterMatcher *Matcher = cast<EmitRegisterMatcher>(N);
739739
const CodeGenRegister *Reg = Matcher->getReg();
740+
MVT::SimpleValueType VT = Matcher->getVT();
740741
// If the enum value of the register is larger than one byte can handle,
741742
// use EmitRegister2.
742743
if (Reg && Reg->EnumValue > 255) {
743-
OS << "OPC_EmitRegister2, " << getEnumName(Matcher->getVT()) << ", ";
744+
OS << "OPC_EmitRegister2, " << getEnumName(VT) << ", ";
744745
OS << "TARGET_VAL(" << getQualifiedName(Reg->TheDef) << "),\n";
745746
return 4;
747+
}
748+
unsigned OpBytes;
749+
switch (VT) {
750+
case MVT::i32:
751+
case MVT::i64:
752+
OpBytes = 1;
753+
OS << "OPC_EmitRegisterI" << MVT(VT).getSizeInBits() << ", ";
754+
break;
755+
default:
756+
OpBytes = 2;
757+
OS << "OPC_EmitRegister, " << getEnumName(VT) << ", ";
758+
break;
759+
}
760+
if (Reg) {
761+
OS << getQualifiedName(Reg->TheDef) << ",\n";
746762
} else {
747-
OS << "OPC_EmitRegister, " << getEnumName(Matcher->getVT()) << ", ";
748-
if (Reg) {
749-
OS << getQualifiedName(Reg->TheDef) << ",\n";
750-
} else {
751-
OS << "0 ";
752-
if (!OmitComments)
753-
OS << "/*zero_reg*/";
754-
OS << ",\n";
755-
}
756-
return 3;
763+
OS << "0 ";
764+
if (!OmitComments)
765+
OS << "/*zero_reg*/";
766+
OS << ",\n";
757767
}
768+
return OpBytes + 1;
758769
}
759770

760771
case Matcher::EmitConvertToTarget: {

0 commit comments

Comments
 (0)