技術

5.3.4. forループのためのLLVM IR

LLVMによるプログラミング言語の実装チュートリアル日本語訳
第5章 万華鏡: 言語の拡張: 制御フロー
第3.4節 forループのためのLLVM IR

ここからがおもしろいところである。
forループのために生成させたいLLVM IRついて説明する。
第3節のシンプルな例によって、以下のようなLLVM IRが出力されるようにしたい。(分かりやすくするために最適化無しで生成されたダンプである事に注意。)

declare double @putchard(double)

define double @printstar(double %n) {
entry:
  ; 初期値 = 1.0 (phi命令の中にインラインで書いてある)
  br label %loop

loop:       ; preds = %loop, %entry
  %i = phi double [ 1.000000e+00, %entry ], [ %nextvar, %loop ]
  ; 本文
  %calltmp = call double @putchard(double 4.200000e+01)
  ; インクリメント
  %nextvar = fadd double %i, 1.000000e+00

  ; テストの終了
  %cmptmp = fcmp ult double %i, %n
  %booltmp = uitofp i1 %cmptmp to double
  %loopcond = fcmp one double %booltmp, 0.000000e+00
  br i1 %loopcond, label %loop, label %afterloop

afterloop:      ; preds = %loop
  ; ループは常に0を返す。
  ret double 0.000000e+00
}

このforループは、我々がこれまで見てきた全ての構成物が含まれている。
phiノードや、いくつかの式、そして基本的なブロック。
それらを組み合わせる方法について見てみよう。

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示