# COINS の各機能とその使い方

## 目次

- +/- 1. 概要
  - 1.1 　目的
  - 1.2 　COINSの構成
  - 1.3 　コンパイラ・ドライバ
  - 1.4 　マシン記述によるコード生成
  - 1.5 　最適化・並列化機能
  - 1.6 　オブジェクト性能
  - 1.7 　コンパイル過程の可視化
  - 1.8 　テスト・スーツ
- +/- 2. コンパイラ・ドライバ
  - 2.1 　ドライバの設計
    - 2.1.1 　設計方針
    - 2.1.2 　構成
  - 2.2 　ドライバの使い方
    - 2.2.1 　コマンド文法
    - 2.2.2 　基本オプション
    - 2.2.3 　COINS オプション
      - ターゲット指定
      - HIRでの最適化
      - 粗粒度並列化
      - ループ並列化
      - SSA最適化
      - SIMD並列化
      - バックエンドの拡張
      - コンパイル過程の情報出力
      - その他
      - オプションの追加
    - 2.2.4 　入力ファイル
    - 2.2.5 　終了ステータス
    - 2.2.6 　ターゲットの指定
    - 2.2.7 　使い方の例
  - 2.3 　ドライバ API の使い方
    - 2.3.1 　ドライバ U/I
    - 2.3.2 　ドライバの実装
    - 2.3.3 　コンパイル仕様
    - 2.3.4 　トレース API
    - 2.3.5 　警告 API
    - 2.3.6 　ライブラリ・ディレクトリ
    - 2.3.7 　プロパティ・ファイル
    - 2.3.8 　サフィクス規則
    - 2.3.9 　settings ファイル
  - 2.4 　制限事項
    - 2.4.1 　既知の障害
    - 2.4.2 　制限事項
  - 2.5 　ドライバの実現
- +/- 3. 高水準中間表現HIRの仕様
  - 3.1 　HIRの論理構造
  - 3.2 　プログラムのHIR表現
    - 3.2.1 　HIR表現の作り方
  - 3.3 　記号表の構成
    - 3.3.1 　全体構成
    - 3.3.2 　HIRやフロー情報との関連
    - 3.3.3 　記号のクラス階層
    - 3.3.4 　主要な記載内容
  - 3.4 　記号表の使い方
    - 3.4.1 　記号表の作り方
    - 3.4.2 　記号表の初期化
    - 3.4.3 　記号の作り方
    - 3.4.4 　Iterator
  - 3.5 　参考ドキュメント
    - 3.5.1 　HIRと記号表の簡易インタフェース
    - 3.5.2 　HIRと記号表の詳細仕様
- +/- 4. 低水準中間表現LIRの仕様
  - 4.1 　概要
  - 4.2 　設計目標
  - 4.3 　実現方針
  - 4.4 　他の中間言語との比較
  - 4.5 　構文と意味
  - 4.6 　LIRの読み方
  - 4.7 　詳細仕様
- +/- 5. フロントエンド
  - 5.1 　Cフロントエンド
    - 5.1.1 　C言語仕様
    - 5.1.2 　プラグマ
      - 概要
      - プラグマの基本形
      - プラグマの例
    - 5.1.3 　asm文
      - asm文の仕様
      - HIRレベルのasm文の仕様
      - LIRレベルのasm文の仕様
    - 5.1.4 　Cフロントエンドの使い方
      - 必要なソフト
    - 5.1.5 　Cフロントエンドの構成
  - 5.2 　Fortranフロントエンド
    - 5.2.1 　Fortran言語仕様
    - 5.2.2 　Fortranフロントエンドの使い方
      - 必要なソフト
    - 5.2.3 　Fortranフロントエンドの構成
  - 5.3 　新しいフロントエンドの作り方
    - 5.3.1 　JavaCC（LLパーサ生成系）を使った例
    - 5.3.2 　LRパーサ生成系を使った例
- +/- 6. HIRでの最適化
  - 6.1 HIR最適化の概要
  - 6.2 基本最適化
    - 6.2.1 基本最適化の概要
    - 6.2.2 基本最適化の諸項目
      - 定数畳み込み
      - 定数伝播
      - 無用命令削除
      - 局所的共通部分式削除
      - 大域変数の一時変数化
    - 6.2.3 基本最適化の呼び出し方
  - 6.3 拡張最適化
    - 6.3.1 拡張最適化の概要
    - 6.3.2 拡張最適化の諸項目
      - ループ展開
      - if文のループ外移動
      - インライン展開
      - 部分冗長性削除
  - 6.4 Cフロントでの最適化
  - 6.5 HIRフロー解析
    - 6.5.1 HIRフロー解析の概要
    - 6.5.2 coins.flowパッケージでのフロー解析
      - 制御フロー解析
      - データフロー解析
      - データフロー情報
      - データ構造
      - 使い方
      - 拡張仕方
    - 6.5.3 coins.aflowパッケージでのフロー解析（旧版）
      - フロー情報
      - 呼び出し方
      - コマンドでの起動
  - 6.6 別名解析
    - 6.6.1 別名解析の概要
    - 6.6.2 使い方
  - 6.7 参考文献
