通过模式匹配进行指令选择的调试输出

Debug output for instruction selection by pattern matching

运行 llc --debug,指令选择模式匹配的输出本身是非常不可读的。这是一些示例输出:

ISEL: Starting pattern match on root node: t7: i8,ch = load<LD1[%1](dereferenceable)> t0, t2, undef:i16

  Initial Opcode index to 581
  TypeSwitch[i8] from 590 to 593
  Match failed at index 595
  Continuing at 624
  Match failed at index 626
  Continuing at 662
  Match failed at index 667
  Continuing at 754
  TypeSwitch[i8] from 761 to 764
  Morphed node: t7: i8,ch = LPMRdZ<Mem:LD1[%1](dereferenceable)> t2, t0

数字是什么意思?我如何使用该输出?特别是,我想查看尝试了哪些指令模式(链接到我的 TargetInstrInfo.td 文件)、以何种顺序以及哪些子模式匹配或失败。

我发现 LLVM 构建过程使用 Target/MyArch/MyArchInstrInfo.td 来生成 MyArchGenDAGISel.inc 文件等。调试消息中的数字对应于该文件中的标签;例如,这是我问题中示例的相关部分。它提供的信息几乎正是我所希望的。

/*581*/       OPC_RecordMemRef,
/*582*/       OPC_RecordNode, // #0 = 'ld' chained node
/*583*/       OPC_Scope, 39, /*->624*/ // 3 children in Scope
/*585*/         OPC_RecordChild1, // #1 = $memri
/*586*/         OPC_CheckPredicate, 1, // Predicate_unindexedload
/*588*/         OPC_CheckPredicate, 2, // Predicate_load
/*590*/         OPC_SwitchType /*2 cases */, 14, MVT::i8,// ->607
/*593*/           OPC_CheckPatternPredicate, 0, // (Subtarget->hasSRAM())
/*595*/           OPC_CheckComplexPat, /*CP*/0, /*#*/1, // SelectAddr:$memri #2 #3

/*624*/       /*Scope*/ 37, /*->662*/
/*625*/         OPC_MoveChild1,
/*626*/         OPC_CheckOpcode, TARGET_VAL(AVRISD::WRAPPER),

/*662*/       /*Scope*/ 125, /*->788*/
/*663*/         OPC_RecordChild1, // #1 = $src
/*664*/         OPC_Scope, 88, /*->754*/ // 2 children in Scope
/*666*/           OPC_MoveChild1,
/*667*/           OPC_CheckOpcode, TARGET_VAL(ISD::Constant),

/*754*/         /*Scope*/ 32, /*->787*/
/*755*/           OPC_CheckChild1Type, MVT::i16,
/*757*/           OPC_CheckPredicate, 1, // Predicate_unindexedload
/*759*/           OPC_CheckPredicate, 2, // Predicate_load
/*761*/           OPC_SwitchType /*2 cases */, 10, MVT::i8,// ->774
/*764*/             OPC_CheckPatternPredicate, 0, // (Subtarget->hasSRAM())
/*766*/             OPC_EmitMergeInputChains1_0,
/*767*/             OPC_MorphNodeTo1, TARGET_VAL(AVR::LDRdPtr), 0|OPFL_Chain|OPFL_MemRefs,
                        MVT::i8, 1/*#Ops*/, 1, 
                    // Src: (ld:i8 i16:i16:$ptrreg)<<P:Predicate_unindexedload>><<P:Predicate_load>> - Complexity = 4
                    // Dst: (LDRdPtr:i8 i16:i16:$ptrreg)