[llvm] [TableGen][GISel] Extract common function for determining MI's regclass (PR #120135)
Sergei Barannikov via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 16 12:18:23 PST 2024
================
@@ -1856,52 +1861,91 @@ GlobalISelEmitter::inferRegClassFromPattern(const TreePatternNode &N) {
// Don't want to try and infer things when there could potentially be more
// than one candidate register class.
- auto &Inst = Target.getInstruction(OpRec);
+ return inferRegClassFromInstructionPattern(N, /*ResIdx=*/0);
+}
+
+const CodeGenRegisterClass *
+GlobalISelEmitter::inferRegClassFromInstructionPattern(const TreePatternNode &N,
+ unsigned ResIdx) const {
+ const CodeGenInstruction &Inst = Target.getInstruction(N.getOperator());
+ assert(ResIdx < Inst.Operands.NumDefs &&
+ "Can only infer register class for explicit defs");
// Handle any special-case instructions which we can safely infer register
// classes from.
StringRef InstName = Inst.TheDef->getName();
- bool IsRegSequence = InstName == "REG_SEQUENCE";
- if (IsRegSequence || InstName == "COPY_TO_REGCLASS") {
- // If we have a COPY_TO_REGCLASS, then we need to handle it specially. It
- // has the desired register class as the first child.
- const TreePatternNode &RCChild = N.getChild(IsRegSequence ? 0 : 1);
+ if (InstName == "REG_SEQUENCE") {
+ // (outs $super_dst), (ins $dst_regclass, variable_ops)
+ // Destination register class is explicitly specified by the first operand.
+ const TreePatternNode &RCChild = N.getChild(0);
+ if (!RCChild.isLeaf())
+ return nullptr;
+ return getRegClassFromLeaf(RCChild);
+ }
+
+ if (InstName == "COPY_TO_REGCLASS") {
+ // (outs $dst), (ins $src, $dst_regclass)
+ // Destination register class is explicitly specified by the second operand.
+ const TreePatternNode &RCChild = N.getChild(1);
if (!RCChild.isLeaf())
return nullptr;
return getRegClassFromLeaf(RCChild);
}
+
if (InstName == "INSERT_SUBREG") {
+ // (outs $super_dst), (ins $super_src, $sub_src, $sub_idx);
+ // If we can infer the register class for the first operand, use that.
+ // Otherwise, find a register class that supports both the specified
+ // sub-register index and the type of the instruction's result.
const TreePatternNode &Child0 = N.getChild(0);
assert(Child0.getNumTypes() == 1 && "Unexpected number of types!");
- const TypeSetByHwMode &VTy = Child0.getExtType(0);
- return inferSuperRegisterClassForNode(VTy, Child0, N.getChild(2));
+ return inferSuperRegisterClassForNode(N.getExtType(0), Child0,
+ N.getChild(2));
}
+
if (InstName == "EXTRACT_SUBREG") {
- assert(N.getNumTypes() == 1 && "Unexpected number of types!");
----------------
s-barannikov wrote:
This was actually bugged, but wasn't covered by tests.
https://github.com/llvm/llvm-project/pull/120135
More information about the llvm-commits
mailing list