JP2015201119A - コンパイルプログラム、コンパイル方法およびコンパイル装置 - Google Patents

コンパイルプログラム、コンパイル方法およびコンパイル装置 Download PDF

Info

Publication number
JP2015201119A
JP2015201119A JP2014080869A JP2014080869A JP2015201119A JP 2015201119 A JP2015201119 A JP 2015201119A JP 2014080869 A JP2014080869 A JP 2014080869A JP 2014080869 A JP2014080869 A JP 2014080869A JP 2015201119 A JP2015201119 A JP 2015201119A
Authority
JP
Japan
Prior art keywords
instruction
branch
code
conversion
instructions
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2014080869A
Other languages
English (en)
Inventor
貴洋 三好
Takahiro Miyoshi
貴洋 三好
修一 千葉
Shuichi Chiba
修一 千葉
智子 新幸
Tomoko Shinko
智子 新幸
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2014080869A priority Critical patent/JP2015201119A/ja
Priority to US14/662,648 priority patent/US9395986B2/en
Publication of JP2015201119A publication Critical patent/JP2015201119A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/30Arrangements for executing machine instructions, e.g. instruction decode
    • G06F9/30003Arrangements for executing specific machine instructions
    • G06F9/3005Arrangements for executing specific machine instructions to perform operations for flow control
    • G06F9/30058Conditional branch instructions
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

【課題】プロセッサにおける分岐処理の実行効率を向上させる。
【解決手段】コンパイル装置10は、コード13の中から、それぞれ整数を対象とした比較演算の結果に応じて分岐処理を行う、ジャンプ先が同一である複数の分岐命令を検出する。コンパイル装置10は、複数の分岐命令を、論理演算命令および算術演算命令を用いて分岐命令の数が上記の複数の分岐命令よりも少ない変換命令群に変換する。コンパイル装置10は、変換命令群に基づく処理のサイクル数が、複数の分岐命令に基づく処理のサイクル数より少ないとき、変換命令群を用いたコード14を生成する。
【選択図】図1

Description

