Skip to content

Commit 2e6c01b

Browse files
authored
[SelectionDAG] Add instantiated OPC_EmitInteger and OPC_EmitStringInteger (#73241)
These two opcodes are used to be followed by a MVT operand, which is always one of i8/i16/i32/i64. We add instantiated `OPC_EmitInteger` and `OPC_EmitStringInteger` with i8/i16/i32/i64 so that we can reduce one byte. We reserve `OPC_EmitInteger` and `OPC_EmitStringInteger` in case that we may need them someday, though I haven't found one usage after this change. Overall this reduces the llc binary size with all in-tree targets by about 200K.
1 parent 282201d commit 2e6c01b

File tree

6 files changed

+74
-23
lines changed

6 files changed

+74
-23
lines changed

llvm/include/llvm/CodeGen/SelectionDAGISel.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,14 @@ class SelectionDAGISel : public MachineFunctionPass {
183183
OPC_CheckFoldableChainNode,
184184

185185
OPC_EmitInteger,
186+
// Space-optimized forms that implicitly encode integer VT.
187+
OPC_EmitInteger8,
188+
OPC_EmitInteger16,
189+
OPC_EmitInteger32,
190+
OPC_EmitInteger64,
186191
OPC_EmitStringInteger,
192+
// Space-optimized forms that implicitly encode integer VT.
193+
OPC_EmitStringInteger32,
187194
OPC_EmitRegister,
188195
OPC_EmitRegister2,
189196
OPC_EmitConvertToTarget,

llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3452,17 +3452,38 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch,
34523452
continue;
34533453
}
34543454
case OPC_EmitInteger:
3455-
case OPC_EmitStringInteger: {
3456-
MVT::SimpleValueType VT =
3457-
(MVT::SimpleValueType)MatcherTable[MatcherIndex++];
3455+
case OPC_EmitInteger8:
3456+
case OPC_EmitInteger16:
3457+
case OPC_EmitInteger32:
3458+
case OPC_EmitInteger64:
3459+
case OPC_EmitStringInteger:
3460+
case OPC_EmitStringInteger32: {
3461+
MVT::SimpleValueType VT;
3462+
switch (Opcode) {
3463+
case OPC_EmitInteger8:
3464+
VT = MVT::i8;
3465+
break;
3466+
case OPC_EmitInteger16:
3467+
VT = MVT::i16;
3468+
break;
3469+
case OPC_EmitInteger32:
3470+
case OPC_EmitStringInteger32:
3471+
VT = MVT::i32;
3472+
break;
3473+
case OPC_EmitInteger64:
3474+
VT = MVT::i64;
3475+
break;
3476+
default:
3477+
VT = (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
3478+
break;
3479+
}
34583480
int64_t Val = MatcherTable[MatcherIndex++];
34593481
if (Val & 128)
34603482
Val = GetVBR(Val, MatcherTable, MatcherIndex);
3461-
if (Opcode == OPC_EmitInteger)
3483+
if (Opcode >= OPC_EmitInteger && Opcode <= OPC_EmitInteger64)
34623484
Val = decodeSignRotatedValue(Val);
3463-
RecordedNodes.push_back(std::pair<SDValue, SDNode*>(
3464-
CurDAG->getTargetConstant(Val, SDLoc(NodeToMatch),
3465-
VT), nullptr));
3485+
RecordedNodes.push_back(std::pair<SDValue, SDNode *>(
3486+
CurDAG->getTargetConstant(Val, SDLoc(NodeToMatch), VT), nullptr));
34663487
continue;
34673488
}
34683489
case OPC_EmitRegister: {

llvm/test/TableGen/DAGDefaultOps.td

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,20 +76,20 @@ def MulIRRPat : Pat<(mul i32:$x, i32:$y), (MulIRR Reg:$x, Reg:$y)>;
7676
// ADD: SwitchOpcode{{.*}}TARGET_VAL(ISD::ADD)
7777
// ADD-NEXT: OPC_RecordChild0
7878
// ADD-NEXT: OPC_RecordChild1
79-
// ADD-NEXT: OPC_EmitInteger, MVT::i32, 0
79+
// ADD-NEXT: OPC_EmitInteger32, 0
8080
// ADD-NEXT: OPC_MorphNodeTo1, TARGET_VAL(::AddRRI)
8181

8282
// ADDINT: SwitchOpcode{{.*}}TARGET_VAL(ISD::INTRINSIC_WO_CHAIN)
8383
// ADDINT-NEXT: OPC_CheckChild0Integer
8484
// ADDINT-NEXT: OPC_RecordChild1
8585
// ADDINT-NEXT: OPC_RecordChild2
86-
// ADDINT-NEXT: OPC_EmitInteger, MVT::i32, 2
86+
// ADDINT-NEXT: OPC_EmitInteger32, 2
8787
// ADDINT-NEXT: OPC_MorphNodeTo1, TARGET_VAL(::AddRRI)
8888

8989
// SUB: SwitchOpcode{{.*}}TARGET_VAL(ISD::SUB)
9090
// SUB-NEXT: OPC_RecordChild0
9191
// SUB-NEXT: OPC_RecordChild1
92-
// SUB-NEXT: OPC_EmitInteger, MVT::i32, 0
92+
// SUB-NEXT: OPC_EmitInteger32, 0
9393
// SUB-NEXT: OPC_MorphNodeTo1, TARGET_VAL(::SubRRI)
9494

9595
// MULINT: SwitchOpcode{{.*}}TARGET_VAL(ISD::INTRINSIC_W_CHAIN)
@@ -102,7 +102,7 @@ def MulIRRPat : Pat<(mul i32:$x, i32:$y), (MulIRR Reg:$x, Reg:$y)>;
102102
// MULINT-NEXT: OPC_MorphNodeTo1, TARGET_VAL(::MulRRI)
103103

104104
// MUL: SwitchOpcode{{.*}}TARGET_VAL(ISD::MUL)
105-
// MUL-NEXT: OPC_EmitInteger, MVT::i32, 0
105+
// MUL-NEXT: OPC_EmitInteger32, 0
106106
// MUL-NEXT: OPC_RecordChild0
107107
// MUL-NEXT: OPC_RecordChild1
108108
// MUL-NEXT: OPC_MorphNodeTo1, TARGET_VAL(::MulRRI)

llvm/test/TableGen/dag-isel-regclass-emit-enum.td

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ def GPRAbove127 : RegisterClass<"TestTarget", [i32], 32,
2323

2424
// CHECK: OPC_CheckOpcode, TARGET_VAL(ISD::ADD),
2525
// CHECK-NEXT: OPC_RecordChild0, // #0 = $src
26-
// CHECK-NEXT: OPC_Scope, 14, /*->20*/ // 2 children in Scope
26+
// CHECK-NEXT: OPC_Scope, 13, /*->19*/ // 2 children in Scope
2727
// CHECK-NEXT: OPC_CheckChild1Integer, 0,
28-
// CHECK-NEXT: OPC_EmitInteger, MVT::i32, 0|128,2/*256*/,
28+
// CHECK-NEXT: OPC_EmitInteger32, 0|128,2/*256*/,
2929
// CHECK-NEXT: OPC_MorphNodeTo1, TARGET_VAL(TargetOpcode::COPY_TO_REGCLASS), 0,
3030
// CHECK-NEXT: MVT::i32, 2/*#Ops*/, 1, 0,
3131
def : Pat<(i32 (add i32:$src, (i32 0))),
3232
(COPY_TO_REGCLASS GPRAbove127, GPR0:$src)>;
3333

3434
// CHECK: OPC_CheckChild1Integer, 2,
35-
// CHECK-NEXT: OPC_EmitStringInteger, MVT::i32, TestNamespace::GPR127RegClassID,
35+
// CHECK-NEXT: OPC_EmitStringInteger32, TestNamespace::GPR127RegClassID,
3636
// CHECK-NEXT: OPC_MorphNodeTo1, TARGET_VAL(TargetOpcode::COPY_TO_REGCLASS), 0,
3737
// CHECK-NEXT: MVT::i32, 2/*#Ops*/, 1, 0,
3838
def : Pat<(i32 (add i32:$src, (i32 1))),

llvm/test/TableGen/dag-isel-subregs.td

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ include "reg-with-subregs-common.td"
44

55
// CHECK-LABEL: OPC_CheckOpcode, TARGET_VAL(ISD::EXTRACT_SUBVECTOR),
66
// CHECK: OPC_CheckChild1Integer, 0,
7-
// CHECK: OPC_EmitStringInteger, MVT::i32, sub0_sub1,
7+
// CHECK: OPC_EmitStringInteger32, sub0_sub1,
88
def : Pat<(v2i32 (extract_subvector v32i32:$src, (i32 0))),
99
(EXTRACT_SUBREG GPR_1024:$src, sub0_sub1)>;
1010

1111
// CHECK: OPC_CheckChild1Integer, 30,
12-
// CHECK: OPC_EmitInteger, MVT::i32, 10|128,2/*266*/,
12+
// CHECK: OPC_EmitInteger32, 10|128,2/*266*/,
1313
def : Pat<(v2i32 (extract_subvector v32i32:$src, (i32 15))),
1414
(EXTRACT_SUBREG GPR_1024:$src, sub30_sub31)>;

llvm/utils/TableGen/DAGISelMatcherEmitter.cpp

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -669,19 +669,42 @@ EmitMatcher(const Matcher *N, const unsigned Indent, unsigned CurrentIdx,
669669

670670
case Matcher::EmitInteger: {
671671
int64_t Val = cast<EmitIntegerMatcher>(N)->getValue();
672-
OS << "OPC_EmitInteger, "
673-
<< getEnumName(cast<EmitIntegerMatcher>(N)->getVT()) << ", ";
674-
unsigned Bytes = 2 + EmitSignedVBRValue(Val, OS);
672+
MVT::SimpleValueType VT = cast<EmitIntegerMatcher>(N)->getVT();
673+
unsigned OpBytes;
674+
switch (VT) {
675+
case MVT::i8:
676+
case MVT::i16:
677+
case MVT::i32:
678+
case MVT::i64:
679+
OpBytes = 1;
680+
OS << "OPC_EmitInteger" << MVT(VT).getScalarSizeInBits() << ", ";
681+
break;
682+
default:
683+
OpBytes = 2;
684+
OS << "OPC_EmitInteger, " << getEnumName(VT) << ", ";
685+
break;
686+
}
687+
unsigned Bytes = OpBytes + EmitSignedVBRValue(Val, OS);
675688
OS << '\n';
676689
return Bytes;
677690
}
678691
case Matcher::EmitStringInteger: {
679692
const std::string &Val = cast<EmitStringIntegerMatcher>(N)->getValue();
693+
MVT::SimpleValueType VT = cast<EmitStringIntegerMatcher>(N)->getVT();
680694
// These should always fit into 7 bits.
681-
OS << "OPC_EmitStringInteger, "
682-
<< getEnumName(cast<EmitStringIntegerMatcher>(N)->getVT()) << ", " << Val
683-
<< ",\n";
684-
return 3;
695+
unsigned OpBytes;
696+
switch (VT) {
697+
case MVT::i32:
698+
OpBytes = 1;
699+
OS << "OPC_EmitStringInteger" << MVT(VT).getScalarSizeInBits() << ", ";
700+
break;
701+
default:
702+
OpBytes = 2;
703+
OS << "OPC_EmitStringInteger, " << getEnumName(VT) << ", ";
704+
break;
705+
}
706+
OS << Val << ",\n";
707+
return OpBytes + 1;
685708
}
686709

687710
case Matcher::EmitRegister: {

0 commit comments

Comments
 (0)