(57)【特許請求の範囲】
【請求項１】
手続きの呼び出し時に呼び出し側と呼び出された側で引数又は引数と戻り値の受け渡しが行われる手続き呼び出し命令（「コール命令」という）を含むソースプログラムからオブジェクトコードを生成する言語翻訳装置のコール命令並び替え装置において、
前記コール命令を含む命令列を記憶保持する第１の記憶手段と、
前記第１の記憶手段に記憶される命令列から、前記コール命令の引数の値を生成する命令を除外し、さらに、ロード命令とストア命令を並び替え対象外として、除外し、第２の記憶手段に記憶する手段と、
前記第２の記憶手段に記憶された命令列について、各命令を跨いで生存している変数の数を決定し、前記生存する変数の数の最も少ない区間へ、前記コール命令を移動する手段と、
を備えている、ことを特徴とするコール命令並び替え装置。
【請求項２】
ソースプログラムをコンパイル処理して出力される中間語の命令列よりなり、手続き呼び出し命令（「コール命令」という）を含む命令列を記憶保持する第１の記憶手段と、
前記第１の記憶手段に記憶されている中間語の命令列から、前記コール命令の引数の値を設定する命令を除外した命令列を、第２の記憶手段へ保存する手段と、
前記第２の記憶手段に保存されている中間語の命令列から、ロード命令とストア命令を、並び替え対象外として、除外したものを第３の記憶手段へ保存する手段と、
前記第３の記憶手段に保存されている中間語の命令列から、各命令間において各命令を跨いで生存している変数の数を決定し、前記生存する変数の数の最も少ない区間へ、前記コール命令を移動し、第４の記憶手段へ保存する手段と、
を備えている、ことを特徴とするコール命令並び替え装置。
【請求項３】
前記並び替え対象外とされるロード命令とストア命令が、前記コール命令の引数又は戻り値を処理する式に関連する変数を定義するか、該変数を参照する、ロード命令とストア命令である、ことを特徴とする請求項１又は２記載のコール命令並び替え装置。
【請求項４】
中間語からなり、手続き呼び出し命令（「コール命令」という）を含む命令列を記憶保持する第１の命令列テーブルと、
前記第１の命令列テーブルに記憶されている、前記コール命令の引数を処理する式に対応する命令を、並び替えの対象から削除し、引数補正済み命令列テーブルへ残りの命令を保存するコール命令引数補正手段と、
前記引数補正済み命令列テーブルより、ロード命令及びストア命令を、並び替えの対象から削除し、ロード／ストア命令補正済み命令テーブルへ、残りの命令を保存するロード／ストア命令補正手段と、
前記ロード／ストア命令補正済み命令テーブルに保存されている命令列から、各命令間において各命令を跨いで生存している変数の数を決定し、前記生存する変数の数の最も少ない区間へ、前記コール命令を移動し、第２の命令列テーブルに保存するコール命令並び替え手段と、
を備えたことを特徴とするコール命令並び替え装置。
【請求項５】
前記ロード／ストア命令補正手段は、前記コール命令の引数又は戻り値を処理する式に関連する変数を定義するか、前記変数を参照するロード命令とストア命令を、並び替え対象外とする、ことを特徴とする請求項４記載のコール命令並び替え装置。
【請求項６】
前記コール命令並び替え手段は、前記生存する変数の数の最も少ない命令の直前に、前記コール命令を移動する、ことを特徴とする請求項４記載のコール命令並び替え装置。
【請求項７】
ソースプログラムを入力するコンパイル処理によって生成される中間言語の命令列における手続き呼び出し命令（「コール命令」という）の並び替えをコンピュータで行う方法であって、
前記コンパイル処理によって生成される中間語の命令列よりなり、手続き呼び出し命令（「コール命令」という）を含む命令列を記憶保持する第１の記憶手段に記憶されている中間語の命令列から、前記コール命令の引数の値を設定する命令を除外した命令列を、第２の記憶手段へ保存するステップと、
前記第２の記憶手段に保存されている中間語の命令列から、ロード命令、及び、ストア命令を除外したものを第３の記憶手段へ保存するステップと、
前記第３の記憶手段に保存されている中間語の命令列から、各命令間において各命令を跨いで生存している変数の数を決定するステップと、
前記生存する変数の数の最も少ない区間へ、前記コール命令を移動し、第４の記憶手段へ保存するステップと、
を含む、ことを特徴とするコール命令並び替え方法。
【請求項８】
前記コール命令の引数又は戻り値を処理する式に関連する変数を定義するか、前記変数を参照するロード命令とストア命令を、並び替え対象外として、除外する、ことを特徴とする請求項７記載のコール命令並び替え方法。
【請求項９】
前記生存する変数の数の最も少ない命令の直前に、前記コール命令を移動する、ことを特徴とする請求項７記載のコール命令並び替え方法。
【請求項１０】
ソースプログラムを入力するコンパイル処理によって生成される中間言語の命令列における手続き呼び出し命令（「コール命令」という）の並び替えをコンピュータで行うためのプログラムであって、
（ａ）前記コンパイル処理して出力される中間語の命令列よりなり、手続き呼び出し命令（「コール命令」という）を含む命令列を記憶保持する第１の記憶手段に記憶されている中間語の命令列から、前記コール命令の引数の値を設定する命令を除外した命令列を、第２の記憶手段へ保存する処理と、
（ｂ）前記第２の記憶手段に保存されている中間語の命令列から、ロード命令、及び、ストア命令を除外したものを第３の記憶手段へ保存する処理と、
（ｃ）前記第３の記憶手段に保存されている中間語の命令列から、各命令間において各命令を跨いで生存している変数の数を決定する処理と、
（ｄ）前記生存する変数の数の最も少ない区間へ、前記コール命令を移動し、第４の記憶手段へ保存する処理と、
の前記（ａ）乃至（ｄ）の各処理を、前記コンピュータに実行させるためのプログラム。
【請求項１１】
請求項１０記載のプログラムにおいて、
前記生存する変数の数の最も少ない命令の直前に、前記コール命令を移動する処理を、前記コンピュータに実行させるためのプログラム。
【請求項１２】
請求項１０記載のプログラムにおいて、
前記コール命令の引数又は戻り値を処理する式に関連する変数を定義するか、該変数を参照する、ロード命令とストア命令を、並び替え対象外として、除外する処理を、前記コンピュータに実行させるためのプログラム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンパイラ技術に関し、特に、コール命令の並び替え方法と装置に関する。
【０００２】
【従来の技術】
プログラムのサブルーチン、ファンクション等の手続きは、ある一定の処理をまとめたものであり、その手続きを呼出すことで、まとめた処理が実行され、その際、該処理に入力として渡す値、処理からの戻り値の受け渡しが行われる。引数の受け渡しについて説明すると、手続きの呼び出し側と、呼び出された側で、引数と戻り値の受け渡しに使用する記憶域の取り決めを行っておき、呼び出し側で、引数の値を対応する記憶域に格納し、呼び出された側では、対応する記憶域から値を参照することで、受け渡しが行われる。
【０００３】
プログラミング言語で記述されたソースプログラムからオブジェクトコード（機械語）を生成するコンパイラでは、ソースプログラムを入力して字句解析（lexical  analysis）、構文解析（syntax  analysis，parsing）等が行われ、さらに、必要な最適化が行われ、オブジェクトコードが生成される。
【０００４】
従来のコンパイラにおいても、オブジェクトコードの最適化のために、命令の並び替えを行うコンパイラ・システムが知られている。例えば特許２５０１３９４号公報には、手続き呼出しにおける引数領域の使用と定義を解析した上で、引数評価列の評価順序を決定し、決定された評価順序に引数評価列の入れ替えを行うことにより、手続き呼出し時の引数に評価における退避、復元のコードを削減する手続き呼び出し翻訳装置が開示されている。
【０００５】
また中間語の命令並び替えを行い実行速度の速い命令列を生成するコンパイル装置として、例えば特開２０００−２７６３５６号公報には、中間語の命令列を調査し、選ばれなかった命令と依存関係がない命令を選んで命令並び替え範囲を設定し第１の命令列を生成し、第１の命令列の命令並び替え範囲内の命令を中間語より速く実行できるように並び替えて第２の命令列を生成するコンパイル装置が開示されている。さらに、例えば特開平８−８３１８５号公報には、変数の生存区間（変数に格納されている値が有効となる期間）を検出し、生存区間の範囲によって、対応する生存変数集合保持部に変数を格納し、生存区間の範囲によって生存区間の重複検査を必要な割付対象間に対してのみ行うことで、変数の生存区間の重複検査を高速に行うことでコンパイル速度を向上させるコンパイラが開示されている。
【０００６】
しかしながら、従来のコンパイラにおいて、手続き呼び出し命令（コール命令）を跨いでの命令の並び替えは行なわれていない、というのが実情である。その理由として、コール命令を並び替えの対象としても、得られる効果が少ないためと思料される。また、コールを含む命令列に、大量の命令が含まれる場合、メモリへの退避、メモリからの復帰命令が大量に生成され、性能が著しく劣ることも、その理由であるものと思料される。
【０００７】
【発明が解決しようとする課題】
上記した通り、従来のコンパイラにおける、命令の並び替えでは、手続き呼び出し命令の並び替えは行われていず、上位フェーズで出力した中間言語にそのまま依存しており、コール命令の前後を跨いでレジスタの値が破壊されないように、レジスタの保存命令と復帰命令を生成している。すなわち、従来のコンパイラでは、コール命令を並び替えの対象命令としていないため、コール命令を挟んで保証しなければならないレジスタ上の値が存在する場合、メモリへのスピル、および、メモリからレジスタへのリストア命令を挿入し、レジスタの値の保証を行っており、その結果、処理性能の低下を招くことになる。
【０００８】
したがって、本発明が解決しようとする課題は、コール命令を移動することにより、コール命令を挟んで保証しなければならない値を極力少なくすることにより、メモリへのスピル、およびリストアの生成を少なくし、高速に実行可能とする装置及び方法並びにプログラムを提供することにある。
【０００９】
【課題を解決するための手段】
課題を解決するための手段を提供する本発明は、ソースプログラムをコンパイル処理して出力される中間語の命令列よりなり、手続き呼び出し命令（「コール命令」という）を含む命令列を記憶保持する第１の記憶手段に記憶されている中間語の命令列から、前記コール命令の引数の値を設定する命令を除外した命令列を、第２の記憶手段へ保存し、前記第２の記憶手段に保存されている中間語の命令列から、ロード命令、及び、ストア命令を除外したものを第３の記憶手段へ保存し、前記第３の記憶手段に保存されている中間語の命令列から、各命令間において各命令を跨いで生存している変数の数を決定し、前記生存する変数の数の最も少ない区間へ、前記コール命令を移動し、第４の記憶手段へ保存する構成としたものである。
【００１０】
【発明の実施の形態】
発明の実施の形態について説明する。本発明は、手続き呼び出し命令（コール命令）を、上位フェーズ（コンパイラの構文解析、最適化処理等の上位フェーズ）の出力した中間言語に依存せずに、並び替えることにより、レジスタの保存/復帰命令を最小に抑えるように構成したものである。すなわち、アーキテクチャに応じた並び替えを行なう前に、コール命令の適切な位置を求め、並び替える。より詳細には、本発明は、その一実施の形態において、中間語からなり、コール命令を含む命令列を記憶する第１の命令列テーブル（１１１）に含まれるコール命令の引数を処理する式を、コール命令並び替えの対象から削除し、引数補正済み命令列テーブル（１１２）へ残りの命令を保存するコール命令引数補正手段（１０１）と、引数補正済み命令列テーブル（１１２）より、ロード命令及びストア命令を、コール命令並び替えの対象から削除し、ロード／ストア命令補正済み命令テーブル（１１３）へ残りの命令を保存するロード／ストア命令補正手段（１０２）と、ロード／ストア命令補正済み命令テーブル（１１３）に保存されている命令列から、各命令間において各命令を跨いで生存している変数の数を決定し、変数の生存する数の最も少ない区間の命令の前へ、前記コール命令を移動し、第２の命令列テーブル（１１４）に保存するコール命令並び替え手段（１０３）と、を備える。
【００１１】
本発明は、ソースプログラムを入力するコンパイル処理で生成される中間言語に対して、コール命令並び替えをコンピュータで行う方法であって、以下のステップよりなる。
【００１２】
ステップ１：中間語からなり、コール命令を含む命令列を記憶する第１の命令列テーブル（１１１）に含まれるコール命令の引数を処理する式をなす命令列をコール命令並び替えの対象から削除し、引数補正済み命令列テーブル（１１２）へ命令を保存する。
【００１３】
ステップ２：引数補正済み命令列テーブル（１１２）より、ロード命令及びストア命令を、コール命令並び替えの対象から削除し、ロード／ストア命令補正済み命令テーブル（１１３）へ命令を保存する。その際、並び替え対象のコール命令の引数又は戻り値を処理する式に関連する変数を定義するか、該変数を参照する、ロード命令とストア命令を削除すればよい。
【００１４】
ステップ３：ロード／ストア命令補正済み命令テーブル（１１３）に保存されている命令列から、各命令間において各命令を跨いで生存している変数の数を決定し、変数の生存する数の最も少ない区間へ、コール命令を移動し、第２の命令列テーブル（１１４）に保存する。
【００１５】
【実施例】
上記した発明の実施の形態についてさらに詳細に説明すべく、本発明の実施例について図面を参照して説明する。図１は、一般的なコンパイル処理の工程を示している。第１のコンパイル処理をなすフロントエンド１１では、各プログラミング言語で記述されているソースファイル２０を読み込み、字句解析、構文解析を行い、言語に依存しない中間語（中間コード）を生成し、第１の中間語ファイル２１へ出力する。
【００１６】
また、第２のコンパイル処理をなす最適化では、第１の中間語ファイル２１から中間語を入力し、中間語に対して各種最適化を施し、第２の中間語ファイル２２を出力する。なお、第２のコンパイル処理をなす最適化については、文献１（A.V.エイホ、R．セシィ、J.D.  ウルマン、「コンパイラ  Ｉ」、株式会社サイエンス社）等が参照される。
【００１７】
第３のコンパイル処理をなす命令並び替えでは、第２の中間語ファイル２２を入力し、命令の並び替えを行う。そして、命令の並び替えが行われた中間語から、ターゲット装置のオブジェクトコードをオブジェクトファイル２３に出力する。
【００１８】
本発明は、第１、第２のコンパイル処理が行われた後の、中間語の命令列におけるコール命令の並び替えを行うものであり、第１、第２のコンパイル処理は、公知の任意のものが用いられる、またソースプログラムの言語は、C、Fortran等任意であってよい。
【００１９】
図２は、本発明の一実施例の命令並び替え装置の構成を示す図である。図２を参照すると、この実施例の命令並び替え装置は、コール命令引数補正手段１０１と、ロード／ストア命令補正手段１０２と、コール命令並び替え手段１０３と、第１の命令列テーブル１１１と、引数補正済み命令列テーブル１１２と、ロード／ストア命令補正済み命令テーブル１１３と、第２の命令列テーブル１１４と、を備えている。コール命令引数補正手段１０１と、ロード／ストア命令補正手段１０２、コール命令並び替え手段１０３は、コンピュータで実行されるプログラムによりその機能が実現され、第１の命令列テーブル１１１、引数補正済み命令列テーブル１１２と、ロード／ストア命令補正済み命令テーブル１１３と、第２の命令列テーブル１１４は記憶手段に格納される。
【００２０】
これらの各手段は、それぞれ概略つぎのように動作する。コール命令引数補正手段１０１は、第１の命令列テーブル１１１に含まれる各コール命令の引数を処理する式を、命令の並び替え対象から削除し、引数補正済み命令列テーブル１１２へ命令を保存する。なお、並び替え対象外とする設定は、引数補正済み命令列テーブル１１２において、各命令に対応して設けられたフラグ（削除フラグ）をオンとすることで行ってもよい。
【００２１】
ロード／ストア命令補正手段１０２は、引数補正済み命令列テーブル１１２より、ロード命令及びストア命令を、命令の並び替え対象から削除し、ロード／ストア命令補正済み命令テーブル１１３へ命令を保存する。なお、並び替え対象外とする設定は、ロード／ストア命令補正済み命令テーブル１１３において命令に対応して設けられたフラグ（削除フラグ）をオンとすることで行ってもよい。ロード／ストア命令補正手段１０２は、引数補正済み命令列テーブル１１２において、対象となるコール命令の引数又は戻り値に関連する式の変数を定義、参照するロード命令、ストア命令を並び替え対象外とする。並び替え対象のコール命令に関連しないプログラムブロック（中間語）のロード命令とストア命令は削除する必要はないことは勿論である。
【００２２】
コール命令並び替え手段１０３は、コール命令引数補正手段１０１およびロード／ストア命令補正手段１０２によって、コール命令並び替え対象から削除された残りの命令列から、各命令間において、各命令を跨いで生存している変数の数を決定し、最も変数の生存していない区間へ、コール命令を移動する。なお、変数の生存する生存区間とは、変数に保持されている値が有効となる区間であり、変数に値を設定（定義）する中間語の命令から、その定義された値を最後に参照する中間語命令までのプログラムの区間に対応し、変数に値を定義する中間語命令は生存区間の開始点、生存区間中で定義された値を参照している中間語命令のうち最後に参照する中間語命令は、生存区間の終了点に相当する。
【００２３】
次に、図３を参照して、この実施例の動作について詳細に説明する。第１の命令テーブル１１１にあるように、コール命令（CALL）を含む８命令での並び替えを行うものとする。ｔ1〜ｔ４は中間言語で割り付けられる変数（資源）であり、レジスタ等に対応する。
【００２４】
(1)の命令  LD t1 = a  は、ａの値をｔ１にロードする。
(2)の命令  LD t2 = b  は、ｂの値をｔ２にロードする。
(3)の命令  LD t3 = c  は、ｃの値をｔ３にロードする。ａ、ｂ、ｃはメモリのアドレス又はイミーディエット値である。
(4)の命令  CALL  t4 = sub(t1,t2)  は、手続きｓｕｂを引数ｔ１、ｔ２の値を受け渡して呼び出し、手続きｓｕｂの処理の戻り値をｔ４に設定する。
(5)の命令  ADD t5= t1,t2  は、ｔ１とｔ２の加算結果をｔ５にセットする。
(6)の命令  ADD t6= t3,t5  は、ｔ３とｔ５の加算結果をｔ６にセットする。
(7)の命令  ADD t7= t6,t4  は、ｔ６とｔ４の加算結果をｔ７にセットする。
(8)の命令  st [d] = t7  は、ｔ７を、メモリアドレス［ｄ］にストアする。
【００２５】
命令の右端の欄（生存する変数の欄）のｔ１等は、該命令区間で生存する変数の一覧である。
(1)の命令では、変数ｔ１が定義されており、ｔ１の生存区間の開始点となる。
(2)の命令では、変数ｔ２が定義されており、ｔ２の生存区間の開始点となり、ｔ１、ｔ２が生存している。
(3)の命令では、変数ｔ３が定義されており、ｔ３の生存区間の開始点となり、ｔ１、ｔ２、ｔ３が生存している。
(4)の命令では、変数ｔ４が定義されており、ｔ４の生存区間の開始点となり、ｔ１〜ｔ４が生存している。
(5)の命令では、変数ｔ５が定義されており、ｔ５の生存区間の開始点となり、ｔ１〜ｔ５が生存しており、ｔ１、ｔ２の生存区間の終了点となる。
(6)の命令では、変数ｔ６が定義されており、ｔ６の生存区間の開始点となり、ｔ３〜ｔ６が生存しており、ｔ３、ｔ５の生存区間の終了点となる。
(7)の命令では、変数ｔ７が定義されており、ｔ７の生存区間の開始点となり、ｔ４、ｔ６、ｔ７が生存しており、ｔ６、ｔ４の生存区間の終了点となる。
(8)の命令では、変数ｔ７の生存区間の終了点となる。
【００２６】
まず、コール命令引数補正手段１０１において、第１の命令列テーブル１１１の命令列から、(4)のコール命令の引数であるｔ１、およびｔ２の生成命令（ｔ１、ｔ２に値を設定する命令）である(1)の命令（LD t1 =a）および(2)の命令（LD t2 =b）を、並び替え対象外の命令とし、引数補正済み命令列テーブル１１２へ命令を保存する。引数補正済み命令列テーブル１１２において、該当する命令のフラグをオンに設定する。
【００２７】
次に、ロード／ストア命令補正手段１０２において、引数補正済み命令列テーブル１１２より、ロード命令（LD t3 =c）である(3)の命令と、ストア命令である(8)の命令（st  [d]=t7）を、並び替え対象外の命令として、ロード／ストア命令補正済み命令テーブル１１３へ保存する。このロード／ストア命令補正手段１０２は、コール命令とその前後の命令について、命令間の依存関係の元となる変数の値を定義あるいはその変数を参照するロード命令とストア命令を、並び替え対象外として削除する。
【００２８】
コール命令並び替え手段１０３において、ロード／ストア命令補正済み命令テーブル１１３に保存されている命令列の命令(4)から命令(7)の間で、最も変数の生存していない命令を探し出す。
【００２９】
命令(4)から命令(5)に跨がって生存する変数は、ｔ１、ｔ２、ｔ３、ｔ４（ただし、ｔ１、ｔ２の生存区間は命令(4)の区間まで）、
命令(5)から命令(6)に跨がって生存する変数は、ｔ３、ｔ４、ｔ５、
命令(6)から命令(7)に跨がって生存する変数は、ｔ４、ｔ６、
となり、各命令区間に跨がって生存する変数の最も少ない区間は、命令(6)から命令(7)となる。
【００３０】
よって、命令(7)の直前、すなわち命令(6)と(7)の間が、最も適当な位置と判断し、そこへ、コール命令CALL  t4=sub(t1,t2)を移動する。
【００３１】
コール命令を移動した結果が、第２の命令列テーブル１１４に格納され、この中間言語から、ターゲットマシンのオブジェクトコードが生成される。
【００３２】
命令並び替え前の第１の命令列テーブル１１１の場合、コール命令（CALL）を跨いで生存している変数は、ｔ１、ｔ２、ｔ３である。これに対して、第２の命令列テーブル１１４に示されるように、コール命令（CALL）の前後を跨いで生存している変数はｔ６のみとなり、コール命令を挟んで保証しなければならない変数の個数を減少させている。
【００３３】
【発明の効果】
以上説明したように、本発明によれば、コール命令を移動することにより、コール命令を挟んで保証しなければならない変数の個数を減少させることにより、メモリへのスピルおよびリストアの生成を少なくし、高速に実行できるという効果を奏する。
【図面の簡単な説明】
【図１】本発明の一実施例が適用されるコンパイラの処理を説明するための図である。
【図２】本発明の一実施例の構成を示す図である。
【図３】本発明の一実施例を具体的に説明するための図である。
【符号の説明】
１１  フロントエンド（コンパイラ処理１）
１２  最適化（コンパイラ処理２）
１３  命令列並び替え（コンパイラ処理３）
２０  ソースファイル
２１  中間語ファイル
２２  中間語ファイル
２３  オブジェクトファイル
１０１  コール命令引数補正手段
１０２  ロード／ストア命令補正手段
１０３  コール命令並び替え手段
１１１  第１の命令列テーブル
１１２  引数補正済み命令列テーブル
１１３  ロード／ストア命令補正済み命令テーブル
１１４  第２の命令列テーブル
【図１】
0003714201.tif 000002
【図２】
0003714201.tif 000003
【図３】
0003714201.tif 000004