[llvm] [GlobalISel] Add GIM_CheckMachineOperandType for matching metadata operands (PR #191389)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 10 03:56:54 PDT 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-tablegen
Author: Sameer Sahasrabuddhe (ssahasra)
<details>
<summary>Changes</summary>
Add a new match table opcode GIM_CheckMachineOperandType and a corresponding MachineOperandTypeMatcher class to support matching operands by their MachineOperand type. This enables GlobalISel pattern matching for intrinsics that have metadata operands (MVT::Metadata), which previously could not be matched in the generated selector.
This is patch was extracted from #<!-- -->172090.
Co-authored-by: macurtis-amd <macurtis@<!-- -->amd.com>
Assisted-by: Claude Opus 4.6
---
Full diff: https://github.com/llvm/llvm-project/pull/191389.diff
4 Files Affected:
- (modified) llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h (+6)
- (modified) llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h (+9)
- (modified) llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp (+17)
- (modified) llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.h (+18)
``````````diff
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h b/llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h
index 3a2509345b776..f21923827039c 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutor.h
@@ -246,6 +246,12 @@ enum {
/// - SizeInBits(ULEB128) - The size of the pointer value in bits.
GIM_CheckPointerToAny,
+ /// Check the machine type of the specified operand
+ /// - InsnID(ULEB128) - Instruction ID
+ /// - OpIdx(ULEB128) - Operand index
+ /// - MachineOperandType(ULEB128) - Expected type
+ GIM_CheckMachineOperandType,
+
/// Check the register bank for the specified operand
/// - InsnID(ULEB128) - Instruction ID
/// - OpIdx(ULEB128) - Operand index
diff --git a/llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h b/llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h
index 8f6586e79d78a..3d6dd9e62f963 100644
--- a/llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h
+++ b/llvm/include/llvm/CodeGen/GlobalISel/GIMatchTableExecutorImpl.h
@@ -768,6 +768,15 @@ bool GIMatchTableExecutor::executeMatchTable(
break;
}
+ case GIM_CheckMachineOperandType: {
+ uint64_t InsnID = readULEB();
+ uint64_t OpIdx = readULEB();
+ uint64_t MOTy = readULEB();
+ MachineOperand &MO = State.MIs[InsnID]->getOperand(OpIdx);
+ if (MO.getType() != MOTy)
+ return false;
+ break;
+ }
case GIM_RecordNamedOperand: {
uint64_t InsnID = readULEB();
uint64_t OpIdx = readULEB();
diff --git a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp
index 1968097f91983..b642a5fe70d63 100644
--- a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp
+++ b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.cpp
@@ -1493,6 +1493,12 @@ Error OperandMatcher::addTypeCheckPredicate(const TypeSetByHwMode &VTy,
return Error::success();
}
+ llvm::MVT::SimpleValueType STy = VTy.getMachineValueType().SimpleTy;
+ if (STy == MVT::Metadata) {
+ addPredicate<MachineOperandTypeMatcher>(MachineOperand::MO_Metadata);
+ return Error::success();
+ }
+
auto OpTyOrNone = MVTToLLT(VTy.getMachineValueType().SimpleTy);
if (!OpTyOrNone)
return failUnsupported("unsupported type");
@@ -1958,6 +1964,17 @@ bool InstructionOperandMatcher::isHigherPriorityThan(
return false;
}
+//===- MachineOperandTypeMatcher -----------------------------------------===//
+
+void MachineOperandTypeMatcher::emitPredicateOpcodes(MatchTable &Table,
+ RuleMatcher &Rule) const {
+ Table << MatchTable::Opcode("GIM_CheckMachineOperandType")
+ << MatchTable::Comment("MI") << MatchTable::ULEB128Value(InsnVarID)
+ << MatchTable::Comment("Op") << MatchTable::ULEB128Value(OpIdx)
+ << MatchTable::Comment("Ty") << MatchTable::ULEB128Value(MOTy)
+ << MatchTable::LineBreak;
+}
+
//===- OperandRenderer ----------------------------------------------------===//
OperandRenderer::~OperandRenderer() = default;
diff --git a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.h b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.h
index 4749139049861..d58e7a603f651 100644
--- a/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.h
+++ b/llvm/utils/TableGen/Common/GlobalISel/GlobalISelMatchTable.h
@@ -23,6 +23,7 @@
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGenTypes/LowLevelType.h"
#include "llvm/Support/Error.h"
#include "llvm/Support/SaveAndRestore.h"
@@ -860,6 +861,7 @@ class PredicateMatcher {
OPM_MBB,
OPM_RecordNamedOperand,
OPM_RecordRegType,
+ OPM_MOType,
};
protected:
@@ -1963,6 +1965,22 @@ class InstructionOperandMatcher : public OperandPredicateMatcher {
}
};
+class MachineOperandTypeMatcher : public OperandPredicateMatcher {
+ const MachineOperand::MachineOperandType MOTy;
+
+public:
+ MachineOperandTypeMatcher(unsigned InsnVarID, unsigned OpIdx,
+ MachineOperand::MachineOperandType MOTy)
+ : OperandPredicateMatcher(OPM_MOType, InsnVarID, OpIdx), MOTy(MOTy) {}
+
+ static bool classof(const PredicateMatcher *P) {
+ return P->getKind() == OPM_MOType;
+ }
+
+ void emitPredicateOpcodes(MatchTable &Table,
+ RuleMatcher &Rule) const override;
+};
+
//===- Actions ------------------------------------------------------------===//
class OperandRenderer {
public:
``````````
</details>
https://github.com/llvm/llvm-project/pull/191389
More information about the llvm-commits
mailing list