本発明はコンパイルプログラム、コンパイル方法およびコンパイル装置に関する。
現在、コンピュータのプロセッサの多くは、パイプライン処理技術を採用している。パイプライン処理技術は、各命令の処理をフェッチ・デコード・実行・メモリアクセスなどの複数のステージに分割し、異なるステージの処理を並列に実行可能にする。あるステージ(例えば、フェッチステージ)である命令の処理が行われているとき、これと並列に、他のステージ(例えば、デコードステージ)で他の命令の処理が行われる。
理想的には、処理を行っていない空きステージが生じないように、パイプラインに命令を詰め込むことが好ましい。しかし、様々な理由により、空きステージが生じてパイプラインの利用率が下がることがある。その理由の1つとして、プログラムの中に条件分岐を示す分岐命令が含まれていることが挙げられる。分岐命令が実行されると、その実行結果に応じて、ジャンプせずに次のアドレスの命令が選択されるか(not−taken)、ジャンプして離れたアドレスの命令が選択される(taken)。分岐命令の次に実行されるべき命令は、当該分岐命令が実行ステージを通過するまで確定しない。分岐命令の実行結果を待って次の命令をパイプラインに投入すると、空きステージが生じてしまう。
また、プロセッサの中には、分岐予測技術を採用しているものもある。分岐予測では、プロセッサに含まれるハードウェアとしての分岐予測回路が、分岐命令の過去の実行結果を示す履歴情報を収集する。分岐予測回路は、次にその分岐命令が実行されるとき、履歴情報に基づいて今回の分岐方向(takenまたはnot−taken)を予測する。プロセッサは、分岐予測回路の予測に従って、パイプラインに投入した分岐命令の実行結果を待たずに、次の命令を選択してパイプラインに投入する(投機的実行)。
分岐予測に成功すれば、プロセッサはそのままパイプライン処理を続ければよいため、空きステージの発生を抑制できる。しかし、分岐予測に失敗すると、プロセッサは、予測に従って投入した命令およびそれ以降の命令をパイプラインから削除し、正しい命令を投入し直すことになる。すなわち、予測ミスのペナルティが発生する。よって、分岐予測技術を採用しても、分岐命令を多く含むプログラムを実行するときはパイプラインの利用率が低下し、プログラムの実行効率が低下するおそれがある。
そこで、コンパイラ最適化の中で、分岐命令が少なくなるようにプログラムを変換する技術が提案されている。cが真のときは変数vに値tを代入し、cが偽のときは変数vに値fを代入するif−else文が、ソースコードに記載されているとする。このとき、1つの提案に係るコンパイラは、このif−else文を次のような代入文に変換する:v=(t and c)or(f and not c)。
また、マスクビット列maskに応じて、result=5*dataまたはresult=7*dataを実行するif−else文が、ソースコードに記載されているとする。他の1つの提案に係るコンパイラは、このif−else文を次のような代入文に変換する:result=(5*data and mask)or(7*data andc mask)。すなわち、if節の命令とelse節の命令を両方実行し、if節の実行結果とマスクビット列のANDおよびelse節の実行結果とマスクビット列のANDCをそれぞれ計算し、両者の計算結果をORで結合するプログラムが生成される。
特開2003−202991号公報 特開2010−186467号公報
プログラムに含まれる分岐構造の1つの形態として、ジャンプ先が同一であり、それぞれが整数を対象とした比較演算の結果に応じて分岐方向を判断する複数の分岐命令が連続している形態が考えられる。上記の複数の分岐命令が連続している形態の一例として、変数cの値が定数c1,c2,…の何れかに該当するときに、ある処理が実行されるようなプログラムが挙げられる。コンピュータ内では文字は整数の文字コードとして表現されるため、文字変数sの値が定数s1,s2,…の何れかに該当するときにある処理が実行されるようなプログラムも、同様に整数の比較の問題として扱うことができる。
このような分岐命令群についても、コンパイラ最適化の中で、分岐命令の少ない命令群に変換することが考えられる。しかし、分岐命令群から変換される命令群は、命令数が変換前よりも顕著に多くなるおそれがある。そのため、従来のコンパイラ最適化では、上記の分岐命令群に対して分岐命令が少なくなるような変換は活用されていなかった。また、分岐命令群を実効効率の高い命令群に変換できるか否かは、プログラムを実行させるプロセッサ(ターゲットとするプロセッサ)のアーキテクチャにも依存し得る。
1つの側面では、本発明は、プロセッサにおける分岐処理の実行効率を向上させるコンパイルプログラム、コンパイル方法およびコンパイル装置を提供することを目的とする。
1つの態様では、コンピュータに以下の処理を実行させるコンパイルプログラムが提供される。第1のコードの中から、それぞれ整数を対象とした比較演算の結果に応じて分岐処理を行う、ジャンプ先が同一である複数の分岐命令を検出する。複数の分岐命令を、論理演算命令および算術演算命令を用いて分岐命令の数が複数の分岐命令よりも少ない変換命令群に変換する。変換命令群に基づく処理のサイクル数が、複数の分岐命令に基づく処理のサイクル数より少ないとき、変換命令群を用いた第2のコードを生成する。
また、1つの態様では、コンピュータが実行するコンパイル方法が提供される。
また、1つの態様では、記憶部と変換部とを有するコンパイル装置が提供される。記憶部は、それぞれ整数を対象とした比較演算の結果に応じて分岐処理を行う、ジャンプ先が同一である複数の分岐命令を含む第1のコードを記憶する。変換部は、複数の分岐命令を、論理演算命令および算術演算命令を用いて分岐命令の数が複数の分岐命令よりも少ない変換命令群に変換し、変換命令群に基づく処理のサイクル数が複数の分岐命令に基づく処理のサイクル数より少ないとき、変換命令群を用いた第2のコードを生成する。
1つの側面では、プロセッサにおける分岐処理の実行効率が向上する。
第1の実施の形態のコンパイル装置を示す図である。 コンパイル装置のハードウェア例を示すブロック図である。 コンパイル装置の機能例を示すブロック図である。 プロセッサのレジスタ構成の例を示す図である。 プロセッサ情報の例を示す図である。 連続する分岐命令を含むコードの例を示す図である。 コードのパターンと変換規則の例を示す図である。 変換後のコードに基づく条件分岐の計算例を示す図である。 連続する分岐命令を含むコードの変換例を示す図である。 変換前後の条件分岐の制御構造例を示す図である。 コンパイルの手順例を示すフローチャートである。 分岐命令削減の手順例を示すフローチャートである。 分岐命令削減の手順例を示すフローチャート(続き1)である。 分岐命令削減の手順例を示すフローチャート(続き2)である。 比較値配列の例を示す図である。 実行時情報の例を示す図である。 連続する分岐命令を含むコードの他の変換例を示す図である。
以下、本実施の形態を図面を参照して説明する。
[第1の実施の形態]
図1は、第1の実施の形態のコンパイル装置を示す図である。
第1の実施の形態のコンパイル装置10は、最適化処理として、コード13から分岐命令が削減されたコード14に変換することがある。コード13,14は、プロセッサに実行させる命令を記述したものと言うことができ、プログラムと言うこともできる。コード13は、高級言語で記述されたソースコードでもよいし、ソースコードから変換された中間コードでもよい。コード14は、最適化された中間コードでもよいし、アセンブリコードや機械可読なオブジェクトコードでもよい。また、コンパイル装置10は、ユーザが操作する端末装置でもよいし、端末装置からアクセスされるサーバ装置でもよい。コンパイル装置10は、コンピュータまたは情報処理装置を用いて実装してもよい。
コンパイル装置10は、記憶部11および変換部12を有する。記憶部11は、コード13を記憶する。記憶部11は、RAM(Random Access Memory)などの揮発性の記憶装置でもよいし、HDD(Hard Disk Drive)などの不揮発性の記憶装置でもよい。変換部12は、記憶部11に記憶されたコード13をコード14に変換することがある。変換部12は、CPU(Central Processing Unit)やDSP(Digital Signal Processor)などのプロセッサでもよいし、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの特定用途の電子回路を含んでもよい。プロセッサは、例えば、記憶部11または他の記憶装置に記憶されたコンパイルプログラムを実行する。なお、複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
変換部12は、記憶部11に記憶されたコード13の中から、所定の条件を満たす複数の分岐命令を検出する。所定の条件には、複数の分岐命令が同一のジャンプ先を指定していることが含まれる。また、所定の条件には、各分岐命令が、整数を対象とした比較演算の結果に応じて分岐処理を行う条件分岐命令であることが含まれる。
整数を対象とした比較演算は、例えば、変数の値などの入力値が固定の整数と一致するか否か判定する演算である。その場合、比較演算の結果に応じた分岐処理は、例えば、入力値が固定の整数と一致するときまたは一致しないときにジャンプすることである。入力値は複数の分岐命令の間で共通であってもよく、比較される固定の整数は分岐命令毎に異なってもよい。また、変数は、文字変数であってもよい。すなわち、入力値および固定の整数は、文字を表す文字コードであってもよい。
図1の例では、コード13には、変数cの値と固定の整数「100」との比較に応じてlabelAにジャンプするか判断する分岐命令13aと、変数cの値と固定の整数「200」との比較に応じてlabelAにジャンプするか判断する分岐命令13bとが含まれる。よって、変換部12は、コード13から分岐命令13a,13bを検出する。
変換部12は、検出した複数の分岐命令を、論理演算命令および算術演算命令を用いて、検出した複数の分岐命令よりも分岐命令の数が少ない変換命令群に変換する。変換命令群に使用する論理演算命令には、論理和(OR)命令、論理積(AND)命令、排他的論理和(XOR)命令などが含まれ得る。変換命令群に使用する算術演算命令には、加算(ADD)命令、減算(SUB)命令などが含まれ得る。また、変換命令群に使用する論理演算命令や算術演算命令には、キャリーフラグやゼロフラグのようなステータスレジスタのフラグを用いた演算を行う、プロセッサアーキテクチャ依存の命令が含まれてもよい。
図1の例では、コード13から、論理演算命令14a,14b、算術演算命令14c,14dおよび分岐命令14eを含む変換命令群が生成される。この変換命令群では、論理演算命令14aを用いて、変数cの値が固定の整数「100」と一致するか否かを反映した値を算出し、論理演算命令14bを用いて、変数cの値が固定の整数「200」と一致するか否かを反映した値を算出している。また、算術演算命令14c,14dなどを用いて、論理演算命令14a,14bの演算結果から、変数cの値が「100」「200」の何れかと一致するか否かを反映した判定値を算出している。そして、分岐命令14eにおいて、判定値に基づいてlabelAにジャンプするか否か判断している。すなわち、ジャンプするか否かの2回分の判断が1回に纏められ、分岐命令の数が削減されている。
変換部12は、変換命令群に基づく処理のサイクル数が、元の複数の分岐命令に基づく処理のサイクル数より少ないとき、変換命令群を用いたコード14を生成する。例えば、変換部12は、ターゲットのプロセッサにおける各命令の実行サイクル数を示すプロセッサ情報を参照して、変換後の変換命令群に従って分岐処理を行ったときのサイクル数を予測する。同様に、変換部12は、プロセッサ情報を参照して、変換前の複数の分岐命令に従って分岐処理を行ったときのサイクル数を予測する。そして、例えば、変換部12は、変換前のサイクル数と変換後のサイクル数とを比較し、後者が前者より小さい(変換によってサイクル数が減少すると予測される)場合に、変換命令群を採用する。
第1の実施の形態のコンパイル装置10によれば、コード13の中から、整数を対象とした比較演算の結果に応じて分岐処理を行う、ジャンプ先が同一の分岐命令13a,13bが検出される。検出された分岐命令13a,13bが、論理演算命令および算術演算命令を用いて変換前よりも分岐命令の数が削減された変換命令群に変換される。そして、変換命令群に基づく処理のサイクル数が、分岐命令13a,13bに基づく処理のサイクル数より少ないとき、変換命令群を用いたコード14が生成される。
これにより、オブジェクトコードに含まれる分岐命令が削減される。よって、実行時のパイプラインの待ち時間を削減することができ、オブジェクトコードの実行効率を向上させることができる。特に、分岐予測の精度が高くないプロセッサでは、分岐命令の削減によって実行効率を大きく向上できる。また、ジャンプ先が同一である連続する分岐命令が変換対象になるため、命令投入待ちや分岐予測ミスの影響が大きくなりやすい箇所の実行効率を改善できる。また、変換前よりサイクル数が減少するか確認することで、変換により命令数が増加する場合やプロセッサによってサイクル数の異なる命令を使用する場合であっても、実行効率が高くなるようにオブジェクトコードを生成できる。
[第2の実施の形態]
第2の実施の形態のコンパイル装置100は、高級言語で記述されたソースコードをコンパイルし、機械可読なオブジェクトコードを生成する。コンパイル装置100は、ユーザが操作する端末装置でもよいし、端末装置からアクセスされるサーバ装置でもよい。コンパイル装置100は、例えば、コンピュータを用いて実装される。その場合、コンパイル装置100は、ソフトウェアとしてのコンパイラおよびリンカを実行する。
図2は、コンパイル装置のハードウェア例を示すブロック図である。
コンパイル装置100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106および通信インタフェース107を有する。上記ユニットはバス108に接続される。CPU101は第1の実施の形態の変換部12の一例であり、RAM102は第1の実施の形態の記憶部11の一例である。
CPU101は、プログラムの命令を実行する演算回路を含むプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを備えてもよく、コンパイル装置100は複数のプロセッサを備えてもよく、以下で説明する処理を複数のプロセッサまたはプロセッサコアを用いて並列に実行してもよい。また、複数のプロセッサの集合(マルチプロセッサ)を「プロセッサ」と呼んでもよい。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、コンパイル装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。プログラムには、コンパイルプログラムやリンクプログラムが含まれる。なお、コンパイル装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、コンパイル装置100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ(PDP:Plasma Display Panel)、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなどを用いることができる。
入力信号処理部105は、コンパイル装置100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウスやタッチパネルやタッチパッドやトラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、コンパイル装置100に、複数の種類の入力デバイスが接続されていてもよい。
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、フレキシブルディスク(FD:Flexible Disk)やHDDなどの磁気ディスク、CD(Compact Disc)やDVD(Digital Versatile Disc)などの光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータをRAM102またはHDD103に格納する。
通信インタフェース107は、ネットワーク114に接続され、ネットワーク114を介して他のコンピュータと通信を行うインタフェースである。通信インタフェース107は、スイッチなどの通信装置とケーブルで接続される有線通信インタフェースでもよいし、基地局と無線リンクで接続される無線通信インタフェースでもよい。
なお、コンパイル装置100は、媒体リーダ106を備えていなくてもよく、ユーザが操作する端末装置から制御可能である場合には画像信号処理部104や入力信号処理部105を備えていなくてもよい。また、ディスプレイ111や入力デバイス112が、コンパイル装置100の筐体と一体に形成されていてもよい。
図3は、コンパイル装置の機能例を示すブロック図である。
コンパイル装置100は、ファイル記憶部120、コンパイラ130およびリンカ150を有する。ファイル記憶部120は、例えば、RAM102またはHDD103に確保した記憶領域として実現される。コンパイラ130およびリンカ150は、例えば、CPU101が実行するプログラムのモジュール(コンパイルプログラムおよびリンクプログラム)として実現できる。ただし、コンパイラ130およびリンカ150の機能の一部または全部を、ソフトウェアでなく電子回路として実現することも可能である。
ファイル記憶部120は、ソースファイル121、オブジェクトファイル122および実行ファイル123を記憶する。ソースファイル121は、高級言語で記述されたソースコードを含む。オブジェクトファイル122は、機械可読なオブジェクトコードを含む。実行ファイル123は、ターゲットのプロセッサが実行できる形式のファイルであり、生成されたオブジェクトコードとライブラリなどへのリンクとを含む。なお、実行ファイル123は、CPU101が実行してもよいし、コンパイル装置100が備える他のCPUまたはコンパイル装置100以外のコンピュータのCPUが実行してもよい。
コンパイラ130は、ファイル記憶部120からソースファイル121を読み出し、ソースコードをオブジェクトコードに変換して、オブジェクトファイル122をファイル記憶部120に格納する。コンパイラ130は、入出力制御部131、ファイル入力部132、中間コード生成部133、中間コード記憶部134、アセンブリコード生成部135、ファイル出力部136、最適化部140および制御情報記憶部143を有する。
入出力制御部131は、ファイルの種類に応じた入出力方法を選択し、ファイル入力部132およびファイル出力部136を制御する。ファイル入力部132は、入出力制御部131からの指示に応じて、ソースファイル121をオープンし、ソースファイル121からソースコードを読み出す。中間コード生成部133は、ファイル入力部132が読み出したソースコードを解析して、コンパイラ130の内部で利用される中間言語で記述された中間コードに変換し、中間コードを中間コード記憶部134に格納する。ソースコードの解析には、字句解析、構文解析、意味解析などが含まれる。中間コード記憶部134は、RAM102に確保された記憶領域であり、中間コードを記憶する。
アセンブリコード生成部135は、最適化部140によって最適化された中間コードを、低級言語であるアセンブリ言語で記述されたアセンブリコードに変換する。ファイル出力部136は、入出力制御部131からの指示に応じて、オブジェクトファイル122を生成し、アセンブリコード生成部135が生成したアセンブリコードをオブジェクトコードに変換し、オブジェクトファイル122に書き込む。
最適化部140は、中間コード記憶部134に記憶された中間コードを、実行速度が向上するように最適化する。最適化部140は、解析部141および最適化実行部142を有する。解析部141は、中間コードを解析して最適化方法を決定する。解析部141が行う最適化方法の決定には、分岐命令の削減を決定すること、すなわち、所定の条件を満たす分岐命令の集合を分岐命令の数が少ない命令群に変換することの決定が含まれる。最適化実行部142は、解析部141が決定した最適化方法に従って中間コードを最適化する。最適化実行部142が行う最適化には、分岐命令の削減が含まれる。
制御情報記憶部143は、RAM102またはHDD103に確保された記憶領域であり、最適化部140が最適化処理において参照する制御情報を記憶する。制御情報には、プロセッサが解釈できる命令および各命令のサイクル数などを示すプロセッサ情報が含まれる。制御情報記憶部143には、複数の種類のプロセッサについてのプロセッサ情報が記憶されてもよい。ユーザがターゲットのプロセッサの種類を指定した場合、最適化部140は、指定された種類に対応するプロセッサ情報を参照すればよい。また、制御情報には、分岐命令を削減する最適化において使用される変換規則が含まれる。
リンカ150は、ファイル記憶部120からオブジェクトファイル122を読み出し、オブジェクトコードを解析して、参照されている他のオブジェクトファイルやライブラリを検出する。そして、リンカ150は、オブジェクトファイル122と、検出した他のオブジェクトファイルやライブラリとをリンクし、実行ファイル123を生成する。なお、コンパイラ130にリンカ150の機能が統合されていてもよい。
図4は、プロセッサのレジスタ構成の例を示す図である。
CPU20は、コンパイル装置100によって生成された実行ファイル123を実行可能なプロセッサの1つである。CPU20は、使い捨てレジスタ21(以下ではレジスタr0と呼ぶことがある)、汎用レジスタ22〜25(以下ではレジスタr1,r2,r3,r4と呼ぶことがある)およびステータスレジスタ26を有する。
使い捨てレジスタ21は、後で参照されないデータの格納先として利用されるレジスタである。使い捨てレジスタ21がデータの格納先に指定された命令を実行することは、当該データを破棄することを意味する。ただし、使い捨てレジスタ21は物理的なレジスタでなくてもよく、物理的に存在しない仮想的なレジスタであってもよい。その場合、CPU20は、使い捨てレジスタ21がデータの格納先に指定された命令を実行すると、当該データを何れのレジスタにも格納せずに即時に破棄することになる。
汎用レジスタ22〜25は、実行ファイル123に含まれる命令から明示的に指定することができる、データを一時的に格納しておくレジスタである。ステータスレジスタ26は、演算の実行状況に応じてCPU20が自動的に更新するレジスタであり、実行ファイル123に含まれる命令から明示的には指定されない。ステータスレジスタ26は、キャリーフラグ(carry)やゼロフラグ(zero)などの制御フラグを記憶する。
キャリーフラグは、直前の演算によってオーバーフロー(桁上がり)またはボロー(桁借り)が発生したか否かを示す。オーバーフローまたはボローが発生したときはキャリーフラグがON(1)に設定され、それ以外のときはOFF(0)に設定される。ゼロフラグは、直前の演算の結果がゼロであるか否かを示す。演算結果がゼロのときはゼロフラグがON(1)に設定され、それ以外のときはOFF(0)に設定される。
図5は、プロセッサ情報の例を示す図である。
プロセッサ情報144は、前述の制御情報記憶部143に記憶される。プロセッサ情報144は、命令形式、サイクル数および演算内容の項目を含む。命令形式は、アセンブリ言語レベルの命令名とオペランドを示す。サイクル数は、CPU20が命令の実行に要する実行時間を示す。演算内容は、命令の意味を示している。第2の実施の形態では、少なくとも図5のプロセッサ情報144に列挙された命令を実行可能なCPU20をターゲットとして、実行ファイル123を生成することを想定している。
CPU20は、cmp命令、beq命令、bne命令、addx命令、subx命令、subcc命令、xor命令、andcc命令およびorcc命令を実行できる。beq命令とbne命令のサイクル数は10であり、他の命令のサイクル数は1である。cmp命令は、オペランドA,Bの値が一致していればゼロフラグがONになる比較命令である。beq命令は、ゼロフラグがONのときlabelにジャンプする分岐命令である。bne命令は、ゼロフラグがOFFのときlabelにジャンプする分岐命令である。なお、上記の分岐命令(beq命令とbne命令)のサイクル数は、CPU20が分岐予測を行わない場合または分岐予測に失敗する場合に要するサイクル数である。
addx命令は、AにBを加え、キャリーフラグがONのときは更に1を加える算術演算命令である。なお、キャリーフラグのONは数値「1」に相当し、キャリーフラグのOFFは数値「0」に相当する。subx命令は、AからBを引き、キャリーフラグがONのときは更に1を引く算術演算命令である。subcc命令は、AからBを引く算術演算命令である。subcc命令を実行したとき、A<Bであればボローが発生するためキャリーフラグがONになる。また、演算結果がゼロであればゼロフラグがONになる。
xor命令は、オペランドA,Bの論理和を求める論理演算命令である。andcc命令は、オペランドA,Bの論理積を求める論理演算命令である。andcc命令を実行したとき、演算結果の全てのビットが0であればゼロフラグがONになる。orcc命令は、オペランドA,Bの論理和を求める論理演算命令である。orcc命令を実行したとき、演算結果の全てのビットが0であればゼロフラグがONになる。なお、addx命令、subx命令、subcc命令、andcc命令およびorcc命令は、ステータスレジスタを参照または更新するプロセッサアーキテクチャ依存の命令である。
次に、分岐命令を削減する最適化処理について説明する。
図6は、連続する分岐命令を含むコードの例を示す図である。
コンパイル装置100は、ソースコードの解析において、コード201をコード202に変換する。また、コンパイル装置100は、分岐命令削減の最適化において、コード202からコード203を抽出し、コード203からコード204を生成する。図6では、コード201をソースコード形式で記載している。また、分岐命令削減の最適化は中間コードに対して行われるが、理解を容易にするためコード202,203もソースコード形式で記載している。コード204は、CPU20がサポートする命令レベルのアセンブリコード形式または疑似アセンブリコード形式で記載している。
コード201には、引数が文字で戻り値が真偽値である関数fooが定義されている。関数fooは、変数cの値がスペース群,「”」,「’」,「/」,「;」,「{」,「}」の何れかと一致するとき偽を返し、何れとも一致しないとき真を返す。なお、図6に示したコード201では、「’」は文字定数の開始または終了を示す特殊文字であるため、エスケープシーケンスとして「¥’」と記述している。
コード202には、コード201と同様の関数fooが定義されている。ただし、コード202では、変数cの値と比較される比較値が、文字コードに相当する整数に置換されている。「10」は改行の種類の1つであるラインフィード(LF)を示し、「32」はスペース(SP)を示し、「9」はタブ(HT)を示し、「13」は改行の種類の1つであるキャリッジリターン(CR)を示す。これら4つの整数は、コード201のスペース群に対応する。「34」は「”」を示し、「39」は「’」を示し、「47」は「/」を示し、「59」は「;」を示し、「123」は「{」を示し、「125」は「}」を示す。コンピュータ内部では、変数cの値も文字コードに相当する整数として扱われるため、コード202は、変数cの値と10個の整数との比較を表している。
コード203は、コード202の中から所定の条件を満たすコード部分を抽出したものである。ここでは、所定の条件を満たすコード部分は、共通の変数の値と固定の整数それぞれとを比較する複数の比較演算を含み、何れか1つの比較結果が「不一致」である(または、何れか1つの比較結果が「一致」である)ときに、共通の処理を行うものである。コード203では、10個の比較演算を通じて全体の真偽値が決まる。変数cの値が「10」,「32」,「9」,「13」,「34」,「39」,「47」,「59」,「123」,「125」の順に比較される。変数cの値が何れか1つの固定の整数と一致すれば、全体の真偽値が偽であると確定するため、それ以降の比較演算を省略できる。
コード204は、コード203の処理を、CPU20がサポートするcmp命令(比較命令)とbeq命令(分岐命令)を用いて表現したものである。コード204は、10個のcmp命令と10個のbeq命令を含む。まず変数cの値と「10」を比較するcmp命令が実行され、その比較結果が「一致」のとき(zero=ONのとき)labelAにジャンプするbeq命令が実行される。labelAが示すジャンプ先は、例えば、関数fooの戻り値を偽に設定する命令とする。c=10でなければ、次に変数cの値と「32」を比較するcmp命令が実行され、その比較結果が「一致」のときlabelAにジャンプするbeq命令が実行される。以下同様に、変数cの値と固定の整数とを比較するcmp命令と、labelAにジャンプするbeq命令とが交互に実行される。
図7は、コードのパターンと変換規則の例を示す図である。
コンパイル装置100は、図6の変換の後、パターン145に該当するコードを、変換規則146または変換規則147を用いて分岐命令の数の少ないコードに変換する。変換規則146,147は、前述の制御情報記憶部143に記憶されている。
パターン145は、アセンブリコード形式または疑似アセンブリコード形式の4個の命令を含む。1番目は、変数cの値と整数T1とを比較するcmp命令である。2番目は、1番目のcmp命令の比較結果に応じてジャンプするか否か判断するbeq命令である。3番目は、変数cの値と整数T2とを比較するcmp命令である。4番目は、3番目のcmp命令の比較結果に応じてジャンプするか否か判断するbeq命令である。すなわち、パターン145は、ジャンプ先が同一であり整数の比較演算の結果に応じてジャンプするか否か判断される、比較演算2回分の連続する分岐処理を示している。
変換規則146は、アセンブリコード形式または疑似アセンブリコード形式の8個の命令を含む。この8個の命令の中には、ステータスレジスタ26の値を利用するプロセッサアーキテクチャ依存の論理演算命令および算術演算命令が含まれる。
1番目は、変数cの値と整数T1との間の排他的論理和を計算するxor命令である。レジスタr1に格納されるxor命令の結果は、c=T1のときのみゼロになる。2番目は、変数cの値と整数T2との排他的論理和を求めるxor命令である。レジスタr2に格納されるxor命令の結果は、c=T2のときのみゼロになる。
3番目は、0−r1を計算するsubcc命令である。キャリーフラグは、r1=0のとき(c=T1のとき)OFFになり、それ以外のときONになる。4番目は、0−(−1)を計算するsubx命令である。レジスタr3に格納されるsubx命令の結果は、キャリーフラグがOFFのとき(c=T1のとき)1になり、キャリーフラグがONのとき(c=T1でないとき)ゼロになる。5番目は、0−r2を計算するsubcc命令である。キャリーフラグは、r2=0のとき(c=T2のとき)OFFになり、それ以外のときONになる。6番目は、0−(−1)を計算するsubx命令である。レジスタr4に格納されるsubx命令の結果は、キャリーフラグがOFFのとき(c=T2のとき)1になり、キャリーフラグがONのとき(c=T2でないとき)ゼロになる。
7番目は、レジスタr3の値とレジスタr4の値との間の論理和を計算するorcc命令である。ゼロフラグは、r3=1またはr4=1のとき(c=T1またはc=T2のとき)OFFになり、r3=0かつr4=0のとき(c=T1でなくc=T2でないとき)ONになる。8番目は、ゼロフラグがOFFのとき(c=T1またはc=T2のとき)、パターン145が示すlabelAにジャンプするbne命令である。
パターン145に含まれる分岐命令は2個であるのに対し、変換規則146に含まれる分岐命令は1個である。変換規則146に基づいてコードを変換することで、分岐命令の数が2分の1に減少する。一方、パターン145に含まれる命令の総数は4個であるのに対し、変換規則146に含まれる命令の総数は8個である。変換規則146に基づいてコードを変換することで、命令の総数が2倍に増加する。一般に、分岐命令はその後の命令の投入待ちや分岐予測ミスのペナルティを発生させることがあり、パイプラインの利用率を低下させるため、実行時間が他の命令より長くなる傾向になる。しかし、変換後のコードの実行時間が変換前より短くなるか否かは、プロセッサアーキテクチャに依存する。
変換規則147は、アセンブリコード形式または疑似アセンブリコード形式の8個の命令を含む。1,2,3,5番目の命令は、変換規則146と同じである。
4番目は、0+0を計算するaddx命令である。レジスタr3に格納されるaddx命令の結果は、キャリーフラグがOFFのとき(c=T1のとき)ゼロになり、キャリーフラグがONのとき(c=T1でないとき)1になる。同様に、6番目は、0+0を計算するaddx命令である。レジスタr4に格納されるaddx命令の結果は、キャリーフラグがOFFのとき(c=T2のとき)ゼロになり、キャリーフラグがONのとき(c=T2でないとき)1になる。
7番目は、レジスタr3の値とレジスタr4の値との間の論理積を計算するandcc命令である。ゼロフラグは、r3=0またはr4=0のとき(c=T1またはc=T2のとき)ONになり、r3=1かつr4=1のとき(c=T1でなくc=T2でないとき)OFFになる。8番目は、ゼロフラグがONのとき(c=T1またはc=T2のとき)、パターン145が示すlabelAにジャンプするbeq命令である。
このような変換規則147を用いても、変換規則146と同様に分岐命令を削減することができる。また、キャリーフラグなどのステータスレジスタ26の値を参照する算術演算命令を用いることで、ステータスレジスタ26の値を参照しない一般的な算術演算命令を用いる場合よりも、汎用レジスタの使用量を削減できる。よって、汎用レジスタが枯渇することによるメモリアクセスの増大を抑制でき、論理演算命令や算術演算命令の増加の影響を抑制できる。なお、変換規則146,147は一例であり、コンパイル装置100は、パターン145よりも分岐命令が少なくなる他の変換規則を用いてもよい。
図8は、変換後のコードに基づく条件分岐の計算例を示す図である。
ここでは、コード204の先頭にある4個の命令を、変換規則146を用いて変換することを考える。生成されるコード211は、変換規則146のパラメータであるT1に「10」を代入し、パラメータであるT2に「32」を代入したものである。
c=10が入力された場合、CPU20は、コード211に従って計算212を実行する。1番目のxor命令では、c=10と「10」が一致するためr1=0になる。2番目のxor命令では、c=10と「32」が一致しないためr2=0x2Aになる。3番目のsubcc命令では、r1=0であるためキャリーフラグがOFFになる。4番目のsubx命令では、キャリーフラグがOFFであるためr3=1になる。5番目のsubcc命令では、r2=0x2AであるためキャリーフラグがONになる。6番目のsubx命令では、キャリーフラグがONであるためr4=0になる。7番目のorcc命令では、r3=1,r4=0であるためゼロフラグがOFFになる。8番目のbne命令では、ゼロフラグがOFFであるため、labelAへのジャンプが発生する。これは、2個のcmp命令と2個のbne命令を用いた変換前のコードと同じ動作になる。
一方、c=2が入力された場合、CPU20は、コード211に従って計算213を実行する。1番目のxor命令では、c=2と「10」が一致しないためr1=0x08になる。2番目のxor命令では、c=2と「32」が一致しないためr2=0x22になる。3番目のsubcc命令では、r1=0x08であるためキャリーフラグがONになる。4番目のsubx命令では、キャリーフラグがONであるためr3=0になる。5番目のsubcc命令では、r2=0x22であるためキャリーフラグがONになる。6番目のsubx命令では、キャリーフラグがONであるためr4=0になる。7番目のorcc命令では、r3=0,r4=0であるためゼロフラグがONになる。8番目のbne命令では、ゼロフラグがONであるため、labelAへのジャンプが発生しない。これは、2個のcmp命令と2個のbne命令を用いた変換前のコードと同じ動作になる。
図9は、連続する分岐命令を含むコードの変換例を示す図である。
コンパイル装置100は、コード204に含まれる2個の比較命令と2個の分岐命令を一組にして変換規則146を適用することで、コード204をコード205に変換することができる。コード204の連続する4個の命令に対応して、コード205の連続する8個の命令が生成される。すなわち、コード204は10個の分岐命令を含む20個の命令を有するのに対し、コード205は5個の分岐命令を含む40個の命令を有する。
コード204とコード205の何れの方が実行時間が短いかは、プロセッサアーキテクチャに依存する。そこで、コンパイル装置100は、プロセッサ情報144に記載された各命令のサイクル数に基づいて、コード204の実行に要するサイクル数とコード205の実行に要するサイクル数とを見積もり、サイクル数の小さい方のコードを採用する。
ここでは、cmp命令は1サイクル、beq命令は10サイクルである。よって、コード204のサイクル数は、(1×1個+10×1個)×10回=110サイクルである。一方、xor命令が1サイクル、subcc命令が1サイクル、subx命令が1サイクル、orcc命令が1サイクル、bne命令が10サイクルである。よって、コード205のサイクル数は、(1×2個+1×2個+1×2個+1×1個+10×1個)×5回=85サイクルである。コード204よりコード205の方がサイクル数が小さいため、コンパイル装置100は、コード204からコード205への最適化を採用する。
図10は、変換前後の条件分岐の制御構造例を示す図である。
コード204を実行した場合、最大で分岐処理220〜229が逐次的に実行される。分岐処理220では、c=10のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理221に進む。分岐処理221では、c=32のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理222に進む。分岐処理222では、c=9のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理223に進む。分岐処理223では、c=13のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理224に進む。分岐処理224では、c=34のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理225に進む。
分岐処理225では、c=39のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理226に進む。分岐処理226では、c=47のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理227に進む。分岐処理227では、c=59のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理228に進む。分岐処理228では、c=123のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理229に進む。分岐処理229では、c=125のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき戻り値を真に設定する処理に進む。
コード204を実行した場合、最大で分岐処理230〜234が逐次的に実行される。分岐処理230では、c=10またはc=32のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理231に進む。分岐処理231では、c=9またはc=13のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理232に進む。分岐処理232では、c=34またはc=39のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理233に進む。分岐処理233では、c=47またはc=59のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき分岐処理234に進む。分岐処理234では、c=123またはc=125のとき戻り値を偽に設定する処理にジャンプし、それ以外のとき戻り値を真に設定する処理に進む。
このように、分岐命令削減の最適化を行うと、1個の比較値に対して1回の分岐命令を実行する代わりに、連続する2個の比較値に対して1回の分岐命令が実行される。第2の実施の形態では、2個の比較値に対して1回の分岐命令を実行しているが、3個以上の比較値に対して1回の分岐命令を実行するようにすることも可能である。
ただし、n個(nは2以上の整数)の比較値に対して1回の分岐命令を実行する場合、変数cの値が1番目の比較値と一致していても、残りのn−1個の比較値についての演算が省略されず実行されることになる。よって、nの値は、変換前のコード204では省略されていた比較演算の一部が省略されないことによる実行時間の増加も考慮して、適切な値に設定されることが好ましい。通常、n=2とすることで分岐処理の実行時間を良好に削減できる。コンパイル装置100は、変数cの値が列挙された比較値の何れかと一致する確率を考慮して、nの値を動的に決定してもよい。
次に、コンパイル装置100によるコンパイルの手順について説明する。
図11は、コンパイルの手順例を示すフローチャートである。
(S1)中間コード生成部133は、ソースファイル121から読み込まれたソースコードを解析し、ソースコードを中間コードに変換して中間コード記憶部134に格納する。ソースコードの解析には、字句解析、構文解析、意味解析などが含まれる。
(S2)最適化部140は、中間コード記憶部134に記憶された中間コードに対して汎用的な最適化を実行し、中間コードを書き換える。汎用的な最適化には、使用されていない変数の削除、静的に決定できる値のみに依存する計算式の定数化、複数の計算式に共通に含まれる部分式の計算結果の再利用などが含まれる。
(S3)最適化部140は、中間コードの中から依存関係がなく並列に実行可能な命令を検出し、検出した命令が並列に実行されるように中間コードを書き換える。並列化には、ループ内の命令を展開(アンローリング)し、元のループのi回目の処理(iは1以上の整数)とi+1回目の処理とを並列化することが含まれる。
(S4)最適化部140は、ターゲットのプロセッサがSIMD(Single Instruction Multiple Data)命令をサポートしているとき、中間コードの中から依存関係がなく演算の種類が同じ2以上のスカラ命令を検出し、検出した命令をSIMD命令に変換する。SIMD命令は、2以上のデータの組に対して同じ演算を並列に実行する命令である。
(S5)最適化部140は、中間コードで使用されている命令形式を、ターゲットのプロセッサがサポートする命令セットの命令形式に書き換える。すなわち、最適化部140は、プロセッサ非依存の中間コードをプロセッサ依存の中間コードに書き換える。なお、ターゲットのプロセッサは、コンパイル時にユーザから指定されてもよい。そのとき、最適化部140は、指定されたプロセッサに対応するプロセッサ情報を参照してもよい。
(S6)最適化部140は、プロセッサアーキテクチャ依存の命令を活用することで実行時間を短縮できるとき、プロセッサアーキテクチャ依存の最適化を行う。プロセッサアーキテクチャ依存の最適化には、図5の命令群を用いた分岐命令削減などが含まれる。
(S7)最適化部140は、並列性やパイプラインの利用率が向上するように、中間コードに含まれる命令の実行順序を入れ替え、中間コードを書き換える。
(S8)アセンブリコード生成部135は、中間コード記憶部134に格納された中間コードから、機械語の命令に対応するアセンブリコードを生成する。
(S9)ファイル出力部136は、ファイル記憶部120にオブジェクトファイル122を生成する。ファイル出力部136は、ステップS8で生成されたアセンブリコードを機械可読なオブジェクトコードに変換し、オブジェクトファイル122に書き込む。オブジェクトファイル122は、リンカ150によって他のオブジェクトファイルやライブラリとリンクされ、実行ファイル123に変換されることになる。
図12は、分岐命令削減の手順例を示すフローチャートである。
このフローチャートが示す処理は、上記のステップS6の中で実行される。
(S10)解析部141は、命令iとして中間コードの最初の命令を選択する。
(S11)解析部141は、命令iがNULLである(存在しない)か判断する。NULLの場合は最適化が終了し、NULLでない場合はステップS12に処理が進む。
(S12)解析部141は、命令jとして命令iの次の命令を選択する。
(S13)解析部141は、命令iの種類を確認し、命令iがcmp命令(比較命令)であるか判断する。命令iがcmp命令の場合はステップS14に処理が進み、cmp命令でない場合はステップS16に処理が進む。
(S14)解析部141は、命令j(cmp命令の次の命令)の種類を確認し、命令jがbeq命令(分岐命令)であるか判断する。命令jがbeq命令の場合はステップS15に処理が進み、beq命令でない場合はステップS16に処理が進む。
(S15)解析部141は、命令i(cmp命令)の第2オペランドとして指定された比較値が、定数かつ整数であるか判断する。比較値が定数かつ整数の場合はステップS17に処理が進み、それ以外の場合はステップS16に処理が進む。
(S16)解析部141は、新たな命令iとして、中間コードの中から現在の命令iの次の命令を選択する。そして、ステップS11に処理が進む。
(S17)解析部141は、比較値配列Vecの末尾に命令iの比較値を追加する。比較値配列Vecは、RAM102に記憶される可変長配列(ベクタ)である。
(S18)解析部141は、命令i(cmp命令)の第1オペランドとして指定された変数をvarと置き、命令j(beq命令)のジャンプ先をlabelと置き、命令jの次の命令を命令nと置く。そして、ステップS19に処理が進む。
図13は、分岐命令削減の手順例を示すフローチャート(続き1)である。
(S19)解析部141は、命令nがNULLであるか判断する。NULLの場合はステップS28に処理が進み、NULLでない場合はステップS20に処理が進む。
(S20)解析部141は、命令mとして命令nの次の命令を選択する。
(S21)解析部141は、命令nの種類を確認し、命令nがcmp命令(比較命令)であるか判断する。命令nがcmp命令の場合はステップS22に処理が進み、cmp命令でない場合はステップS28に処理が進む。
(S22)解析部141は、命令n(cmp命令)の第1オペランドとして指定された変数がvar(命令iの変数)と同一か判断する。変数が同一の場合はステップS23に処理が進み、同一でない場合はステップS28に処理が進む。
(S23)解析部141は、命令m(cmp命令の次の命令)の種類を確認し、命令mがbeq命令(分岐命令)であるか判断する。命令mがbeq命令の場合はステップS24に処理が進み、beq命令でない場合はステップS28に処理が進む。
(S24)解析部141は、命令n(cmp命令)の第2オペランドとして指定された比較値が、定数かつ整数であるか判断する。比較値が定数かつ整数の場合はステップS25に処理が進み、それ以外の場合はステップS28に処理が進む。
(S25)解析部141は、命令m(beq命令)のオペランドとして指定されたジャンプ先がlabel(命令jのジャンプ先)と同一か判断する。ジャンプ先が同一の場合はステップS26に処理が進み、同一でない場合はステップS28に処理が進む。
(S26)解析部141は、比較値配列Vecの末尾に命令nの比較値を追加する。
(S27)解析部141は、新たな命令nとして、中間コードの中から現在の命令mの次の命令を選択する。そして、ステップS19に処理が進む。
(S28)解析部141は、新たな命令iとして、中間コードの中から現在の命令mの次の命令を選択する。そして、ステップS29に処理が進む。
図14は、分岐命令削減の手順例を示すフローチャート(続き2)である。
(S29)解析部141は、比較値配列Vecの要素数をsizeと置く。
(S30)解析部141は、sizeが奇数であるか判断する。sizeが奇数の場合はステップS31に処理が進み、偶数の場合はステップS32に処理が進む。
(S31)解析部141は、比較値配列Vecから末尾の要素を削除することで、sizeを偶数にする。削除された比較値をもつcmp命令は最適化の対象から外される。
(S32)解析部141は、制御情報記憶部143に記憶されたプロセッサ情報144を参照する。複数のプロセッサアーキテクチャに対応するプロセッサ情報が制御情報記憶部143に記憶されている場合、解析部141は、ユーザが指定したプロセッサについてのプロセッサ情報を参照する。そして、解析部141は、cmp命令のサイクル数をta、beq命令およびbne命令のサイクル数をtb、xor命令のサイクル数をtc、subcc命令のサイクル数をtd、subx命令およびaddx命令のサイクル数をte、orcc命令およびandcc命令のサイクル数をtfと置く。
(S33)解析部141は、比較値配列Vecに格納された比較値の範囲の分岐処理について、最適化前のサイクル数beforeと最適化後のサイクル数afterを算出する。beforeは(ta+tb)×sizeと算出でき、afterは(tb+2tc+2td+2te+tf)×size÷2と算出できる。
(S34)解析部141は、最適化後のサイクル数afterが最適化前のサイクル数beforeより小さいか、すなわち、最適化によって実行時間の短縮が期待できるか判断する。afterがbeforeより小さい場合はステップS35に処理が進み、afterがbefore以上である場合はステップS36に処理が進む。
(S35)解析部141は、分岐命令削減の最適化を行うことを決定する。最適化実行部142は、比較値配列Vecの要素(比較値配列Vecに格納された比較値)を先頭から順に2個ずつペアにして取り出し、制御情報記憶部143に記憶された変換規則146を適用して、最適化した中間コードを生成する。
(S36)解析部141は、比較値配列Vecに格納された比較値を全て削除する(比較値配列Vecの要素をクリアする)。そして、ステップS11に処理が進む。
このように、解析部141は、中間コードの中から所定の条件を満たす分岐処理に関する命令群を検出する。検出する命令群は、次の条件を満たす連続した命令の集合である。(1)cmp命令(比較命令)とbeq命令(分岐命令)とが交互に連続していること。(2)cmp命令の第1オペランドで指定される変数が全て同一であること。(3)cmp命令の第2のオペランドで指定される比較値が定数かつ整数であること。(4)beq命令のオペランドで指定されるジャンプ先が全て同一であること。最適化実行部142は、検出された命令群毎に、subcc命令・subx命令・orcc命令などのプロセッサアーキテクチャ依存の論理演算命令と算術演算命令を用いて、分岐命令を削減する。
図15は、比較値配列の例を示す図である。
比較値配列148は、分岐命令削減の最適化において解析部141が生成する。比較値配列148は、インデックスおよび比較値の項目を含む。インデックスは、比較値配列148の要素を識別する識別番号である。比較値は、cmp命令の第2オペランドとして指定される整数である。解析部141がコード204を解析する場合、比較値配列148には、「10」,「32」,「9」,「13」,「34」,「39」,「47」,「59」,「123」,「125」の順に比較値が格納される。
ところで、図10に示したように、変換前のコード204においても変換後のコード205においても、複数の比較値についての分岐処理がコンパイル時に決められる順序で連続的に実行される。この場合、変数cの値が早い段階で比較される比較値と一致していれば、それ以降の比較値についての分岐処理を省略することができる。例えば、図10のフローの場合、c=32であれば、以降の「9」,「13」,「34」,「39」,「47」,「59」,「123」,「125」についての分岐処理を省略できる。
そこで、出現確率の高い比較値についての分岐処理が先に実行されることが好ましい。これを実現する1つの方法として、最適化前のオブジェクトコードをCPU20に仮に実行させて、各命令の実行回数などを示す実行時情報を収集し、コンパイル装置100が実行時情報を参照して複数の比較値の順序を入れ替えることが考えられる。
図16は、実行時情報の例を示す図である。
実行時情報149は、コード204に相当するオブジェクトコードをCPU20が実行したときに収集される情報である。実行時情報149は、比較値、ジャンプ回数および割合の項目を含む。比較値は、コード204のcmp命令(比較命令)の第2オペランドで指定される固定の整数である。ジャンプ回数は、その比較値をもつcmp命令の直後のbeq命令(分岐命令)でジャンプが発生した回数である。割合は、実行時情報149に列挙されたジャンプ回数の合計に対する、ある比較値のジャンプ回数が占める割合である。
図16の例では、c=10の割合が1.5%、c=32の割合が2.5%、c=9の割合が21.0%、c=13の割合が5.0%、c=34の割合が3.0%、c=39の割合が19.0%、c=47の割合が22.0%、c=59の割合が5.5%、c=123の割合が19.5%、c=125の割合が1.0%である。コンパイル装置100の最適化部140は、最適化処理の中で、分岐命令の実行回数の合計が少なくなるように、実行時情報149を参照して比較値の順序を入れ替えてもよい。
図17は、連続する分岐命令を含むコードの他の変換例を示す図である。
実行時情報149によれば、出現確率の高い順に比較値を並べると、「47」,「9」,「123」,「39」,「59」,「13」,「34」,「32」,「10」,「125」となる。そこで、最適化部140は、例えば、コード202をコード206に変換する。コード206では、10個の比較値が出現確率の高い順に並んでいる。これにより、実質的な分岐命令の実行回数を削減でき、実行時間を短縮できる。
比較値の順序の入れ替えは、プロセッサアーキテクチャ依存の論理演算命令や算術演算命令を用いた分岐命令の削減と組み合わせて行うことができる。なお、この2つの最適化方法の一方のみを実行する場合、後者の最適化は前者の最適化と比べて次のような利点を有する。(1)複数の比較値の間で出現確率の偏りが小さい場合や、入力値が何れの比較値とも一致しない確率が高い場合でも、十分な実行時間短縮の効果が得られる。(2)実行時情報149を収集しなくても、分岐処理の最適化を行える。これは特に、計算量の多いプログラムを扱うときに利点が大きい。(3)2回以上コンパイルを行わなくてよい。これは、コンパイル時間が長い複雑なプログラムを扱うときに利点が大きい。
第2の実施の形態のコンパイル装置100によれば、オブジェクトコードに含まれる分岐命令が減少する。よって、パイプラインへの後続の命令の投入待ちや分岐予測ミスのペナルティの発生を抑制でき、オブジェクトコードの実行効率を向上させることができる。特に、分岐予測の精度が高くないプロセッサでは、実行効率を大きく向上できる。また、変換前のサイクル数と変換後のサイクル数とを試算して実行時間の減少が期待できるか確認することで、命令数の増加する最適化が可能となる。また、ステータスレジスタ26の値を利用するプロセッサアーキテクチャ依存の算術演算命令を用いることで、汎用レジスタの使用量を削減でき、論理演算命令や算術演算命令の増加の影響を抑制できる。
なお、前述のように、第1の実施の形態の情報処理は、コンパイル装置10にプログラムを実行させることで実現することができる。第2の実施の形態の情報処理は、コンパイル装置100にプログラムを実行させることで実現することができる。
プログラムは、コンピュータ読み取り可能な記録媒体(例えば、記録媒体113)に記録しておくことができる。記録媒体としては、例えば、磁気ディスク、光ディスク、光磁気ディスク、半導体メモリなどを使用できる。磁気ディスクには、FDおよびHDDが含まれる。光ディスクには、CD、CD−R(Recordable)/RW(Rewritable)、DVDおよびDVD−R/RWが含まれる。プログラムは、可搬型の記録媒体に記録されて配布されることがある。その場合、可搬型の記録媒体からHDDなどの他の記録媒体(例えば、HDD103)にプログラムをコピーして(インストールして)実行してもよい。
10 コンパイル装置
11 記憶部
12 変換部
13,14 コード
13a,13b,14e 分岐命令
14a,14b 論理演算命令
14c,14d 算術演算命令