- -/- 7. HIRでの並列化
  - +/- 7.1 ループ並列化
    - 7.1.1 ループ並列化の概要
    - 7.1.2 ループの解析と並列化変換
      - 解析と並列化変換の方針
      - データの参照領域の解析
      - 基本インダクション変数の検出と変換
      - 参照領域情報の解析
      - 並列化可否の判定
      - 解析とソースプログラム生成の実行例
      - 解析・変換の実現方法とツールとしてのモジュール化
    - 7.1.3 　OpenMPコンパイラとの連携
    - 7.1.4 　並列マシン用の目的コード生成
      - 並列マシン用コード生成の概要
      - 並列化のフレームワーク
      - 並列化の実装環境
      - 並列化向けのHIR変換
        - ループの選択
        - ループの副プログラム化
        - データ受け渡し
        - 使い方
        - ヘッダファイル
        - 例
  - +/- 7.2 粗粒度並列化コンパイラCoCo
    - 7.2.1 CoCoの概要
    - 7.2.2 CoCoの使い方
    - 7.2.3 設計方針と制約事項
    - 7.2.4 CoCoの処理の流れ
      - 並列実行プログラムへの変換
      - OpenMP指示文の挿入
      - 粗粒度タスクスケジューラ
    - 7.2.5 CoCoの評価
- -/- 8. LIRでの最適化
  - +/- 8.1 SSA最適化
    - 8.1.1 SSA形式最適化部
      - SSA最適化部の流れ
      - SSA形式への変換
      - SSA形式からの逆変換
      - SSA形式上のデータフロー解析と最適化
        - 基本最適化
        - 高度最適化
        - 様々な有用な変換
    - 8.1.2 SSA最適化部の評価
      - SSA最適化部の使い方
      - 評価
    - 8.1.3 参考ドキュメント
  - +/- 8.2 SIMD並列化
    - 8.2.1 SIMD並列化の設計方針
    - 8.2.2 SIMD拡張命令セットの調査
    - 8.2.3 命令の意味の詳細な記述
    - 8.2.4 プロトタイプの実装
    - 8.2.5 SIMD並列化の使い方
    - 8.2.6 SIMDベンチマークの設計と試験実装
    - 8.2.7 参考ドキュメント
- -/- 9. バックエンド
  - +/- 9.1 バックエンドの構成
    - 9.1.1 リターゲッタブルなコード生成
    - 9.1.2 マシン記述TMD
      - データ型とレジスタの定義
        - データ型
        - レジスタリスト
        - レジスタ集合
        - レジスタ非終端記号
        - 変数のレジスタ集合
        - 被呼側保存レジスタ集合
      - LIRとマシン命令の対応
        - 開始記号の定義
        - 還元規則とコード生成例
        - foreachマクロ
        - 還元規則defrule
        - 書き換え規則`defrewrite`
      - Javaによる記述
        - CodeGeneratorのメソッド
        - %defbuildと%defemit
        - LIR のJavaによる表現
      - リスト表現アセンブラ
    - 9.1.3 レジスタ割付
      - レジスタ対の扱い
      - 溢れ候補の選択
    - 9.1.4 バックエンドの使い方
    - 9.1.5 バックエンドの最近の拡張版
      - TMDの拡張
        - マクロ機能
          - 基本定義
          - 組み込みマクロ
          - include
        - 速度優先・スペース優先
        - 共通TMD
        - rewriteCall等の標準化
        - リテラルとブランチの変換
          - リテラルとブランチの生成
          - 変換のためのTMDでの記述
      - 文の実行頻度プロファイラ
      - LIRシミュレータ
    - 9.1.6 参考ドキュメント
  - +/- 9.2 　バックエンドの付加機能
    - 9.2.1 　バックエンドの呼び出しかた
    - 9.2.2 　バックエンドの機能追加の仕方
    - 9.2.3 　命令スケジューラ
      - 呼び出しかた
      - 設計
      - 問題点と解決法
    - 9.2.4 　ソフトウェア・パイプライニング
      - 呼び出しかた
      - 設計
      - 評価
    - 9.2.5 　レジスタ・プロモーション
      - 使い方
      - 評価
- +/- 10. 可視化ツール
  - 10.1 中間プログラム表現可視化ツール CoVis
    - CoVisの使い方
      - XMLファイルの作成
      - XMLファイルの表示
  - 10.2 コード生成過程のトレース情報表示ツール
    - 使い方