[PATCH] D141247: [GlobalISelEmitter][WIP] handle operand without MVT/class
ChenZheng via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 14 01:12:15 PDT 2023
shchenz marked an inline comment as done.
shchenz added inline comments.
================
Comment at: llvm/utils/TableGen/GlobalISelEmitter.cpp:4594-4595
+
+ // Handle the case where the MVT/register class is omitted in the dest pattern
+ // but MVT exists in the source pattern.
+ if (isa<UnsetInit>(DstChild->getLeafValue())) {
----------------
arsenm wrote:
> shchenz wrote:
> > arsenm wrote:
> > > Where is the type check performed?
> > Do you mean check the type for the output pattern's operands? I am not familiar here, do we need type check for the output pattern operands? And the input operands type check should already be handled in previous logic. See the new introduced rule in the new tblgen case `GlobalISelEmitter-notypeoperand.ll`:
> >
> > ```
> > constexpr static int64_t MatchTable0[] = {
> > GIM_Try, /*On fail goto*//*Label 0*/ 74, // Rule ID 0 //
> > GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,
> > GIM_CheckOpcode, /*MI*/0, TargetOpcode::G_ANYEXT,
> > // MIs[0] dst
> > GIM_CheckType, /*MI*/0, /*Op*/0, /*Type*/GILLT_s32,
> > GIM_CheckRegBankForClass, /*MI*/0, /*Op*/0, /*RC*/MyTarget::GPR32RegClassID,
> > // MIs[0] in
> > GIM_CheckType, /*MI*/0, /*Op*/1, /*Type*/GILLT_s8,
> > // (anyext:{ *:[i32] } i8:{ *:[i8] }:$in) => (SELECT_I4:{ *:[i32] } ?:{ *:[i8] }:$in, (LI:{ *:[i32] } 1:{ *:[i32] }), (LI:{ *:[i32] } 0:{ *:[i32] }))
> > GIR_MakeTempReg, /*TempRegID*/0, /*TypeID*/GILLT_s32,
> > GIR_MakeTempReg, /*TempRegID*/1, /*TypeID*/GILLT_s32,
> > GIR_BuildMI, /*InsnID*/2, /*Opcode*/MyTarget::LI,
> > GIR_AddTempRegister, /*InsnID*/2, /*TempRegID*/1, /*TempRegFlags*/RegState::Define,
> > GIR_AddImm, /*InsnID*/2, /*Imm*/0,
> > GIR_ConstrainSelectedInstOperands, /*InsnID*/2,
> > GIR_BuildMI, /*InsnID*/1, /*Opcode*/MyTarget::LI,
> > GIR_AddTempRegister, /*InsnID*/1, /*TempRegID*/0, /*TempRegFlags*/RegState::Define,
> > GIR_AddImm, /*InsnID*/1, /*Imm*/1,
> > GIR_ConstrainSelectedInstOperands, /*InsnID*/1,
> > GIR_BuildMI, /*InsnID*/0, /*Opcode*/MyTarget::SELECT_I4,
> > GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/0, // dst
> > GIR_Copy, /*NewInsnID*/0, /*OldInsnID*/0, /*OpIdx*/1, // in
> > GIR_AddTempRegister, /*InsnID*/0, /*TempRegID*/0, /*TempRegFlags*/0,
> > GIR_AddTempRegister, /*InsnID*/0, /*TempRegID*/1, /*TempRegFlags*/0,
> > GIR_EraseFromParent, /*InsnID*/0,
> > GIR_ConstrainSelectedInstOperands, /*InsnID*/0,
> > // GIR_Coverage, 0,
> > GIR_Done,
> > // Label 0: @74
> > GIM_Reject,
> > };
> > ```
> I meant more where that gets emitted in the emitter code, not the output
Hope I understand your comments right. The type check for the input pattern are added before the renders handling in `GlobalISelEmitter::runOnPattern()`. To be specific, type check are added in `createAndImportSelDAGMatcher()` where type checks are added to source pattern [[ https://github.com/llvm/llvm-project/blob/main/llvm/utils/TableGen/GlobalISelEmitter.cpp#L4066-L4076 | results ]] and [[ https://github.com/llvm/llvm-project/blob/main/llvm/utils/TableGen/GlobalISelEmitter.cpp#L4203-L4251 | inputs ]].
Will this impact how this issue is handled?
Thank you!
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D141247/new/
https://reviews.llvm.org/D141247
More information about the llvm-commits
mailing list