Claims (5)

  1. コンピュータに、
    第1のコードの中から、それぞれ整数を対象とした比較演算の結果に応じて分岐処理を行う、ジャンプ先が同一である複数の分岐命令を検出し、
    前記複数の分岐命令を、論理演算命令および算術演算命令を用いて分岐命令の数が前記複数の分岐命令よりも少ない変換命令群に変換し、
    前記変換命令群に基づく処理のサイクル数が、前記複数の分岐命令に基づく処理のサイクル数より少ないとき、前記変換命令群を用いた第2のコードを生成する、
    処理を実行させるコンパイルプログラム。
  2. 前記論理演算命令および前記算術演算命令の少なくとも1つは、ステータスレジスタに記憶されたフラグを参照するプロセッサ依存の命令である、
    請求項1記載のコンパイルプログラム。
  3. 前記複数の分岐命令は、入力値と第1の整数との比較の結果に基づいて前記ジャンプ先にジャンプするか判断する第1の分岐命令と、前記入力値と第2の整数との比較の結果に基づいて前記ジャンプ先にジャンプするか判断する第2の分岐命令とを含み、
    前記変換命令群は、前記入力値と前記第1の整数と前記第2の整数とから算出される判定値に基づいて前記ジャンプ先にジャンプするか判断する第3の分岐命令を含む、
    請求項1または2記載のコンパイルプログラム。
  4. コンピュータが実行するコンパイル方法であって、
    第1のコードの中から、それぞれ整数を対象とした比較演算の結果に応じて分岐処理を行う、ジャンプ先が同一である複数の分岐命令を検出し、
    前記複数の分岐命令を、論理演算命令および算術演算命令を用いて分岐命令の数が前記複数の分岐命令よりも少ない変換命令群に変換し、
    前記変換命令群に基づく処理のサイクル数が、前記複数の分岐命令に基づく処理のサイクル数より少ないとき、前記変換命令群を用いた第2のコードを生成する、
    コンパイル方法。
  5. それぞれ整数を対象とした比較演算の結果に応じて分岐処理を行う、ジャンプ先が同一である複数の分岐命令を含む第1のコードを記憶する記憶部と、
    前記複数の分岐命令を、論理演算命令および算術演算命令を用いて分岐命令の数が前記複数の分岐命令よりも少ない変換命令群に変換し、前記変換命令群に基づく処理のサイクル数が前記複数の分岐命令に基づく処理のサイクル数より少ないとき、前記変換命令群を用いた第2のコードを生成する変換部と、
    を有するコンパイル装置。
