Skip to content

Commit 1e174a7

Browse files
authored
[TableGen][GISel] Handle frameindex/tframeindex (#90475)
Support patterns like Pat<(p0 frameindex:$fi), (ADD tframeindex:$fi, 0)>; in the GlobalISel emitter in TableGen. Currently, using such a pattern results in an error message.
1 parent 6f02120 commit 1e174a7

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// RUN: llvm-tblgen -gen-global-isel -optimize-match-table=false -I %p/../../include -I %p/Common %s -o - < %s | FileCheck %s
2+
3+
include "llvm/Target/Target.td"
4+
include "GlobalISelEmitterCommon.td"
5+
6+
def ADD : I<(outs GPR32:$dst), (ins GPR32:$src1, GPR32:$src2), []>;
7+
8+
//===- Test a simple pattern with frame index operands. ----------------------===//
9+
//
10+
// CHECK: GIM_Try, /*On fail goto*//*Label [[LABEL_NUM:[0-9]+]]*/ GIMT_Encode4([[LABEL:[0-9]+]]),
11+
// CHECK-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,
12+
// CHECK-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_FRAME_INDEX),
13+
// CHECK-NEXT: // MIs[0] DstI[dst]
14+
// CHECK-NEXT: GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_p0s32,
15+
// CHECK-NEXT: GIM_RootCheckRegBankForClass, /*Op*/0, /*RC*/GIMT_Encode2(MyTarget::GPR32RegClassID),
16+
// CHECK-NEXT: // MIs[0] fi
17+
// CHECK-NEXT: // No operand predicates
18+
// CHECK-NEXT: // (frameindex:{ *:[i32] }):$fi => (ADD:{ *:[i32] } (tframeindex:{ *:[i32] }):$fi, 0:{ *:[i32] })
19+
// CHECK-NEXT: GIR_BuildRootMI, /*Opcode*/GIMT_Encode2(MyTarget::ADD),
20+
// CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/0, // DstI[dst]
21+
// CHECK-NEXT: GIR_RootToRootCopy, /*OpIdx*/1, // fi
22+
// CHECK-NEXT: GIR_AddImm8, /*InsnID*/0, /*Imm*/0,
23+
// CHECK-NEXT: GIR_RootConstrainSelectedInstOperands,
24+
// CHECK-NEXT: // GIR_Coverage, 0,
25+
// CHECK-NEXT: GIR_EraseRootFromParent_Done,
26+
// CHECK-NEXT: // Label [[LABEL_NUM]]: @[[LABEL]]
27+
// CHECK-NEXT: GIM_Reject,
28+
29+
def : Pat<(p0 frameindex:$fi), (ADD tframeindex:$fi, 0)>;

llvm/utils/TableGen/GlobalISelEmitter.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -834,6 +834,11 @@ Expected<InstructionMatcher &> GlobalISelEmitter::createAndImportSelDAGMatcher(
834834
return InsnMatcher;
835835
}
836836

837+
if (SrcGIOrNull->TheDef->getName() == "G_FRAME_INDEX") {
838+
InsnMatcher.addOperand(OpIdx++, Src.getName(), TempOpIdx);
839+
return InsnMatcher;
840+
}
841+
837842
// Special case because the operand order is changed from setcc. The
838843
// predicate operand needs to be swapped from the last operand to the first
839844
// source.
@@ -1223,6 +1228,10 @@ Expected<action_iterator> GlobalISelEmitter::importExplicitUseRenderer(
12231228
if (DstChild.getOperator()->getName() == "timm") {
12241229
DstMIBuilder.addRenderer<CopyRenderer>(DstChild.getName());
12251230
return InsertPt;
1231+
}
1232+
if (DstChild.getOperator()->getName() == "tframeindex") {
1233+
DstMIBuilder.addRenderer<CopyRenderer>(DstChild.getName());
1234+
return InsertPt;
12261235
} else if (DstChild.getOperator()->getName() == "imm") {
12271236
DstMIBuilder.addRenderer<CopyConstantAsImmRenderer>(DstChild.getName());
12281237
return InsertPt;

0 commit comments

Comments
 (0)