Contenu connexe
Similaire à LLVM overview 20110122 (20)
Plus de nothingcosmos (6)
LLVM overview 20110122
- 8. Outline 1. 概要 2.他コンパイラとの比較 3.コンパイラフレームワーク 4.活用・拡張のポイント 5. BitCodeの拡張
- 98. 中間言語の遷移 define i32 @max(i32 %x, i32 %y) nounwind readnone { %1 = icmp sgt i32 %x, %y %.0 = select i1 %1, i32 %x, i32 %y ret i32 %.0 } Function Live Ins: %R0 in reg%16384, %R1 in reg%16385 Function Live Outs: %R0 BB#0: derived from LLVM BB %0 Live Ins: %R0 %R1 CMPrr %R0, %R1, pred:14, pred:%reg0, %CPSR<imp-def> %R1<def> = MOVCCr %R1, %R0<kill>, pred:12, pred:%CPSR<kill> %R0<def> = MOVr %R1<kill>, pred:14, pred:%reg0, opt:%reg0 BX_RET pred:14, pred:%reg0, %R0<imp-use> Function Live Ins: %R0 in reg%16384, %R1 in reg%16385 Function Live Outs: %R0 BB#0: derived from LLVM BB %0 Live Ins: %R0 %R1 %reg16385<def> = COPY %R1; GPR:%reg16385 %reg16384<def> = COPY %R0; GPR:%reg16384 CMPrr %reg16384, %reg16385, pred:14, pred:%reg0, %CPSR<imp-def>; ;GPR:%reg16384,16385 %reg16386<def> = MOVCCr %reg16385, %reg16384, pred:12, pred:%CPSR; ;GPR:%reg16386,16385,16384 %R0<def> = COPY %reg16386; GPR:%reg16386 BX_RET pred:14, pred:%reg0 define i32 @max(i32 %x, i32 %y) nounwind { %1 = alloca i32, align 4 %2 = alloca i32, align 4 %3 = alloca i32, align 4 store i32 %x, i32* %2, align 4 store i32 %y, i32* %3, align 4 %4 = load i32* %2, align 4 %5 = load i32* %3, align 4 %6 = icmp sgt i32 %4, %5 br i1 %6, label %7, label %9 ; <label>:7 ; preds = %0 %8 = load i32* %2, align 4 store i32 %8, i32* %1 br label %11 ; <label>:9 ; preds = %0 %10 = load i32* %3, align 4 store i32 %10, i32* %1 br label %11 ; <label>:11 ; preds = %9, %7 %12 = load i32* %1 ret i32 %12 }
- 101. 活用・拡張のポイント おれおれ アーキテクチャを追加 おれおれ言語から BitCodeへの変換器 他処理系からの 変換器 他言語への 変換器追加 他処理系への変換器 最適化や解析器の 研究・実装 命令選択、命令スケジューリング レジスタアロケーションの 研究・実装 IDEとの連携、組み込み 静的解析器の研究、実装 BitCodeを拡張 BitCode-to-xxx-to-BitCodeの追加 C/C++/Obj-Cのパーサー EDGとかcosyいらなくね? おれおれコンパイラへの 変換器
- 102. 活用・拡張のポイント FPGA 用 GPGPU 用 既存言語 Haskell-to 新規言語 Clay-to Crack-to OpenCL 処理系 to EDG-to To-JavaScript To-ByteCode To-CLI To-PTX StrengthReduction Profile-gen/use AliasAnalysis regaloc=Pazzle|Graph ObjectCodeEmitter Xcode Eclipse OpenCL コンパイラへ Polly
- 113. BitCodeの拡張 Metadataのサンプル %call = call i32 (...)* @max(i32* %tmp4, i32* %tmp5), !dbg !22, !tbaa !25, !message !30 !1 = metadata !{i32 524329, metadata !"test001.c", metadata !"/home/elise/language/llvm/work/metadata", metadata !2} !22 = metadata !{i32 8, i32 5, metadata !23, null} !23 = metadata !{i32 524299, metadata !24, i32 7, i32 23, metadata !1, i32 2} !25 = metadata !{metadata !"int", metadata !26} !26 = metadata !{metadata !"an example type tree"} !30 = metadata !{metadata !"readonly,restrict,"} 手書きで追加 llvm-as/llvm-dis/opt をパス 最適化後もちゃんと残ってる
- 115. BitCodeの拡張 最適化では 極力スルー / メンテ されて情報が残る 必要な最適化で情報を参照 言語依存の最適化を実施 llvm-2.7 で 新設された機能なので、 今後どうなるのか不明 注意 実際はこんな簡単に いきません