JP2014080869A 2014-04-10 2014-04-10 コンパイルプログラム、コンパイル方法およびコンパイル装置 Pending JP2015201119A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2014080869A JP2015201119A (ja) 2014-04-10 2014-04-10 コンパイルプログラム、コンパイル方法およびコンパイル装置
US14/662,648 US9395986B2 (en) 2014-04-10 2015-03-19 Compiling method and compiling apparatus

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2014080869A JP2015201119A (ja) 2014-04-10 2014-04-10 コンパイルプログラム、コンパイル方法およびコンパイル装置

Publications (1)

Publication Number Publication Date
JP2015201119A true JP2015201119A (ja) 2015-11-12

Family

ID=54265141

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014080869A Pending JP2015201119A (ja) 2014-04-10 2014-04-10 コンパイルプログラム、コンパイル方法およびコンパイル装置

Country Status (2)

Country Link
US (1) US9395986B2 (ja)
JP (1) JP2015201119A (ja)

Cited By (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9321803B2 (en) 2013-07-12 2016-04-26 Children's Hospital Medical Center Compositions and methods for inhibiting norovirus infection
JP2023501763A (ja) * 2020-10-21 2023-01-19 チャリオット・テクノロジーズ・ラボ・インコーポレイテッド 算術および/またはビット単位ユニットによる条件文の実行
US11833198B2 (en) 2017-03-28 2023-12-05 Children's Hospital Medical Center Norovirus S particle based vaccines and methods of making and using same

Families Citing this family (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9529622B1 (en) * 2014-12-09 2016-12-27 Parallel Machines Ltd. Systems and methods for automatic generation of task-splitting code
JP6536266B2 (ja) * 2015-08-03 2019-07-03 富士通株式会社 コンパイル装置、コンパイル方法およびコンパイルプログラム
US9727353B2 (en) * 2015-10-30 2017-08-08 International Business Machines Corporation Simultaneously capturing status information for multiple operating modes
JP6759851B2 (ja) * 2016-08-22 2020-09-23 富士通株式会社 プログラム生成プログラム、プログラム生成方法、プログラム生成装置及びコンパイルプログラム
CN111258590B (zh) * 2020-05-06 2020-08-18 华控清交信息科技(北京)有限公司 一种代码执行方法、装置和用于代码执行的装置

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07114473A (ja) * 1993-10-19 1995-05-02 Fujitsu Ltd コンパイラの命令列最適化方法
JP2000222218A (ja) * 1999-02-01 2000-08-11 Fujitsu Ltd コンパイル装置および記録媒体
JP2001265605A (ja) * 2000-01-12 2001-09-28 Fujitsu Ltd コンパイラの命令列最適化方法、コンパイラ装置、記録媒体、及びプログラム
JP2004021553A (ja) * 2002-06-14 2004-01-22 Matsushita Electric Ind Co Ltd プロセッサ、プログラム変換装置及びプログラム変換方法、並びにコンピュータプログラム
US8667476B1 (en) * 2009-01-20 2014-03-04 Adaptmicrosys LLC Instruction grouping and ungrouping apparatus and method for an adaptive microprocessor system

Family Cites Families (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6662294B1 (en) * 2000-09-28 2003-12-09 International Business Machines Corporation Converting short branches to predicated instructions
JP4045802B2 (ja) 2002-01-08 2008-02-13 ソニー株式会社 プログラム処理装置及びプログラム処理方法、記憶媒体、並びにコンピュータ・プログラム
JP2008165589A (ja) * 2006-12-28 2008-07-17 Fujitsu Ltd 情報処理装置
US8418154B2 (en) 2009-02-10 2013-04-09 International Business Machines Corporation Fast vector masking algorithm for conditional data selection in SIMD architectures
US20100262813A1 (en) * 2009-04-14 2010-10-14 International Business Machines Corporation Detecting and Handling Short Forward Branch Conversion Candidates

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPH07114473A (ja) * 1993-10-19 1995-05-02 Fujitsu Ltd コンパイラの命令列最適化方法
JP2000222218A (ja) * 1999-02-01 2000-08-11 Fujitsu Ltd コンパイル装置および記録媒体
JP2001265605A (ja) * 2000-01-12 2001-09-28 Fujitsu Ltd コンパイラの命令列最適化方法、コンパイラ装置、記録媒体、及びプログラム
JP2004021553A (ja) * 2002-06-14 2004-01-22 Matsushita Electric Ind Co Ltd プロセッサ、プログラム変換装置及びプログラム変換方法、並びにコンピュータプログラム
US8667476B1 (en) * 2009-01-20 2014-03-04 Adaptmicrosys LLC Instruction grouping and ungrouping apparatus and method for an adaptive microprocessor system

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9321803B2 (en) 2013-07-12 2016-04-26 Children's Hospital Medical Center Compositions and methods for inhibiting norovirus infection
US9561239B2 (en) 2013-07-12 2017-02-07 Children's Hospital Medical Center Compositions and methods for inhibiting norovirus infection
US11833198B2 (en) 2017-03-28 2023-12-05 Children's Hospital Medical Center Norovirus S particle based vaccines and methods of making and using same
JP2023501763A (ja) * 2020-10-21 2023-01-19 チャリオット・テクノロジーズ・ラボ・インコーポレイテッド 算術および/またはビット単位ユニットによる条件文の実行
JP7341258B2 (ja) 2020-10-21 2023-09-08 チャリオット・テクノロジーズ・ラボ・インコーポレイテッド 算術および/またはビット単位ユニットによる条件文の実行

Also Published As

Publication number Publication date
US9395986B2 (en) 2016-07-19
US20150293768A1 (en) 2015-10-15

Similar Documents

Publication Publication Date Title
US9395986B2 (en) Compiling method and compiling apparatus
JP6245031B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイル装置
JP3707727B2 (ja) プログラムの最適化方法及びこれを用いたコンパイラ
JP4042604B2 (ja) プログラム並列化装置,プログラム並列化方法およびプログラム並列化プログラム
US8799881B2 (en) Program parallelization device and program product
JP6398725B2 (ja) コンパイルプログラム、コンパイル方法およびコンパイラ装置
KR20150132884A (ko) 결합된 분기 타깃 및 프레디킷 예측
US9823911B2 (en) Method and apparatus for compiling code based on a dependency tree
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
EP2951682B1 (en) Hardware and software solutions to divergent branches in a parallel pipeline
US10108405B2 (en) Compiling apparatus and compiling method
JP4719415B2 (ja) 情報処理システム及びコード生成方法
US20140344795A1 (en) Computer-readable recording medium, compiling method, and information processing apparatus
Ottlik et al. Context-sensitive timing automata for fast source level simulation
JP2018124877A (ja) コード生成装置、コード生成方法、およびコード生成プログラム
JP7006097B2 (ja) コード生成装置、コード生成方法及びコード生成プログラム
JP2022140995A (ja) 情報処理装置、コンパイルプログラムおよびコンパイル方法
CN216527140U (zh) 一种分支预测的装置及处理器
Zhou et al. Tree traversal scheduling: A global instruction scheduling technique for VLIW/EPIC processors
JP2024030940A (ja) ソースコード変換プログラムおよびソースコード変換方法
JP4721975B2 (ja) コンパイラ装置およびコンパイル方法
JP4006887B2 (ja) コンパイラ、プロセッサおよび記録媒体
So et al. Software thread integration for instruction-level parallelism
Chetverina Alternatives of profile-guided code optimizations for one-stage compilation
JP2021093012A (ja) コンパイルプログラム、および情報処理装置

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20170110

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20171010

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20171017

A02 Decision of refusal

Free format text: JAPANESE INTERMEDIATE CODE: A02

Effective date: 20180605