LLVMの用語説明

LLVMの中間言語には以下の構造がある。

Module

Function

BasicBlock

Instruction


上記構造をボトムアップに構築した集合

LinkTime(BitCodeファイルの集合)

CallGraphSCC(Functionの集合)

Loop(BasicBlockの集合)





例)入力ソースコード
test.c
  void func1() {
    func2();
  }
  void func2() {
    loop1;
      bb1;
      bb2;
    bb3;
    bb4;
    loop2;
      bb5;
      bb6;
  }

例)LLVMの中間言語
Module
  test.c

Function
  func1
  func2

BasicBlock
  bb1
  bb2
  bb3
  bb4
  bb5
  bb6

CallGraphSCC
  scc1->[func1->func2]

Loop
  loop1->[bb1,bb2]
  loop2->[bb5,bb6]

例)パススケジューリング
  ・パスの実行指定
  inline(CallGraphSCC)
  instcombine(Function)
  LICM(Loop)

  Module(test1.c)
    CallGraphSCC(scc1)
      Function(func2)
        instcombine(func2)
        Loop(loop1, loop2)
          LICM(loop1)
          LICM(loop2)
    inline(func2)
      Function(func1)
        instcombine(func1)
※MI側も似たようにスケジューリングされる。
※スケジューリングの様子は-debug-pass=Executionsで確認できる




BitCodeの構造早見表

Moduleクラス

Valueクラス

Typeクラス

型システム(llvm::Type)は、名前によらず型のレイアウトで存在が一意に決まる。
具体的には C で言うところの

struct FOO {int a; int b;};
struct BAR {unsigned c; unsigned d;};

これらは IR 上では同一の型として扱われる。
型一致比較は llvm::Type* のポインタ比較で行える。

型についている"名前"(TypeSymbol)は表示上の便宜的なものであることに注意。
また、Instruction についている名前(ValueSymbol)も、表示上のものである。
現に、opt -strip で、グローバルシンボル以外のすべての名前を消し去ることすらできる。

Passクラス

SDNode

MachineInstr

TargetMachine



  • 最終更新:2011-06-27 23:27:39

このWIKIを編集するにはパスワード入力が必要です

認証パスワード