[llvm] [SelectionDAG] Add instantiated OPC_CheckChildType (PR #73297)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 24 00:38:14 PST 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-selectiondag
Author: Wang Pengcheng (wangpc-pp)
<details>
<summary>Changes</summary>
The most common type is i32 or i64 so we add `OPC_CheckChildTypeI32`
and `OPC_CheckTypeI64` to save one byte.
Overall this reduces the llc binary size with all in-tree targets by
about 70K.
This PR is stacked on #<!-- -->73283.
---
Full diff: https://github.com/llvm/llvm-project/pull/73297.diff
4 Files Affected:
- (modified) llvm/include/llvm/CodeGen/SelectionDAGISel.h (+22)
- (modified) llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp (+120-30)
- (modified) llvm/test/TableGen/dag-isel-complexpattern.td (+1-1)
- (modified) llvm/utils/TableGen/DAGISelMatcherEmitter.cpp (+24-8)
``````````diff
diff --git a/llvm/include/llvm/CodeGen/SelectionDAGISel.h b/llvm/include/llvm/CodeGen/SelectionDAGISel.h
index e6513eb6abc8749..b00ce1e33e971d4 100644
--- a/llvm/include/llvm/CodeGen/SelectionDAGISel.h
+++ b/llvm/include/llvm/CodeGen/SelectionDAGISel.h
@@ -156,6 +156,9 @@ class SelectionDAGISel : public MachineFunctionPass {
OPC_CheckOpcode,
OPC_SwitchOpcode,
OPC_CheckType,
+ // Space-optimized forms that implicitly encode VT.
+ OPC_CheckTypeI32,
+ OPC_CheckTypeI64,
OPC_CheckTypeRes,
OPC_SwitchType,
OPC_CheckChild0Type,
@@ -166,6 +169,25 @@ class SelectionDAGISel : public MachineFunctionPass {
OPC_CheckChild5Type,
OPC_CheckChild6Type,
OPC_CheckChild7Type,
+
+ OPC_CheckChild0TypeI32,
+ OPC_CheckChild1TypeI32,
+ OPC_CheckChild2TypeI32,
+ OPC_CheckChild3TypeI32,
+ OPC_CheckChild4TypeI32,
+ OPC_CheckChild5TypeI32,
+ OPC_CheckChild6TypeI32,
+ OPC_CheckChild7TypeI32,
+
+ OPC_CheckChild0TypeI64,
+ OPC_CheckChild1TypeI64,
+ OPC_CheckChild2TypeI64,
+ OPC_CheckChild3TypeI64,
+ OPC_CheckChild4TypeI64,
+ OPC_CheckChild5TypeI64,
+ OPC_CheckChild6TypeI64,
+ OPC_CheckChild7TypeI64,
+
OPC_CheckInteger,
OPC_CheckChild0Integer,
OPC_CheckChild1Integer,
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
index 7d9bebdca127224..51a208d6ce60d89 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp
@@ -2711,24 +2711,23 @@ CheckOpcode(const unsigned char *MatcherTable, unsigned &MatcherIndex,
return N->getOpcode() == Opc;
}
-LLVM_ATTRIBUTE_ALWAYS_INLINE static bool
-CheckType(const unsigned char *MatcherTable, unsigned &MatcherIndex, SDValue N,
- const TargetLowering *TLI, const DataLayout &DL) {
- MVT::SimpleValueType VT = (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
- if (N.getValueType() == VT) return true;
+LLVM_ATTRIBUTE_ALWAYS_INLINE static bool CheckType(MVT::SimpleValueType VT,
+ SDValue N,
+ const TargetLowering *TLI,
+ const DataLayout &DL) {
+ if (N.getValueType() == VT)
+ return true;
// Handle the case when VT is iPTR.
return VT == MVT::iPTR && N.getValueType() == TLI->getPointerTy(DL);
}
LLVM_ATTRIBUTE_ALWAYS_INLINE static bool
-CheckChildType(const unsigned char *MatcherTable, unsigned &MatcherIndex,
- SDValue N, const TargetLowering *TLI, const DataLayout &DL,
- unsigned ChildNo) {
+CheckChildType(MVT::SimpleValueType VT, SDValue N, const TargetLowering *TLI,
+ const DataLayout &DL, unsigned ChildNo) {
if (ChildNo >= N.getNumOperands())
- return false; // Match fails if out of range child #.
- return ::CheckType(MatcherTable, MatcherIndex, N.getOperand(ChildNo), TLI,
- DL);
+ return false; // Match fails if out of range child #.
+ return ::CheckType(VT, N.getOperand(ChildNo), TLI, DL);
}
LLVM_ATTRIBUTE_ALWAYS_INLINE static bool
@@ -2826,7 +2825,8 @@ static unsigned IsPredicateKnownToFail(const unsigned char *Table,
bool &Result,
const SelectionDAGISel &SDISel,
SmallVectorImpl<std::pair<SDValue, SDNode*>> &RecordedNodes) {
- switch (Table[Index++]) {
+ unsigned Opcode = Table[Index++];
+ switch (Opcode) {
default:
Result = false;
return Index-1; // Could not evaluate this predicate.
@@ -2853,13 +2853,27 @@ static unsigned IsPredicateKnownToFail(const unsigned char *Table,
Result = !::CheckOpcode(Table, Index, N.getNode());
return Index;
case SelectionDAGISel::OPC_CheckType:
- Result = !::CheckType(Table, Index, N, SDISel.TLI,
- SDISel.CurDAG->getDataLayout());
+ case SelectionDAGISel::OPC_CheckTypeI32:
+ case SelectionDAGISel::OPC_CheckTypeI64: {
+ MVT::SimpleValueType VT;
+ switch (Opcode) {
+ case SelectionDAGISel::OPC_CheckTypeI32:
+ VT = MVT::i32;
+ break;
+ case SelectionDAGISel::OPC_CheckTypeI64:
+ VT = MVT::i64;
+ break;
+ default:
+ VT = (MVT::SimpleValueType)Table[Index++];
+ break;
+ }
+ Result = !::CheckType(VT, N, SDISel.TLI, SDISel.CurDAG->getDataLayout());
return Index;
+ }
case SelectionDAGISel::OPC_CheckTypeRes: {
unsigned Res = Table[Index++];
- Result = !::CheckType(Table, Index, N.getValue(Res), SDISel.TLI,
- SDISel.CurDAG->getDataLayout());
+ Result = !::CheckType((MVT::SimpleValueType)Table[Index++], N.getValue(Res),
+ SDISel.TLI, SDISel.CurDAG->getDataLayout());
return Index;
}
case SelectionDAGISel::OPC_CheckChild0Type:
@@ -2870,10 +2884,40 @@ static unsigned IsPredicateKnownToFail(const unsigned char *Table,
case SelectionDAGISel::OPC_CheckChild5Type:
case SelectionDAGISel::OPC_CheckChild6Type:
case SelectionDAGISel::OPC_CheckChild7Type:
- Result = !::CheckChildType(
- Table, Index, N, SDISel.TLI, SDISel.CurDAG->getDataLayout(),
- Table[Index - 1] - SelectionDAGISel::OPC_CheckChild0Type);
+ case SelectionDAGISel::OPC_CheckChild0TypeI32:
+ case SelectionDAGISel::OPC_CheckChild1TypeI32:
+ case SelectionDAGISel::OPC_CheckChild2TypeI32:
+ case SelectionDAGISel::OPC_CheckChild3TypeI32:
+ case SelectionDAGISel::OPC_CheckChild4TypeI32:
+ case SelectionDAGISel::OPC_CheckChild5TypeI32:
+ case SelectionDAGISel::OPC_CheckChild6TypeI32:
+ case SelectionDAGISel::OPC_CheckChild7TypeI32:
+ case SelectionDAGISel::OPC_CheckChild0TypeI64:
+ case SelectionDAGISel::OPC_CheckChild1TypeI64:
+ case SelectionDAGISel::OPC_CheckChild2TypeI64:
+ case SelectionDAGISel::OPC_CheckChild3TypeI64:
+ case SelectionDAGISel::OPC_CheckChild4TypeI64:
+ case SelectionDAGISel::OPC_CheckChild5TypeI64:
+ case SelectionDAGISel::OPC_CheckChild6TypeI64:
+ case SelectionDAGISel::OPC_CheckChild7TypeI64: {
+ MVT::SimpleValueType VT;
+ unsigned ChildNo;
+ if (Opcode >= SelectionDAGISel::OPC_CheckChild0TypeI32 &&
+ Opcode <= SelectionDAGISel::OPC_CheckChild7TypeI32) {
+ VT = MVT::i32;
+ ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0TypeI32;
+ } else if (Opcode >= SelectionDAGISel::OPC_CheckChild0TypeI64 &&
+ Opcode <= SelectionDAGISel::OPC_CheckChild7TypeI64) {
+ VT = MVT::i64;
+ ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0TypeI64;
+ } else {
+ VT = (MVT::SimpleValueType)Table[Index++];
+ ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0Type;
+ }
+ Result = !::CheckChildType(VT, N, SDISel.TLI,
+ SDISel.CurDAG->getDataLayout(), ChildNo);
return Index;
+ }
case SelectionDAGISel::OPC_CheckCondCode:
Result = !::CheckCondCode(Table, Index, N);
return Index;
@@ -3302,15 +3346,28 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch,
continue;
case OPC_CheckType:
- if (!::CheckType(MatcherTable, MatcherIndex, N, TLI,
- CurDAG->getDataLayout()))
+ case OPC_CheckTypeI32:
+ case OPC_CheckTypeI64:
+ MVT::SimpleValueType VT;
+ switch (Opcode) {
+ case OPC_CheckTypeI32:
+ VT = MVT::i32;
+ break;
+ case OPC_CheckTypeI64:
+ VT = MVT::i64;
+ break;
+ default:
+ VT = (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
+ break;
+ }
+ if (!::CheckType(VT, N, TLI, CurDAG->getDataLayout()))
break;
continue;
case OPC_CheckTypeRes: {
unsigned Res = MatcherTable[MatcherIndex++];
- if (!::CheckType(MatcherTable, MatcherIndex, N.getValue(Res), TLI,
- CurDAG->getDataLayout()))
+ if (!::CheckType((MVT::SimpleValueType)MatcherTable[MatcherIndex++],
+ N.getValue(Res), TLI, CurDAG->getDataLayout()))
break;
continue;
}
@@ -3378,15 +3435,48 @@ void SelectionDAGISel::SelectCodeCommon(SDNode *NodeToMatch,
<< '\n');
continue;
}
- case OPC_CheckChild0Type: case OPC_CheckChild1Type:
- case OPC_CheckChild2Type: case OPC_CheckChild3Type:
- case OPC_CheckChild4Type: case OPC_CheckChild5Type:
- case OPC_CheckChild6Type: case OPC_CheckChild7Type:
- if (!::CheckChildType(MatcherTable, MatcherIndex, N, TLI,
- CurDAG->getDataLayout(),
- Opcode - OPC_CheckChild0Type))
+ case OPC_CheckChild0Type:
+ case OPC_CheckChild1Type:
+ case OPC_CheckChild2Type:
+ case OPC_CheckChild3Type:
+ case OPC_CheckChild4Type:
+ case OPC_CheckChild5Type:
+ case OPC_CheckChild6Type:
+ case OPC_CheckChild7Type:
+ case OPC_CheckChild0TypeI32:
+ case OPC_CheckChild1TypeI32:
+ case OPC_CheckChild2TypeI32:
+ case OPC_CheckChild3TypeI32:
+ case OPC_CheckChild4TypeI32:
+ case OPC_CheckChild5TypeI32:
+ case OPC_CheckChild6TypeI32:
+ case OPC_CheckChild7TypeI32:
+ case OPC_CheckChild0TypeI64:
+ case OPC_CheckChild1TypeI64:
+ case OPC_CheckChild2TypeI64:
+ case OPC_CheckChild3TypeI64:
+ case OPC_CheckChild4TypeI64:
+ case OPC_CheckChild5TypeI64:
+ case OPC_CheckChild6TypeI64:
+ case OPC_CheckChild7TypeI64: {
+ MVT::SimpleValueType VT;
+ unsigned ChildNo;
+ if (Opcode >= SelectionDAGISel::OPC_CheckChild0TypeI32 &&
+ Opcode <= SelectionDAGISel::OPC_CheckChild7TypeI32) {
+ VT = MVT::i32;
+ ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0TypeI32;
+ } else if (Opcode >= SelectionDAGISel::OPC_CheckChild0TypeI64 &&
+ Opcode <= SelectionDAGISel::OPC_CheckChild7TypeI64) {
+ VT = MVT::i64;
+ ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0TypeI64;
+ } else {
+ VT = (MVT::SimpleValueType)MatcherTable[MatcherIndex++];
+ ChildNo = Opcode - SelectionDAGISel::OPC_CheckChild0Type;
+ }
+ if (!::CheckChildType(VT, N, TLI, CurDAG->getDataLayout(), ChildNo))
break;
continue;
+ }
case OPC_CheckCondCode:
if (!::CheckCondCode(MatcherTable, MatcherIndex, N)) break;
continue;
diff --git a/llvm/test/TableGen/dag-isel-complexpattern.td b/llvm/test/TableGen/dag-isel-complexpattern.td
index 40fd03cc8839424..3d74e4e46dc41c6 100644
--- a/llvm/test/TableGen/dag-isel-complexpattern.td
+++ b/llvm/test/TableGen/dag-isel-complexpattern.td
@@ -21,7 +21,7 @@ def CP32 : ComplexPattern<i32, 0, "SelectCP32">;
// (CP32) still worked.
def INSTR : Instruction {
// CHECK-LABEL: OPC_CheckOpcode, TARGET_VAL(ISD::STORE)
-// CHECK: OPC_CheckType, MVT::i32
+// CHECK: OPC_CheckTypeI32
// CHECK: OPC_CheckComplexPat, /*CP*/0, /*#*/1, // SelectCP32:$
// CHECK: Src: (st (add:{ *:[i32] } (CP32:{ *:[i32] }), (CP32:{ *:[i32] })), i64:{ *:[i64] }:$addr)
let OutOperandList = (outs);
diff --git a/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp b/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
index 4a11991036efc11..9c814620dbcd28e 100644
--- a/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
+++ b/llvm/utils/TableGen/DAGISelMatcherEmitter.cpp
@@ -578,19 +578,35 @@ EmitMatcher(const Matcher *N, const unsigned Indent, unsigned CurrentIdx,
case Matcher::CheckType:
if (cast<CheckTypeMatcher>(N)->getResNo() == 0) {
- OS << "OPC_CheckType, "
- << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n";
- return 2;
+ MVT::SimpleValueType VT = cast<CheckTypeMatcher>(N)->getType();
+ switch (VT) {
+ case MVT::i32:
+ case MVT::i64:
+ OS << "OPC_CheckTypeI" << MVT(VT).getScalarSizeInBits() << ",\n";
+ return 1;
+ default:
+ OS << "OPC_CheckType, " << getEnumName(VT) << ",\n";
+ return 2;
+ }
}
OS << "OPC_CheckTypeRes, " << cast<CheckTypeMatcher>(N)->getResNo()
<< ", " << getEnumName(cast<CheckTypeMatcher>(N)->getType()) << ",\n";
return 3;
- case Matcher::CheckChildType:
- OS << "OPC_CheckChild"
- << cast<CheckChildTypeMatcher>(N)->getChildNo() << "Type, "
- << getEnumName(cast<CheckChildTypeMatcher>(N)->getType()) << ",\n";
- return 2;
+ case Matcher::CheckChildType: {
+ MVT::SimpleValueType VT = cast<CheckChildTypeMatcher>(N)->getType();
+ switch (VT) {
+ case MVT::i32:
+ case MVT::i64:
+ OS << "OPC_CheckChild" << cast<CheckChildTypeMatcher>(N)->getChildNo()
+ << "TypeI" << MVT(VT).getScalarSizeInBits() << ",\n";
+ return 1;
+ default:
+ OS << "OPC_CheckChild" << cast<CheckChildTypeMatcher>(N)->getChildNo()
+ << "Type, " << getEnumName(VT) << ",\n";
+ return 2;
+ }
+ }
case Matcher::CheckInteger: {
OS << "OPC_CheckInteger, ";
``````````
</details>
https://github.com/llvm/llvm-project/pull/73297
More information about the llvm-commits
mailing list