llcで実行されるPass

llcを実行したときにどんなPassが実行されるか(PassManagerに追加されるか)が気になったのでざざっとしらべた。
ほぼ自分用のメモです。
createXXX はPassを生成する関数. XXXIDはIDからPassを生成?. どちらもその後PassManagerに追加.
最適化オプションによっては実行されないものや増えたりするものもあるので参考程度に。

PassManager::add()でPass名表示するようにしたみたけどだいたいあってそう。
最後に紹介する-debug-passの表示とはあってるのかよくわからない。

llc

  • main (tools/llc/llc.cpp)
    • LLVMTargetMachine::addPassesToEmitFile() (LLVMTargetMachine.cpp)
      • addPassesToGenerateCode
        • TargetPassConfig追加
        • TargetPassConfig::addIRPasses() (Pases.cpp)
          • createTypeBasedAliasAnalysisPass
          • createBasicAliasAnalysisPas
          • createLoopStrengthReducePass
          • createGCLoweringPass
          • createUnreachableBlockEliminationPass
        • addPassesToHandleExceptions() (LLVMTargetMachine.cpp)
        • TargetPassConfig::addISelPrepare() (Passes.cpp)
          • createCodeGenPreparePass
          • createStackProtectorPass
          • addPreISel() (Target毎に実装)
        • MachineModuleInfo追加
        • MachineFunctionAnalysis追加
        • addInstSelector() (Target毎に実装)
          • createXXXISelDag (XXXはTarget名)
        • TargetPassConfig::addMachinePasses (Passes.cpp)
          • ExpandISelPseudosID
          • TargetPassConfig::addMachineSSAOptimization (Passes.cpp)
            • OptimizePHIsID
            • LocalStackSlotAllocationID
            • DeadMachineInstructionElimID
            • MachineLICMID
            • MachineCSEID
            • MachineSinkingID
            • PeepholeOptimizerID
          • TargetPassConfig::addOptimizedRegAlloc (Passes.cpp)
            • LiveVariablesID
            • MachineLoopInfoID
            • PHIEliminationID
            • TwoAddressInstructionPassID
            • ProcessImplicitDefsID
            • RegisterCoalescerID
            • MachineSchedulerID
            • createRegAllocPass
            • addFinalizeRegAlloc()
            • StackSlotColoringID
            • PostRAMachineLICMID
          • addPostRegAlloc()
          • PrologEpilogCodeInserterID
          • TargetPassConfig::addMachineLateOptimization (Passes.cpp)
            • BranchFolderPassID
            • TailDuplicateID
            • MachineCopyPropagationID
          • ExpandPostRAPseudosID
          • addPreSched2() (Target毎に実装)
          • PostRASchedulerID
          • GCMachineCodeAnalysisID
          • TargetPassConfig::addBlockPlacement (Passes.cpp)
            • MachineBlockPlacementID
            • MachineBlockPlacementStatsID
          • addPreEmitPass() (Target毎に実装)
      • (End of addPassesToGenerateCode)
      • createAsmPrinter
      • createGCInfoDeleter

AsmPrinter

出力によって使用するMCStreamerが異なる.

  • アセンブリの場合
    • createAsmStreamer()
    • TargetRegistry::RegisterAsmStreamer()で登録しなければデフォルトのllvm::createAsmStreamer() (MCAsmStreamer.cpp)が使われる
    • MCAsmAstremaerクラス
  • オブジェクトの場合
    • createMCObjectStreamer()
    • TargetRegistry::RegisterMCObjectStreamer()で登録した関数

オプション

optやllcにオプションとして-debug-passを追加するとパスの情報を表示できる。(helpででてこないけどこれは便利)

  • debug-passで指定できるものは以下の通り。
  • None (デバッグ表示を無効化,デフォルト)
  • Arguments (optに渡される引数、つまり実行されるパスを表示)
  • Structure (パス情報をrun()の前に表示)
  • Executions (実行前にパス名を表示)
  • Details (実行中に詳細を表示)

下に行くほど詳細で、下のオプションを指定すればそれより上のオプションは全て有効になる。