Skip to content

Commit 6111f5c

Browse files
authored
[SelectionDAG] Add instantiated OPC_CheckChildType (#73297)
The most common type is i32 or i64 so we add `OPC_CheckChildTypeI32` and `OPC_CheckChildTypeI64` to save one byte. Overall this reduces the llc binary size with all in-tree targets by about 70K.
1 parent 117d083 commit 6111f5c

File tree

3 files changed

+106
-17
lines changed

3 files changed

+106
-17
lines changed

llvm/include/llvm/CodeGen/SelectionDAGISel.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,25 @@ class SelectionDAGISel : public MachineFunctionPass {
169169
OPC_CheckChild5Type,
170170
OPC_CheckChild6Type,
171171
OPC_CheckChild7Type,
172+
173+
OPC_CheckChild0TypeI32,
174+
OPC_CheckChild1TypeI32,
175+
OPC_CheckChild2TypeI32,
176+
OPC_CheckChild3TypeI32,
177+
OPC_CheckChild4TypeI32,
178+
OPC_CheckChild5TypeI32,
179+
OPC_CheckChild6TypeI32,
180+
OPC_CheckChild7TypeI32,
181+
182+
OPC_CheckChild0TypeI64,
183+
OPC_CheckChild1TypeI64,
184+
OPC_CheckChild2TypeI64,
185+
OPC_CheckChild3TypeI64,
186+
OPC_CheckChild4TypeI64,
187+
OPC_CheckChild5TypeI64,
188+
OPC_CheckChild6TypeI64,
189+
OPC_CheckChild7TypeI64,
190+
172191
OPC_CheckInteger,
173192
OPC_CheckChild0Integer,
174193
OPC_CheckChild1Integer,

llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2885,11 +2885,39 @@ static unsigned IsPredicateKnownToFail(const unsigned char *Table,
28852885
case SelectionDAGISel::OPC_CheckChild4Type:
28862886
case SelectionDAGISel::OPC_CheckChild5Type:
28872887
case SelectionDAGISel::OPC_CheckChild6Type:
2888-
case SelectionDAGISel::OPC_CheckChild7Type: {
2889-
Result =
2890-
!::CheckChildType(static_cast<MVT::SimpleValueType>(Table[Index++]), N,
2891-
SDISel.TLI, SDISel.CurDAG->getDataLayout(),
2892-
Opcode - SelectionDAGISel::OPC_CheckChild0Type);
2888+
case SelectionDAGISel::OPC_CheckChild7Type:
2889+
case SelectionDAGISel::OPC_CheckChild0TypeI32:
2890+
case SelectionDAGISel::OPC_CheckChild1TypeI32:
2891+
case SelectionDAGISel::OPC_CheckChild2TypeI32:
2892+
case SelectionDAGISel::OPC_CheckChild3TypeI32:
2893+
case SelectionDAGISel::OPC_CheckChild4TypeI32:
2894+
case SelectionDAGISel::OPC_CheckChild5TypeI32:
2895+
case SelectionDAGISel::OPC_CheckChild6TypeI32:
2896+
case SelectionDAGISel::OPC_CheckChild7TypeI32:
2897+
case SelectionDAGISel::OPC_CheckChild0TypeI64:
2898+
case SelectionDAGISel::OPC_CheckChild1TypeI64:
2899+
case SelectionDAGISel::OPC_CheckChild2TypeI64:
2900+
case SelectionDAGISel::OPC_CheckChild3TypeI64:
2901+
case SelectionDAGISel::OPC_CheckChild4TypeI64:
2902+
case SelectionDAGISel::OPC_CheckChild5TypeI64:
2903+
case SelectionDAGISel::OPC_CheckChild6TypeI64:
2904+
case SelectionDAGISel::OPC_CheckChild7TypeI64: {
2905+
MVT::SimpleValueType VT;
2906+
unsigned ChildNo;
2907+
if (Opcode >= SelectionDAGISel::OPC_CheckChild0TypeI32 &&
2908+
Opcode <= SelectionDAGISel::OPC_CheckChild7TypeI32) {
2909+
VT = MVT::i32;
2910+
ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0TypeI32;
2911+
} else if (Opcode >= SelectionDAGISel::OPC_CheckChild0TypeI64 &&
2912+
Opcode <= SelectionDAGISel::OPC_CheckChild7TypeI64) {
2913+
VT = MVT::i64;
2914+
ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0TypeI64;
2915+
} else {
2916+
VT = static_cast<MVT::SimpleValueType>(Table[Index++]);
2917+
ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0Type;
2918+
}
2919+
Result = !::CheckChildType(VT, N, SDISel.TLI,
2920+
SDISel.CurDAG->getDataLayout(), ChildNo);
28932921
return Index;
28942922
}
28952923
case SelectionDAGISel::OPC_CheckCondCode:
@@ -3412,15 +3440,48 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch,
34123440
<< '\n');
34133441
continue;
34143442
}
3415-
case OPC_CheckChild0Type: case OPC_CheckChild1Type:
3416-
case OPC_CheckChild2Type: case OPC_CheckChild3Type:
3417-
case OPC_CheckChild4Type: case OPC_CheckChild5Type:
3418-
case OPC_CheckChild6Type: case OPC_CheckChild7Type:
3419-
if (!::CheckChildType(
3420-
static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]),
3421-
N, TLI, CurDAG->getDataLayout(), Opcode - OPC_CheckChild0Type))
3443+
case OPC_CheckChild0Type:
3444+
case OPC_CheckChild1Type:
3445+
case OPC_CheckChild2Type:
3446+
case OPC_CheckChild3Type:
3447+
case OPC_CheckChild4Type:
3448+
case OPC_CheckChild5Type:
3449+
case OPC_CheckChild6Type:
3450+
case OPC_CheckChild7Type:
3451+
case OPC_CheckChild0TypeI32:
3452+
case OPC_CheckChild1TypeI32:
3453+
case OPC_CheckChild2TypeI32:
3454+
case OPC_CheckChild3TypeI32:
3455+
case OPC_CheckChild4TypeI32:
3456+
case OPC_CheckChild5TypeI32:
3457+
case OPC_CheckChild6TypeI32:
3458+
case OPC_CheckChild7TypeI32:
3459+
case OPC_CheckChild0TypeI64:
3460+
case OPC_CheckChild1TypeI64:
3461+
case OPC_CheckChild2TypeI64:
3462+
case OPC_CheckChild3TypeI64:
3463+
case OPC_CheckChild4TypeI64:
3464+
case OPC_CheckChild5TypeI64:
3465+
case OPC_CheckChild6TypeI64:
3466+
case OPC_CheckChild7TypeI64: {
3467+
MVT::SimpleValueType VT;
3468+
unsigned ChildNo;
3469+
if (Opcode >= SelectionDAGISel::OPC_CheckChild0TypeI32 &&
3470+
Opcode <= SelectionDAGISel::OPC_CheckChild7TypeI32) {
3471+
VT = MVT::i32;
3472+
ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0TypeI32;
3473+
} else if (Opcode >= SelectionDAGISel::OPC_CheckChild0TypeI64 &&
3474+
Opcode <= SelectionDAGISel::OPC_CheckChild7TypeI64) {
3475+
VT = MVT::i64;
3476+
ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0TypeI64;
3477+
} else {
3478+
VT = static_cast<MVT::SimpleValueType>(MatcherTable[MatcherIndex++]);
3479+
ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0Type;
3480+
}
3481+
if (!::CheckChildType(VT, N, TLI, CurDAG->getDataLayout(), ChildNo))
34223482
break;
34233483
continue;
3484+
}
34243485
case OPC_CheckCondCode:
34253486
if (!::CheckCondCode(MatcherTable, MatcherIndex, N)) break;
34263487
continue;

llvm/utils/TableGen/DAGISelMatcherEmitter.cpp

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -593,11 +593,20 @@ EmitMatcher(const Matcher *N, const unsigned Indent, unsigned CurrentIdx,
593593
<< ", " << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n";
594594
return 3;
595595

596-
case Matcher::CheckChildType:
597-
OS << "OPC_CheckChild"
598-
<< cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, "
599-
<< getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n";
600-
return 2;
596+
case Matcher::CheckChildType: {
597+
MVT::SimpleValueType VT = cast<CheckChildTypeMatcher>(N)->getType();
598+
switch (VT) {
599+
case MVT::i32:
600+
case MVT::i64:
601+
OS << "OPC_CheckChild" << cast<CheckChildTypeMatcher>(N)->getChildNo()
602+
<< "TypeI" << MVT(VT).getScalarSizeInBits() << ",\n";
603+
return 1;
604+
default:
605+
OS << "OPC_CheckChild" << cast<CheckChildTypeMatcher>(N)->getChildNo()
606+
<< "Type, " << getEnumName(VT) << ",\n";
607+
return 2;
608+
}
609+
}
601610

602611
case Matcher::CheckInteger: {
603612
OS << "OPC_CheckInteger, ";

0 commit comments

Comments
 (0)