JP2008097249A - プログラム中の命令列をより高速な命令に置換する技術 - Google Patents

プログラム中の命令列をより高速な命令に置換する技術 Download PDF

Info

Publication number
JP2008097249A
JP2008097249A JP2006277196A JP2006277196A JP2008097249A JP 2008097249 A JP2008097249 A JP 2008097249A JP 2006277196 A JP2006277196 A JP 2006277196A JP 2006277196 A JP2006277196 A JP 2006277196A JP 2008097249 A JP2008097249 A JP 2008097249A
Authority
JP
Japan
Prior art keywords
instruction
target
data
program
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
JP2006277196A
Other languages
English (en)
Inventor
Motohiro Kawahito
基弘 川人
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.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
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 International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2006277196A priority Critical patent/JP2008097249A/ja
Priority to US11/853,854 priority patent/US8296750B2/en
Publication of JP2008097249A publication Critical patent/JP2008097249A/ja
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/445Exploiting fine grain parallelism, i.e. parallelism at instruction level

Landscapes

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

Abstract

【課題】これまでより多くの種類のプログラムに対し、命令列をより高速に実行可能な命令に置換する最適化を行う。
【解決手段】最適化対象の対象プログラムの中から、予め定められた複数の命令を有する置換対象パターンを検出し、検出した置換対象パターンを、置換対象パターンに対応して定められた置換先命令列に置換して最適化するコンパイラ装置を提供する。この装置は、対象プログラムが有する複数の部分プログラムのうち、置換対象パターンが含まれる部分プログラムを検索して格納し、格納された対象部分プログラムに対し、条件分岐命令よりも先に実行される命令を当該条件分岐命令の分岐先のそれぞれに移動させる変形を行って、対象部分プログラムに含まれる命令間の依存関係を置換対象パターンに一致させ、変形された対象部分プログラムを、置換対象パターンに対応して定められた置換先命令列に置換して、最適化後の対象プログラムに含めて出力する。
【選択図】図1

Description

本発明は、最適化コンパイラに関する。特に、本発明は、プログラム中の命令列をより高速な命令に置換するコンパイラの技術に関する。
従来、最適化対象のプログラムの中から、予め定められたパターンに一致する命令列を検出し、その命令列を、そのパターンに対応して定められた他の命令列に置換する技術が提案されている。この技術によると、例えば、ある処理を実現する一連の命令群を、その処理と同一の処理結果を得る単一の命令に置換することにより、プログラムを最適化できる。置換先の命令の一例として、IBMコーポレーションのS/390アーキテクチャにおけるTRT命令が挙げられる。
TRT命令は、所定の記憶領域を先頭から順次走査して、所定の条件を満たす値が格納されているアドレス等を出力する命令である(非特許文献3参照。)。図15は、TRT命令による処理に対応する制御フローグラフである。TRT命令による処理は、記憶領域bytearrayの先頭から順に記憶領域に格納された値を変数chに順次読み出し、その値が条件cond1からcondNの何れかを満たす場合に終了する一連の処理に対応する。コンパイラは、このような一連の処理を、単一のTRT命令に置換することにより、プログラムを最適化できる。
以下に参考文献を挙げる。非特許文献1および非特許文献2については実施例において参照する。
特開2005−339021号公報 Jianghai Fu. Directed graph pattern matching and topological e mbedding.Journal of Algorithms, 22(2):372-391, February 1997. S.S. Muchnick. Advanced compiler design and implementation, Morgan Kaufmann Publishers, Inc., 1997. http://publibz.boulder.ibm.com/epubs/pdf/dz9zr002.pdf のページ7-180 A.V.エイホ、R.セシィ、J.D.ウルマン著、原田賢一訳、株式会社サイエンス社 発行、「コンパイラII−原理・技法・ツール−」、1993年初版第3刷
しかしながら、最適化対象のプログラムが、予め定められたパターンと完全に一致することは稀である。このような場合、従来は最適化を諦めていた。この結果、TRT命令等のアーキテクチャが独自に有している命令を有効に利用できない場合があった。これに対し、本願発明者は、上記特許文献1に記載したように、命令を置換する機会を拡大する技術を提案している。しかしながら、TRT命令等を有効利用するためには、さらに多くの種類のプログラムに対してこのような最適化を行えることが望ましい。
そこで本発明は、上記の課題を解決することのできるコンパイラ装置、コンパイラプログラムおよび方法を提供することを目的とする。この目的は特許請求の範囲における独立項に記載の特徴の組み合わせにより達成される。また従属項は本発明の更なる有利な具体例を規定する。
上記課題を解決するために、本発明の一側面においては、最適化対象の対象プログラムの中から、予め定められた複数の命令を有する置換対象パターンを検出し、検出した置換対象パターンを、置換対象パターンに対応して定められた置換先命令列に置換して最適化するコンパイラ装置であって、対象プログラムが有する複数の部分プログラムのうち、置換対象パターンに含まれる全ての命令に対応する命令を含む部分プログラムをCPUの動作により検索して、最適化対象の対象部分プログラムとして記憶装置に格納する対象部分プログラム検出部と、記憶装置に格納された対象部分プログラムに対し、条件分岐命令よりも先に実行される命令を当該条件分岐命令の分岐先のそれぞれに移動させる変形をCPUの動作によって行って、対象部分プログラムに含まれる命令間の依存関係を置換対象パターンに一致させる命令列変形部と、命令列変形部により変形された対象部分プログラムを、置換対象パターンに対応して定められた置換先命令列に、CPUの動作により置換して、最適化後の対象プログラムに含めて出力する命令列置換部とを備えるコンパイラ装置。
なお、上記の発明の概要は、本発明の必要な特徴の全てを列挙したものではなく、これらの特徴群のサブコンビネーションもまた、発明となりうる。
以下、発明の実施の形態を通じて本発明を説明するが、以下の実施形態は特許請求の範囲にかかる発明を限定するものではなく、また実施形態の中で説明されている特徴の組み合わせの全てが発明の解決手段に必須であるとは限らない。
図1は、コンパイラ装置10の全体構成を示す。コンパイラ装置10は、最適化候補検索部100と、対象部分プログラム検索部110と、命令列変形部120と、命令列置換部130とを有する。コンパイラ装置10は、予め定められた複数の命令を有する置換対象パターンに対応する命令列を検索し、検索したその命令列を、置換対象パターンに対応して定められた置換先命令列に置換する。置換先命令列は、置換対象パターンと比較して高速に実行される命令列であり、一例として、アーキテクチャ独自の高速な命令を含む。即ちこれにより、最適化対象の対象プログラムを、より効率的に実行される命令列に最適化することを目的とする。
コンパイラ装置10は、後述のCPU1500および後述のRAM1520(以下、単にメモリと称す)の動作により実現される、最適化候補検索部100と、対象部分プログラム検索部110と、命令列変形部120と、命令列置換部130を備える。最適化候補検索部100は、最適化の対象となる部分プログラムの候補をCPU1500の動作により検索する。例えば、最適化候補検索部100は、部分プログラムとして、メソッド、関数、又は手続きと呼ばれるプログラムの処理単位ごとの命令列を検索してもよいし、ループ処理等のように制御フローの性質に基づいて定まる命令列を検索してもよい。
そして、対象部分プログラム検索部110は、最適化候補検索部100により検索された複数の部分プログラムのうち、置換対象パターン20に類似する部分プログラムを対象部分プログラム40として検索する。例えば、対象部分プログラム検索部110は、置換対象パターン20に含まれる全ての命令に対応する命令を含む部分プログラムをCPU1500の動作により検索して、最適化対象の対象部分プログラム40としてメモリに格納する。より具体的には、対象部分プログラム検索部110は、置換対象パターン20に含まれるある命令と部分プログラムに含まれるある命令について、処理内容が互いに同一であり、その命令から出力する制御フローの数が互いに同一であり、かつ、制御フローの移行先の命令が互いに同一である場合に、それらの命令が互いに対応すると判断する。置換対象パターン20に類似する部分プログラムを検索する処理については、後に図12を参照してさらに詳しく説明する。
命令列変形部120は、メモリに格納された対象部分プログラム40のうち、置換対象パターン20に含まれる命令に対応する命令以外の命令、及び、置換対象パターン20と異なる実行の依存関係を有する命令に対して、対象部分プログラム40に含まれる命令間の依存関係を置換対象パターン20に一致させる変形を行う。命令列変形部120は、必要に応じてその他の命令に対して変形を行ってもよい。変形された対象部分プログラムを対象部分プログラム50とする。
命令列置換部130は、命令列変形部120により変形された対象部分プログラム50と置換対象パターン20との間で命令間の依存関係が一致したことを条件に、その対象部分プログラム50を、置換対象パターン20に対応して定められた置換先命令列に、CPU1500の動作により置換する。例えば、命令列変形部130は、置換先命令列の構造を示す置換先命令テンプレート30における各変数を、その変数に対応する対象部分プログラム50における変数に置き換えることにより、置換先命令列を生成してもよい。置換先命令列を含む対象プログラムは最適化後の対象プログラムに含めて出力される。
図2は、命令列変形部120の機能構成を示す。命令列変形部120は、ループ変形部200と、第1変形部210と、第2変形部220と、判定部230とを有する。ループ変形部200は、メモリに格納された対象部分プログラム40を読み出して、その対象部分プログラム40に対し、ループ処理を複数命令の周期的実行とみなした場合の命令実行の位相を変更する処理を行う。具体的には、ループ変形部200は、対象部分プログラム40内のループ処理の先頭で実行される一部の命令をそのループ処理の開始前に実行される部分に複写する。そして、ループ変形部200は、当該一部の命令を除く他の命令をそのループ処理の先頭に移動し、当該一部の命令を当該ループ処理内の当該他の命令の後に移動する。これにより、ループ変形部200は、対象部分プログラム40に含まれる命令間の依存関係を置換対象パターンに一致させる。ループ処理の先頭からどの命令までを複写の対象とするかについては、置換対象パターン内のループ処理の先頭がどの命令であるかによって定められる。変形後の命令はメモリに格納される。
次に、第1変形部210は、条件分岐命令よりも先に実行される命令をその条件分岐命令の分岐先のそれぞれに移動させる変形を、CPU1500の動作によって行って、対象部分プログラム40に含まれる命令間の依存関係を置換対象パターン20に一致させる。この変形は、データ依存関係を保持する範囲内において命令の移動可能範囲を探索するデータフロー方程式を、置換対象パターン20における命令間の依存関係に基づいて変更することにより実現される。
続いて、置換対象パターン20が、ループ処理内に、演算結果を変数に代入する第1命令を含み、かつ、当該変数の内容を参照する命令をそのループ処理の後に実行される部分に含むことを条件に、第2変形部220による変形を試みる。第2変形部220は、変形後の対象部分プログラム40をメモリから読み出す。そして、第2変形部220は、CPU1500の動作により、その第1命令を複製してそのループ処理の終了条件が成立した場合に実行される部分に挿入する変形を行う。
判定部230は、以上の処理により対象部分プログラム40に含まれる命令間の依存関係が置換対象パターン20に一致したかを判定する。判定に際し、対象部分プログラム40および置換対象パターン20の間で命令間の依存関係が、変形によりループ処理外では参照されなくなった変数へ値を代入する第1命令を除き一致したか否かが判断される。一致していない場合には、判定部230は、変形後の対象部分プログラム40をさらにループ変形部200、第1変形部210および第2変形部220によって変形させるべく、ループ変形部200に通知をする。なお、一致していない場合であっても、ループ変形部200、第1変形部210および第2変形部220による変形の結果が、前回にループ変形部200、第1変形部210および第2変形部220によって変形された結果と同一である場合には、判定部230は、変形が失敗したものとして処理を終了する。一致した場合には、判定部230は、変形後の対象部分プログラムを命令列置換部130に対し出力する。
なお、本図に示す各変形処理の適用順序や回数は一例である。即ち、命令列変形部120は、対象部分プログラム40に対しループ変形部200、第1変形部210および第2変形部220による変形を行う順序を変更してもよい。また、図2において、判定部230による判定ごとに行う変形の回数は1回ずつであるが、この回数は2回以上であってもよい。さらに、命令列変形部120は、対象部分プログラムを直接変更しない方が好ましい。すなわち、図2に示す諸機能による変形は、最終的に変形が失敗したと判定された場合には、対象プログラム全体としての処理速度を低下させるおそれがある。このため、命令列変形部120は、対象部分プログラム40を複写して複写プログラムを生成した上で、複写プログラムに対して上記の処理を行う。なお、複写プログラムは、解析を容易にするため、命令をノードとし実行の依存関係を有向エッジとした依存グラフに変換されてその後の処理に供することが望ましい。そして、命令列変形部120は、変形が成功した場合には、複写プログラムにより対象部分プログラム40を上書きする。変形が失敗した場合には、命令列変形部120は、対象部分プログラム40を変更せずに維持する。これにより、変形の成否によって結果コードを選択的に用いることができる。
図3aは、置換対象パターン20のグラフ表現を示し、図3bは、置換対象パターン20のグラフ表現を簡略化して示し、図3cは、置換対象パターン20の処理内容を示す擬似コードを示す。図3a中の実線の有向エッジは制御フローを示し、点線の有向エッジはデータ依存関係を示す。また、図3aにおける命令baloadは、図3bにおけるシンボルaに対応し、図3aにおける命令booltableは、図3bにおけるシンボルbに対応し、図3aにおける命令iaddおよびistoreは、図3bにおけるシンボルcに対応する。また、第1変数である変数v0は、走査の起点となるアドレスを示し、第2変数である変数v1は、走査位置のオフセット値を示す。
この置換対象パターン20は、ループ処理の先頭に読出命令(baload)を含む。この読出命令は、変数v0の値として与えられるアドレスに変数v1の値として与えられるオフセット値を加えたアドレスのメモリからデータを読み出す。また、置換対象パターン20は、読出命令の後に実行され、読み出したデータを定数値と比較して比較結果に基づきループ処理外の命令実行に分岐する条件分岐命令(booltable)を含む。この条件分岐命令(booltable)は、対象部分プログラム40との比較においてワイルドカードとしての役割を果たし、対象部分プログラム40における1または複数の条件分岐命令に対応し得る。以上の読出命令および条件分岐命令が図3cにおける第2行目に対応する。
また、置換対象パターン20は、条件分岐命令における条件が不成立の場合に実行され、変数v1の値をインクリメントしてから(iadd)変数v1に対応するメモリ上の領域に格納し(istore)、ループ処理の先頭に処理を戻す命令を含む。これらの命令は、図3cにおける1、3および4行目に対応する。
このように、命令間の依存関係が図3に示すものと一致する場合には、TRT命令を含む高速実行可能な命令列に置換可能となる。しかしながら、対象部分プログラム40を何ら変形しないままでは、命令間の依存関係が図3に示すものと一致しない場合がある。
図4は、置換先命令テンプレート30の一例を示す。なお、本図は、置換先命令テンプレート30に含まれる命令による処理内容を示すプログラムソースコードを示している。実際には、置換先命令テンプレート30は、所定の中間コード又は機械語により記述されていてもよい。置換先命令テンプレート30において、変数bytearrayは、TRT命令が比較の対象とする値を格納する記憶領域のアドレスを示す。また、変数iは、その記憶領域を走査するためのインデックスを示す。図4を参照して、置換対象パターン20と依存関係が一致する対象部分プログラム40を置換先命令列に置換する処理の一例を説明する。
命令列置換部130は、対象部分プログラム40内の、置換対象パターン20における条件分岐命令(booltable)に一致した少なくとも1つの条件分岐命令に基づき、TRT命令用のテーブル(table)の記憶領域を確保する命令を1行目に生成する。このテーブルは、条件判断において比較対象となる定数値をインデックスとして、そのインデックスによって指定された領域に論理値1を格納し、その他の領域に論理値0を格納する。また、命令列置換部130は、置換先命令テンプレート30における変数bytearrayを、対象部分プログラム40内の、置換対象パターン20における変数v0に対応する変数に置換する。また、命令列置換部130は、置換先命令テンプレート30における変数iを、対象部分プログラム40内の、置換対象パターン20における変数v1に対応する変数に置換する。また、命令列置換部130は、対象部分プログラム40内の、メモリ内のデータが定数値に一致した場合に実行される命令列によって、置換先命令テンプレート30内の、第12行目から第19行目を置換する。
以上の置換処理によって、対象部分プログラム40は、変数v0の値として与えられるアドレスを先頭としてメモリを順次走査して、予め設定した何れかの定数値と一致するデータが格納されているアドレスを出力するTRT命令を含む命令列に置換される。この命令例の処理によれば、変数v0によって指定されるメモリ上の領域は256バイト毎に一括して定数値と比較され、何れの定数値とも一致しない場合には256ずつ添え字がインクリメントされる。何れかの定数値と一致した場合にはループ処理外の命令列に実行が移される。また、256バイト未満の端数サイズの領域は、第22行目において最適化前の命令列によって比較される。
図5aは、対象部分プログラム40の一例を示し、図5bは、対象部分プログラム40のグラフ表現を示す。対象部分プログラム40は、例えば、Java言語で記述された命令列の断片である(Javaは登録商標である)。図5aの2〜6行目に示すループ処理内で、まず変数iがインクリメントされる。この処理は図5bに示すように定数1および変数iに依存する。その次に、図5aの4行目に示すように、変数aによって示されるアドレスに変数iによって示されるオフセット値を加えたアドレスから変数chにデータが読み出される。図5bに示すように、この処理は変数aおよび変数chに依存する。そして、そのデータは定数値0x20および'<'と比較される。なお、記号''は、文字コードを算出する演算子を示すから、'<'は、文字<の文字コードを示す定数値0x3cを示す。これらの比較処理は変数chおよび対応する定数値に依存する。何れかの条件が成立するとループ処理は終了する。なお、この変数chはループ処理終了後にも参照される。
図5cは、対象部分プログラム40のグラフ表現を簡略化して示す。シンボルcおよびaについては図3bに示したから説明を省略する。シンボルb1およびb2は、これら2つで、図3bに示したシンボルbに対応する。一方、シンボルSは、変数chの値をメモリに記憶する命令に対応する。この命令は置換対象パターン20には含まれていない。また、対象部分プログラム40においてシンボルの配列順序はc、a、bであるのに対し、置換対象パターン20においてはa、b、cである。このため、このままでは対象部分プログラム40を置換先命令列に置換することはできない。この対象部分プログラム40を置換可能とするべく、まずループ変形部200が命令列の変形を試みる。
図6は、ループ変形部200の機能構成を示す。ループ変形部200は、先頭部検索部600と、先頭部複製部610と、開始命令変更部620とを有する。先頭部検索部600は、CPU1500の動作によって、対象部分プログラム40内の各命令を走査して、ループ処理の先頭部分を検索する。先頭部分が検索されると、先頭部検索部600は、順次走査を続け、検索されたその先頭部分から、置換対象パターン20内のループ処理の先頭に対応する命令を検索する。図5cの例では、先頭部検索部600は、シンボルcの命令からシンボルaの命令までをループ処理の先頭部分として検出する。この走査処理は、対象部分プログラム40中の命令列を順次制御フローに沿って読み出すことによって実現される。対象部分プログラム40および走査の結果は先頭部複製部610に対し出力される。
次に、先頭部複製部610は、先頭部検索部600により走査されたそれぞれの命令のうち、置換対象パターン20内のループ処理の先頭に対応する命令を除いた命令のそれぞれ(図5cの例ではシンボルcのみ)を、対象部分プログラム40内のループ処理の開始前に実行させる部分に、CPU1500の動作により複製する。そして、開始命令変更部620は、CPU1500の動作により、このループ処理の先頭の命令を、対象部分プログラム40において置換対象パターン20内のループ処理の先頭に対応する命令に変更する。図5cの例では、開始命令変更部620は、ループ処理の先頭がシンボルaとなるよう、制御フローを変更する。命令の生成や制御フローの変更は、あらたに命令を格納するための記憶領域をメモリに確保したうえで、条件分岐命令や無条件分岐命令の分岐先アドレスをその記憶領域に変更することによって実現される。
図7aは、ループ変形部200によって対象部分プログラム40が変形される処理の概要を示す。先頭部検索部600が、ループ処理の先頭部分としてシンボルcおよびaに対応する命令列を検出したので、先頭部複製部610はそのうちシンボルaを除くシンボルcをループ処理の開始前に実行させる部分に複製する。そして、開始命令変更部620は、ループ処理の先頭をシンボルaに対応する命令に変更する。
図7bは、ループ変形部200によって変形された対象部分プログラム40の擬似コードを示す。2行目に示すように、ループ処理の先頭部分からループ処理の開始前の部分に命令i++が複製されている。また、4から6行目に示すように、ループ処理内の命令実行順序は、読出命令、条件分岐命令、および、インクリメント命令の順となったことがわかる。
以上の変形により、ループ処理内の命令の実行順序(あるいは制御依存関係)は、置換対象パターン20内の命令の実行順序と一致した。しかしながら、対象部分プログラム40は、置換対象パターン20内には存在しない命令(シンボルS)を含んでおり、依然として置換先命令列に置換することはできない。続いて、変形後の対象部分プログラム40に対しさらに第2変形部220により行われる変形の概要を説明する。なお、図7に示す変形後の対象部分プログラム40に対しては、第1変形部210によっては何らの変形を行うことはできないから、ここでは第1変形部210による処理の説明は省略して第2変形部220の処理を説明する。
図8aは、第2変形部220によって対象部分プログラム40が変形される処理の概要を示す。ループ変形部200による変形後の対象部分プログラム40は、演算結果を変数に代入する第1命令を含んでいる。この第1命令は、シンボルaによって示すメモリからの読出命令、および、シンボルSによって示すメモリへの格納命令の組合せによって表される。そして、このシンボルSによって示される格納命令が、対象部分プログラム40が置換対象パターン20内の命令群との不一致である原因となっている。また、ループ処理外でこの変数への参照が存在するから、この格納命令は、既存の最適化処理によっても削除することができない。
この場合、第2変形部220は、この第1命令を複製してループ処理の終了条件が成立した場合に実行される部分に挿入する変形を行う。即ち、図8a右に示す対象部分プログラム50において、シンボルb1およびb2によって表される第2命令において終了条件が成立した場合に実行される部分に、第1命令の複製を示すシンボルaおよびシンボルSが挿入される。この結果、シンボルSが示す格納命令によってメモリに格納された変数値は、ループ処理内においてのみ参照されることとなり、この格納命令は置換対象パターン20におけるループ内代入命令に一致する。
図8bは、ループ変形部200によって対象部分プログラム40が変形された結果である対象部分プログラム50の擬似コードを示す。図7bと比較して、8行目に、メモリから読み出した値を変数chに代入する命令が追加された。また、4行目の代入命令は図7bの代入命令と同一であるが、代入の結果はループ処理外で参照されないこととなった。この結果、第2変形部220は、対象部分プログラム40に含まれる命令間の依存関係を置換対象パターン20に一致させることができた。
図9は、第2変形部220の機能構成を示す。図9を参照して、図8aおよびbに示した変形をより一般化してより広範な種類のプログラムに適用可能とする処理機能を説明する。第2変形部220は、第2KILLデータ生成部900と、第2GENデータ生成部910と、第2OUTデータ生成部920と、第2INデータ生成部930と、第2コード変形部940とを有し、前進データフローにおけるデータフロー方程式の反復解法によりコード移動の最適化を行うことを目的とする。なお、ここではデータフロー方程式の定義について主に説明し、その解法の詳細については説明しない。データフロー方程式を解く情報処理の実現手段については、例えば、当該技術分野で著名な基本書である非特許文献4の844ページを参照されたい。
以下、データフロー方程式のKILLデータ、GENデータ、OUTデータ、INデータの生成について述べる。各データは、対象部分プログラム40中の命令を要素とした集合を示す。各命令は、当該命令の処理の内容を示す右辺式、および、当該処理の結果を格納する変数を示す左辺式の組として表される。まず、第2KILLデータ生成部900は、CPU1500の動作によって、対象部分プログラム40内の基本ブロック毎に、当該基本ブロック内の各命令を走査する。そして、第2KILLデータ生成部900は、基本ブロック毎に、対象部分プログラム40内の複数の命令のうち当該基本ブロック内の何れかの命令によって右辺式に示す処理の結果又は左辺式に示す変数の値が変更され得る命令の集合を選択して、選択した当該命令の集合を示すKILLデータをメモリに格納する。
例えば、対象部分プログラム40内にある変数xに基づく演算命令aがあり、ある基本ブロックにその変数xへの代入命令があれば、その基本ブロックのKILLデータには、その演算命令aが加えられる。また、対象部分プログラム40内にメモリからの読出命令bがあり、ある基本ブロックに正体不明の関数を呼び出す命令があれば、その基本ブロックのKILLデータには、その読出命令bが加えられる。正体不明の関数によってメモリの内容が書き換えられた結果、読出命令bの右辺式の結果(即ち読み出されるデータの内容)が変更され得るからである。
次に、第2GENデータ生成部910は、対象部分プログラム40内の基本ブロック毎に、CPU1500の動作によって、当該メモリブロックの末尾から順に各命令を実行とは逆順に走査する。そして、第2GENデータ生成部910は、走査するそれぞれの命令がKILLデータに含まれていないか、または、未走査の他の命令の存在を理由にKILLデータに含まれていることを条件に順次選択する。例えば、ある基本ブロックに命令aがあり、その基本ブロックには命令aの右辺式の結果や左辺式の変数値を変更する他の命令が存在しなければ、その命令aはその基本ブロックのGENデータに加えられる。一方、命令aの右辺式の結果や左辺式の変数値を変更する他の命令があっても、当該他の命令が命令aより後に走査される場合、即ち、当該他の命令が先に実行される場合には、命令aはその基本ブロックのGENデータに加えられる。
第2OUTデータ生成部920は、対象部分プログラム40の基本ブロック毎に、CPU1500の動作によって当該基本ブロックのKILLデータおよびGENデータをメモリから読み出す。そして、基本ブロック毎に、当該基本ブロックの先頭にコード移動することのできる命令の集合を示すINデータから当該KILLデータを除外して当該GENデータとの集合和を算出する演算を行う。そして、第2OUTデータ生成部920は、その集合演算の結果を、当該基本ブロックの末尾にコード移動することのできる命令の集合を示すOUTデータとして生成してメモリに格納する。この処理は以下の式(1)に示すデータフロー方程式として表される。
Figure 2008097249
なお、対象部分プログラム40において最も先に実行される基本ブロックのINデータは、空集合であってもよいし、対象部分プログラム40外のプログラムを予め解析した結果として得られる命令の集合であってもよい。
第2INデータ生成部930は、対象部分プログラム40の基本ブロック毎に、CPU1500の動作によって当該基本ブロックの直前に実行される各基本ブロックのOUTデータをメモリから読み出す。そして、第2INデータ生成部930は、当該OUTデータの集合積を算出する演算を行うことにより、当該基本ブロックのINデータを生成する。この処理は以下の式(2)に示すデータフロー方程式として表される。
Figure 2008097249
なお、第2OUTデータ生成部920の処理結果および第2INデータ生成部930の処理結果は相互に影響する。このため、第2INデータ生成部930により生成されたINデータに基づき第2OUTデータ生成部920が再度OUTデータを生成すると、前回生成したOUTデータとは異なる結果が得られる場合がある。したがって、第2OUTデータ生成部920および第2INデータ生成部930は、生成されるINデータおよびOUTデータが前回のINデータおよびOUTデータと同一となり収束するまで、互いの生成結果に基づく処理を繰り返す。データフロー方程式の反復解法および収束判定の方法については従来公知であるから説明を省略する。
続いて、第2コード変形部940は、対象部分プログラム40においてループ処理の終了条件が成立した場合に実行される基本ブロックに対応するINデータを、CPU1500の動作によりメモリから読み出す。ループ処理の出口が複数存在する場合には、終了条件が成立した場合に実行される基本ブロックも複数となる場合がある。その場合には、そのそれぞれの基本ブロックについてのINデータが読み出される。そして、第2コード変形部940は、そのINデータに含まれる各命令を、その基本ブロックに挿入する。挿入の処理は、メモリに格納された対象部分プログラム40をCPU1500により書き換えることによって実現される。
以上、図1から図9によれば、ループ処理の位相を変更し、かつ、ループ処理外で参照される変数をループ処理内のみで参照されるように変更することで、対象部分プログラム40内の命令間の依存関係を置換対象パターン20に一致させることができた。次に、他のプログラム例を対象部分プログラム40として参照して、第1変形部210による最適化について説明する。なお、ループ変形部200および第2変形部220による処理はこの対象部分プログラム40には影響しないから説明を省略する。
図10aは、第1変形部210によって対象部分プログラム40が変形される処理の概要を示し、図10bは、第1変形部210によって変形される対象部分プログラム40の擬似コードを示す。図10b左の2行目に示すように、この対象部分プログラム40は、変数aの値として与えられるアドレスに変数iの値として与えられるオフセット値を加えたアドレスのメモリからデータを読み出した後に、変数iをインクリメントし、読み出したデータを定数値と比較する処理を示している。そして、図10a左に示すように、図3bと比較するとシンボルcおよびbの順序が逆である。このため、このままでは置換先命令列に置換することはできない。
この対象部分プログラム40に対し、第1変形部210は、条件分岐命令よりも先に実行される命令を、その命令と他の命令との間のデータ依存関係に反しない範囲内において、その条件分岐命令の分岐先のそれぞれに移動させる変形を行う。具体的には、第1変形部210は、シンボルcとして表される命令を、シンボルbとして表される条件分岐命令の分岐先のそれぞれに移動する。移動した結果を対象部分プログラム50とする。図10a右に示すようにシンボルcはシンボルbの分岐先に移動した結果、ループ処理内でシンボルbとシンボルcとは入れ替わり、シンボルcがループ処理外にも複製されている。同様に、図10b右に示すように、変数iのインクリメント命令はループ処理外の第5行目に複製されている。
図11は、第1変形部210の機能構成を示す。図11を参照して、図10に示した処理を一般化して多様なプログラムに対し適用可能とする処理について説明する。図9に示す処理機能と同様に、図11に示す処理機能も、前進データフローにおけるデータフロー方程式の反復解法によりコード移動の最適化を行う。ここではデータフロー方程式の定義について主に説明するので、反復解法については図9および非特許文献4を参照されたい。
第1変形部210は、第1KILLデータ生成部1100と、対応データ生成部1110と、第1KILLデータ追加部1120と、第1GENデータ生成部1130と、第1OUTデータ生成部1140と、第1INデータ生成部1150と、INSERTデータ生成部1160と、第1コード変形部1170とを有する。第1KILLデータ生成部1100は、メモリから対象部分プログラム40を読み出し、対象部分プログラム40の基本ブロック毎に、CPU1500の動作により、当該基本ブロックの各命令を走査する。そして、第1KILLデータ生成部1100は、基本ブロック毎に、対象部分プログラム40内の複数の命令のうち、当該基本ブロック内の何れかの命令との間でデータ依存関係を有する命令の集合を選択して、当該命令の集合を示すKILLデータを生成しメモリに格納する。データ依存関係は、例えば、真の依存(true dependence)、逆依存(anti dependence)、および出力依存(output dependence)を含む。
そして、対応データ生成部1110は、置換対象パターン20をメモリから読み出し、置換対象パターン20における各命令の実行順序に基づいて、置換対象パターン20内の各命令を先行命令とし、当該先行命令を、置換対象パターン20において当該先行命令の次に実行される後続命令に対応付けた対応データをCPU1500の動作により生成し、メモリに格納する。例えば、置換対象パターン20において、シンボルaが示す命令を先行命令とするとその後続命令はシンボルbにより表される。したがってシンボルaおよびシンボルbが対応付けられる。同様にシンボルbおよびシンボルcが対応付けられ、シンボルcおよびシンボルaが対応付けられる。生成された対応データは第1KILLデータ追加部1120に対し出力される。
第1KILLデータ追加部1120は、対象部分プログラム40内の基本ブロック毎に、CPU1500の動作により、当該基本ブロック内の各命令を走査する。そして、第1KILLデータ追加部1120は、基本ブロック毎に、対応データの中の後続命令を検索したことを条件に、対応データにおいてその後続命令に対応する先行命令を、当該基本ブロックに対応するKILLデータに追加する。KILLデータに対する命令の追加処理は、メモリに格納されたKILLデータを書き換えることによって実現される。
第1GENデータ生成部1130は、対象部分プログラム40内の基本ブロック毎に、CPU1500の動作により、その基本ブロックの末尾から順に各命令を実行とは逆順に走査する。そして、第1GENデータ生成部1130は、走査するそれぞれの命令を、当該命令がKILLデータに含まれていないか、または、当該命令が未走査の他の命令の存在を理由にKILLデータに含まれていることを条件に順次選択して、選択した当該命令の集合を示すGENデータを生成してメモリに格納する。
例えば、ある基本ブロックの命令aが、その基本ブロック内の他の何れの命令との間にデータ依存関係を有しておらず、かつ、対応データにおいてその命令aを先行命令とする後続命令が、その基本ブロックに含まれない場合には、その命令aはその基本ブロックのGENデータに加えられる。一方で、命令aの後続命令、または、命令aとの間でデータ依存関係を有する他の命令がその基本ブロックに含まれる場合であっても、当該後続命令または当該他の命令が未走査の場合(即ち、命令aより先に実行される場合)には、その命令aはその基本ブロックのGENデータに加えられる。
第1OUTデータ生成部1140は、対象部分プログラム40の基本ブロック毎に、当該基本ブロックのKILLデータおよびGENデータをメモリから読み出す。そして、第1OUTデータ生成部1140は、基本ブロック毎に、その基本ブロックの先頭にコード移動することのできる命令の集合を示すINデータから当該KILLデータを除外して当該GENデータとの集合和を算出する演算を行うことにより、当該基本ブロックの末尾にコード移動することのできる命令の集合を示すOUTデータをCPU1500の動作により生成する。この処理は、以下の式(3)に示すデータフロー方程式として表される。
Figure 2008097249
第1INデータ生成部1150は、対象部分プログラム40内の基本ブロック毎に、当該基本ブロックの直前に実行される各基本ブロックのOUTデータをメモリから読み出す。そして、第1INデータ生成部1150は、各基本ブロックの集合積を算出する演算をCPU1500の動作により行うことにより、当該基本ブロックのINデータを生成する。この処理は、以下の式(4)に示すデータフロー方程式として表される。
Figure 2008097249
第1OUTデータ生成部1140および第1INデータ生成部1150は、演算結果が相互に影響するものであるから、第1OUTデータ生成部1140および第1INデータ生成部1150は演算結果が収束するまで相互に処理を繰り返す。
INSERTデータ生成部1160は、対象部分プログラム40の基本ブロック毎に、当該基本ブロックのINデータおよび当該基本ブロックの直前に実行される各基本ブロックのOUTデータをメモリから読み出す。そして、INSERTデータ生成部1160は、当該INデータから当該OUTデータの集合積を除外する演算をCPU1500の動作により行うことにより、当該基本ブロック内に生成すべき命令の集合を示すINSERTデータを生成する。この処理は、以下の式(5)により表される。
Figure 2008097249
そして、第1コード変形部1170は、対象部分プログラム40をCPU1500の動作により変形して、対象部分プログラム40内の基本ブロック毎に、当該基本ブロックのINSERTデータに含まれる命令を、当該基本ブロックにおいて当該命令とデータ依存関係を有する他の命令よりも先に実行される部分に挿入する。当該命令とデータ依存関係を有する他の命令が存在しない場合には、当該基本ブロックの何れの部分に挿入してもよい。命令挿入の処理は、CPU1500の動作によってメモリに格納された対象部分プログラム40を書き換えることによって実現される。
図12は、コンパイラ装置10により対象プログラムをコンパイルする処理のフローチャートである。最適化候補検索部100は、最適化の対象となる部分プログラムの候補をCPU1500の動作により検索する(S1200)。例えば、最適化候補検索部100は、部分プログラムとして、メソッド、関数、又は手続きと呼ばれるプログラムの処理単位ごとの命令列を部分プログラムの候補として検索してもよいし、ループ処理等のように制御フローの性質に基づいて定まる命令列を部分プログラムの候補として検索してもよい。
そして、対象部分プログラム検索部110は、最適化候補検索部100により検索された複数の部分プログラムのうち、置換対象パターン20に類似する部分プログラムを対象部分プログラム40として検索する(S1210)。詳細には、対象部分プログラム検索部110は、非特許文献1に記載のtopological embeddingの技術により、置換対象パターン20と同型の依存グラフを検出してもよい。これに代えて、対象部分プログラム検索部110は、非特許文献2に記載の方法に基づき、置換対象パターン20との共通部分が最大のプログラム片を検出することにより、置換対象パターン20と同型の依存グラフを検出してもよい。これらの技術によると、置換対象パターン20の依存グラフにおけるノードとノードとの間に、任意のノードが含まれている場合であっても、同型性があると判断できる。
これらの技術を適用して同型の依存グラフを検出する処理例についてさらに詳細に説明する。まず、対象部分プログラム検索部110は、置換対象パターン20に含まれる命令間の依存関係を解析することにより、各命令をノードとし、命令間の実行の依存関係を有向エッジとした依存グラフを生成する。なお、置換対象パターン20は命令コードであり対象部分プログラム検索部110は必要に応じてその命令コードを依存グラフに変換してもよいし、コンパイラ装置10が予め命令コードを依存グラフに変換したデータを置換対象パターン20として格納していてもよい。同様に、対象部分プログラム検索部110は、最適化の対象となる部分プログラムの候補についても、命令間の実行の依存関係を解析することにより、各々の命令をノードとし、当該複数の命令の実行の依存関係を有向エッジとした依存グラフを生成する。
そして、対象部分プログラム検索部110は、ループ処理については、その依存グラフを、無限に続く木構造として取り扱う。例えば、図5cに示す命令列は、c->a->->S->b1->b2->c->a->S->b1->b2->……として取り扱う。この命令列に対し、任意のノードを間に含んでいても同型と判断する技術を適用すると、c->a->->S->b1->b2->c->a->S->b1->b2->において下線を付して示すように、命令a、命令b1、命令b2、命令cがこの順に検索される。図3bに示すように、置換対象パターン20は命令a、命令b、命令cをこの順に含むループ処理であり、命令bは任意の数の条件分岐命令(例えばb1およびb2)と同型と判断されるから、置換対象パターン20および対象部分プログラム40は同型性があると判断される。
このように、対象部分プログラム検索部110は、各々の当該部分プログラムにおいて、置換対象パターン20に含まれる全ての命令に対応する命令が、置換対象パターン20における各命令の実行の依存関係の示す実行順序で実行されるかを依存グラフに基づいて判断する。そして、コンパイラ装置10は、全ての命令に対応する命令が実行されると判断した場合に、部分プログラムを対象部分プログラムとして検出する。これにより、例えば、図5cや図10a左側に示す部分プログラムが、対象プログラムの中から適切に検索され、対象部分プログラム40として検出される。
続いて、命令列変形部120は、メモリに格納された対象部分プログラム40のうち、置換対象パターン20に含まれる命令に対応する命令以外の命令、及び、置換対象パターン20と異なる実行の依存関係を有する命令に対して、対象部分プログラム40に含まれる命令間の依存関係を置換対象パターン20に一致させる変形を行う(S1220)。命令列変形部120は、必要に応じてその他の命令に対して変形を行ってもよい。変形された対象部分プログラムを対象部分プログラム50とする。
命令列置換部130は、命令列変形部120により変形された対象部分プログラム50を、置換対象パターン20に対応して定められた置換先命令列に、CPU1500の動作により置換する(S1230)。例えば、コンパイラ装置10は、置換先命令列の構造を示す置換先命令テンプレート30における各変数を、その変数に対応する対象部分プログラム50における変数に置き換えることにより、置換先命令列を生成してもよい。詳しくは図4を参照して説明したとおりである。
図13は、S1220における処理の詳細を示す。ループ変形部200は、メモリに格納された対象部分プログラム40を読み出して、その対象部分プログラム40に対し、ループ処理を複数命令の周期的実行とみなした場合の命令実行の位相を変更する処理を行う(S1300)。具体的には、ループ変形部200は、対象部分プログラム40内のループ処理の先頭で実行される一部の命令をそのループ処理の開始前に実行される部分に複写する。そして、ループ変形部200は、当該一部の命令を除く他の命令をそのループ処理の先頭に移動し、当該一部の命令を当該ループ処理内の当該他の命令の後に移動する。これにより、ループ変形部200は、対象部分プログラム40に含まれる命令間の依存関係を置換対象パターンに一致させることができる。ループ処理の先頭からどの命令までを複写の対象とするかについては、置換対象パターン内のループ処理の先頭がどの命令であるかによって定められる。変形後の命令はメモリに格納される。
次に、第1変形部210は、条件分岐命令よりも先に実行される命令をその条件分岐命令の分岐先のそれぞれに移動させる変形を、CPU1500の動作によって行って、対象部分プログラム40に含まれる命令間の依存関係を置換対象パターン20に一致させる(S1310)。この変形は、データ依存関係を保持する範囲内において命令の移動可能範囲を探索するデータフロー方程式を、置換対象パターン20における命令間の依存関係に基づいて変更することにより実現される。
続いて、置換対象パターン20が、ループ処理内に演算結果を変数に代入する第1命令を含み、かつ、当該変数の内容を参照する命令をそのループ処理の後に実行される部分に含むことを条件に、第2変形部220による変形を試みる(S1320)。第2変形部220は、変形後の対象部分プログラム40をメモリから読み出す。そして、第2変形部220は、CPU1500の動作により、その第1命令を複製してそのループ処理の終了条件が成立した場合に実行される部分に挿入する変形を行う。これにより、対象部分プログラム40に含まれる命令間の依存関係は、第1命令を除き、置換対象パターン20に含まれる命令間の依存関係に一致する。
判定部230は、以上の処理により対象部分プログラム40に含まれる命令間の依存関係が置換対象パターン20に一致したかを判定する(S1330)。一致していない場合には(S1330:NO)、判定部230は、ループ変形部200、第1変形部210および第2変形部220による変形の結果が、前回にループ変形部200、第1変形部210および第2変形部220によって変形された結果と同一であって変形処理が収束したかを判断する(S1350)。収束した場合には(S1350:YES)、判定部230は、変形処理が失敗した旨を命令列置換部130に通知して処理を終了する(S1360)。収束していなければ(S1350:NO)、変形後の対象部分プログラム40をさらにループ変形部200、第1変形部210および第2変形部220によって変形させるべく、S1300に処理を戻す。対象部分プログラム40に含まれる命令間の依存関係が置換対象パターン20に一致した場合には(S1330:YES)、命令列変形部120は、一致した旨を命令列置換部130に通知して命令列を置換させる(S1340)。
図14は、コンパイラ装置10として機能する情報処理装置500のハードウェア構成の一例を示す。情報処理装置500は、ホストコントローラ1582により相互に接続されるCPU1500、RAM1520、及びグラフィックコントローラ1575を有するCPU周辺部と、入出力コントローラ1584によりホストコントローラ1582に接続される通信インターフェイス1530、ハードディスクドライブ1540、及びCD−ROMドライブ1560を有する入出力部と、入出力コントローラ1584に接続されるROM1510、フレキシブルディスクドライブ1550、及び入出力チップ1570を有するレガシー入出力部とを備える。
ホストコントローラ1582は、RAM1520と、高い転送レートでRAM1520をアクセスするCPU1500及びグラフィックコントローラ1575とを接続する。CPU1500は、ROM1510及びRAM1520に格納されたプログラムに基づいて動作し、各部の制御を行う。グラフィックコントローラ1575は、CPU1500等がRAM1520内に設けたフレームバッファ上に生成する画像データを取得し、表示装置1580上に表示させる。これに代えて、グラフィックコントローラ1575は、CPU1500等が生成する画像データを格納するフレームバッファを、内部に含んでもよい。
入出力コントローラ1584は、ホストコントローラ1582と、比較的高速な入出力装置である通信インターフェイス1530、ハードディスクドライブ1540、及びCD−ROMドライブ1560を接続する。通信インターフェイス1530は、ネットワークを介して外部の装置と通信する。ハードディスクドライブ1540は、情報処理装置500が使用するプログラム及びデータを格納する。CD−ROMドライブ1560は、CD−ROM1595からプログラム又はデータを読み取り、RAM1520又はハードディスクドライブ1540に提供する。
また、入出力コントローラ1584には、ROM1510と、フレキシブルディスクドライブ1550や入出力チップ1570等の比較的低速な入出力装置とが接続される。ROM1510は、情報処理装置500の起動時にCPU1500が実行するブートプログラムや、情報処理装置500のハードウェアに依存するプログラム等を格納する。フレキシブルディスクドライブ1550は、フレキシブルディスク1590からプログラム又はデータを読み取り、入出力チップ1570を介してRAM1520またはハードディスクドライブ1540に提供する。入出力チップ1570は、フレキシブルディスク1590や、例えばパラレルポート、シリアルポート、キーボードポート、マウスポート等を介して各種の入出力装置を接続する。
情報処理装置500に提供されるプログラムは、フレキシブルディスク1590、CD−ROM1595、又はICカード等の記録媒体に格納されて利用者によって提供される。プログラムは、入出力チップ1570及び/又は入出力コントローラ1584を介して、記録媒体から読み出され情報処理装置500にインストールされて実行される。コンパイラプログラムが情報処理装置500等に働きかけて行わせる動作は、図1から図13において説明したコンパイラ装置10における動作と同一であるから、説明を省略する。
以上に示したプログラムは、外部の記憶媒体に格納されてもよい。記憶媒体としては、フレキシブルディスク1590、CD−ROM1595の他に、DVDやPD等の光学記録媒体、MD等の光磁気記録媒体、テープ媒体、ICカード等の半導体メモリ等を用いることができる。また、専用通信ネットワークやインターネットに接続されたサーバシステムに設けたハードディスク又はRAM等の記憶装置を記録媒体として使用し、ネットワークを介してプログラムを情報処理装置500に提供してもよい。
以上、本実施形態に係るコンパイラ装置10によれば、最適化対象のプログラム中に、より高速に実行可能な命令に置換できる命令列のパターンが検索された場合のみならず、そのようなパターンと類似しているものの完全には一致していない場合であっても、必要なコード変形によりパターンに一致させることができる。これにより、高性能なコンピュータに備わっている特別な命令を有効に利用して、プログラムの実行効率を一層高めることができる。実際に、文字コード変換を行うベンチマークプログラムにて性能評価を行ったところ、プログラムの種類によっては、従来と比較して2.35倍から4.54倍の性能向上が観測された。
以上、本発明を実施の形態を用いて説明したが、本発明の技術的範囲は上記実施の形態に記載の範囲には限定されない。上記実施の形態に、多様な変更または改良を加えることが可能であることが当業者に明らかである。その様な変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。
図1は、コンパイラ装置10の全体構成を示す。 図2は、命令列変形部120の機能構成を示す。 図3aは、置換対象パターン20のグラフ表現を示す。 図3bは、置換対象パターン20のグラフ表現を簡略化して示す。 図3cは、置換対象パターン20の処理内容を示す擬似コードである。 図4は、置換先命令テンプレート30の一例を示す。 図5aは、対象部分プログラム40の一例を示す。 図5bは、対象部分プログラム40のグラフ表現を示す。 図5cは、対象部分プログラム40のグラフ表現を簡略化して示す。 図6は、ループ変形部200の機能構成を示す。 図7aは、ループ変形部200によって対象部分プログラム40が変形される処理の概要を示す。 図7bは、ループ変形部200によって変形された対象部分プログラム40の擬似コードを示す。 図8aは、第2変形部220によって対象部分プログラム40が変形される処理の概要を示す。 図8bは、ループ変形部200によって対象部分プログラム40が変形された結果である対象部分プログラム50の擬似コードを示す。 図9は、第2変形部220の機能構成を示す。 図10aは、第1変形部210によって対象部分プログラム40が変形される処理の概要を示す。 図10bは、第1変形部210によって変形される対象部分プログラム40の擬似コードを示す。 図11は、第1変形部210の機能構成を示す。 図12は、コンパイラ装置10により対象プログラムをコンパイルする処理のフローチャートである。 図13は、S1220における処理の詳細を示す。 図14は、コンパイラ装置10として機能する情報処理装置500のハードウェア構成の一例を示す。 図15は、TRT命令による処理に対応する制御フローグラフである。
符号の説明
10 コンパイラ装置
20 置換対象パターン
30 置換先命令テンプレート
40 対象部分プログラム
50 対象部分プログラム
100 最適化候補検索部
110 対象部分プログラム検索部
120 命令列変形部
130 命令列置換部
200 ループ変形部
210 第1変形部
220 第2変形部
230 判定部
500 情報処理装置
600 先頭部検索部
610 先頭部複製部
620 開始命令変更部
900 第2KILLデータ生成部
910 第2GENデータ生成部
920 第2OUTデータ生成部
930 第2INデータ生成部
940 第2コード変形部
1100 第1KILLデータ生成部
1110 対応データ生成部
1120 第1KILLデータ追加部
1130 第1GENデータ生成部
1140 第1OUTデータ生成部
1150 第1INデータ生成部
1160 INSERTデータ生成部
1170 第1コード変形部

Claims (10)

  1. 最適化対象の対象プログラムの中から、予め定められた複数の命令を有する置換対象パターンを検索し、検索した前記置換対象パターンを、前記置換対象パターンに対応して定められた置換先命令列に置換して最適化するコンパイラ装置であって、
    前記対象プログラムが有する複数の部分プログラムのうち、前記置換対象パターンに含まれる全ての命令に対応する命令を含む部分プログラムをCPUの動作により検索して、最適化対象の対象部分プログラムとして記憶装置に格納する対象部分プログラム検索部と、
    前記記憶装置に格納された前記対象部分プログラムに対し、条件分岐命令よりも先に実行される命令を当該条件分岐命令の分岐先のそれぞれに移動させる変形をCPUの動作によって行って、前記対象部分プログラムに含まれる命令間の依存関係を前記置換対象パターンに一致させる命令列変形部と、
    前記命令列変形部により変形された前記対象部分プログラムを、前記置換対象パターンに対応して定められた置換先命令列に、CPUの動作により置換して、最適化後の対象プログラムに含めて出力する命令列置換部と
    を備えるコンパイラ装置。
  2. 前記命令列変形部は、
    前記対象部分プログラム内の基本ブロック毎に、CPUの動作により、当該基本ブロック内の各命令を走査して、前記対象部分プログラム内の複数の命令のうち、当該基本ブロック内の何れかの命令との間でデータ依存関係を有する命令の集合を選択して、当該命令の集合を示すKILLデータを生成し記憶装置に格納する第1KILLデータ生成部と、
    前記置換対象パターンにおける各命令の実行順序の関係に基づいて、前記置換対象パターン内の各命令を先行命令とし、当該先行命令を、前記置換対象パターンにおいて当該先行命令の次に実行される後続命令に対応付けた対応データをCPUの動作により生成し記憶装置に格納する対応データ生成部と、
    前記対象部分プログラム内の基本ブロック毎に、CPUの動作により、当該基本ブロック内の各命令を走査して、前記対応データ中の後続命令を検索したことを条件に、前記対応データにおいて当該後続命令に対応する先行命令を、当該基本ブロックに対応する前記KILLデータに追加する第1KILLデータ追加部と、
    前記対象部分プログラム内の基本ブロック毎に、CPUの動作により、当該基本ブロックの末尾から順に各命令を実行とは逆順に走査し、走査するそれぞれの命令を、当該命令が前記KILLデータに含まれていないか、または、未走査の他の命令の存在を理由に前記KILLデータに含まれていることを条件に順次選択して、選択した当該命令の集合を示すGENデータを生成して記憶装置に格納する第1GENデータ生成部と、
    前記対象部分プログラム内の基本ブロック毎に、当該基本ブロックのKILLデータおよびGENデータを記憶装置から読み出して、当該基本ブロックの先頭にコード移動することのできる命令の集合を示すINデータから当該KILLデータを除外して当該GENデータとの集合和を算出する演算を行うことにより、当該基本ブロックの末尾にコード移動することのできる命令の集合を示すOUTデータをCPUの動作により生成する第1OUTデータ生成部と、
    前記対象部分プログラム内の基本ブロック毎に、当該基本ブロックの直前に実行される各基本ブロックのOUTデータの集合積を算出する演算をCPUの動作により行うことにより、当該基本ブロックの前記INデータを生成する第1INデータ生成部と、
    前記対象部分プログラム内の基本ブロック毎に、当該基本ブロックのINデータおよび当該基本ブロックの直前に実行される各基本ブロックのOUTデータを記憶装置から読み出して、当該INデータから当該OUTデータの集合積を除外する演算をCPUの動作により行うことにより、当該基本ブロック内に生成すべき命令の集合を示すINSERTデータを生成するINSERTデータ生成部と、
    前記対象部分プログラムをCPUの動作により変形して、前記対象部分プログラム内の基本ブロック毎に、当該基本ブロックのINSERTデータに含まれる命令を、当該基本ブロックにおいて当該命令とデータ依存関係を有する他の命令よりも先に実行される部分に挿入する第1コード変形部と
    を有する請求項1に記載のコンパイラ装置。
  3. 前記命令列変形部は、CPUの動作による前記対象部分プログラムの変形として、さらに、前記対象部分プログラム内のループ処理の先頭で実行される一部の命令を前記ループ処理の開始前に複写し、当該一部の命令を除く他の命令を前記ループ処理の先頭に移動し、当該一部の命令を前記ループ処理内の当該他の命令の後に移動することにより、前記対象部分プログラムに含まれる命令間の依存関係を前記置換対象パターンに一致させる
    請求項1に記載のコンパイラ装置。
  4. 前記命令列変形部は、
    CPUの動作によって、前記対象部分プログラム内のループ処理の先頭から、前記置換対象パターン内のループ処理の先頭に対応する命令を検索するまで、前記ループ処理内の命令を順次走査する先頭部検索部と、
    前記先頭部検索部により走査されたそれぞれの命令のうち、前記置換対象パターン内のループ処理の先頭に対応する命令を除いた命令のそれぞれを、前記対象部分プログラム内のループ処理の開始前に実行させる部分に、CPUの動作により複製する先頭部複製部と、
    CPUの動作により、前記ループ処理の先頭の命令を、前記対象部分プログラムにおいて前記置換対象パターン内のループ処理の先頭に対応する命令に変更する開始命令変更部と
    を有する請求項3に記載のコンパイラ装置。
  5. 前記命令列変形部は、さらに、前記対象部分プログラム内のループ処理に、演算結果を変数に代入する第1命令を含み、かつ、当該変数の内容を参照する命令を前記ループ処理の後に実行される部分に含むことを条件に、前記対象部分プログラムに対し、前記第1命令を複製して当該ループ処理の終了条件が成立した場合に実行される部分に挿入する変形を行い、
    前記命令列置換部は、前記対象部分プログラムおよび前記置換対象パターンの間で命令間の依存関係が、変形によりループ処理外では参照されなくなった変数へ値を代入する前記第1命令を除き一致したことを条件に、前記対象部分プログラムを、前記置換対象パターンに対応して定められた置換先命令列に置換する
    請求項1に記載のコンパイラ装置。
  6. 前記対象部分プログラム中の命令は、当該命令の処理の内容を示す右辺式、および、当該処理の結果を格納する変数を示す左辺式の組であり、
    前記命令列変形部は、
    前記対象部分プログラム内の基本ブロック毎に、当該基本ブロック内の各命令を走査して、前記対象部分プログラム内の複数の命令のうち当該基本ブロック内の何れかの命令によって右辺式に示す処理の結果又は左辺式に示す変数の値が変更され得る命令の集合を選択して、当該命令の集合を示すKILLデータをCPUの動作により生成して記憶装置に格納する第2KILLデータ生成部と、
    前記対象部分プログラム内の基本ブロック毎に、CPUの動作によって、当該基本ブロックの末尾から順に各命令を実行とは逆順に走査し、走査するそれぞれの命令を、当該命令が前記KILLデータに含まれていないか、または、未走査の他の命令の存在を理由に前記KILLデータに含まれていることを条件に順次選択して、選択した当該命令の集合を示すGENデータを生成して記憶装置に格納する第2GENデータ生成部と、
    前記対象部分プログラム内の基本ブロック毎に、CPUの動作によって当該基本ブロックのKILLデータおよびGENデータを記憶装置から読み出して、当該基本ブロックの先頭にコード移動することのできる命令の集合を示すINデータから当該KILLデータを除外して当該GENデータとの集合和を算出する演算を行うことにより、当該基本ブロックの末尾にコード移動することのできる命令の集合を示すOUTデータをCPUの動作によって生成して記憶装置に格納する第2OUTデータ生成部と、
    前記対象部分プログラム内の基本ブロック毎に、CPUの動作によって当該基本ブロックの直前に実行される各基本ブロックのOUTデータを記憶装置から読み出して、当該OUTデータの集合積を算出する演算を行うことにより、当該基本ブロックの前記INデータを生成する第2INデータ生成部と、
    前記対象部分プログラムにおいて前記ループ処理の終了条件が成立した場合に実行される基本ブロックに、当該基本ブロックの前記INデータに含まれる命令をCPUの動作により挿入する第2コード変形部と
    を有する請求項5に記載のコンパイラ装置。
  7. 前記置換対象パターンは、前記置換対象パターンに含まれる複数の命令の各々をノードとし、前記複数の命令間の実行の依存関係を有向エッジとした依存グラフであり、
    前記対象部分プログラム検索部は、各々の当該部分プログラムについて、当該部分プログラムに含まれる複数の命令の各々をノードとし、当該複数の命令の実行の依存関係を有向エッジとした依存グラフを生成し、当該依存グラフ及び前記置換対象パターンを示す依存グラフに基づいて、当該部分プログラムを前記対象部分プログラムとして検索するか否かをCPUの動作により判断する
    請求項1記載のコンパイラ装置。
  8. 前記置換対象パターンは、
    ループ処理の先頭で実行され、第1変数の値として与えられるアドレスに第2変数の値として与えられるオフセット値を加えたアドレスのメモリからデータを読み出す読出命令、
    前記読出命令の後に実行され、読み出したデータを定数値と比較して比較結果に基づき前記ループ処理外の命令実行に分岐する少なくとも1つの条件分岐命令、および
    前記条件分岐命令における条件が不成立の場合に実行され、前記第2変数の値をインクリメントしてから前記ループ処理に先頭に処理を戻すインクリメント命令を含み、
    前記置換先命令列は、第1変数の値として与えられるアドレスを先頭としてメモリを順次走査して、予め設定した何れかの定数値と一致するデータが格納されているアドレスを出力するTRT命令を含む命令列である
    請求項1に記載のコンパイラ装置。
  9. 最適化対象の対象プログラムの中から、予め定められた複数の命令を有する置換対象パターンを検索し、検索した前記置換対象パターンを、前記置換対象パターンに対応して定められた置換先命令列に置換して最適化する方法であって、
    前記対象プログラムが有する複数の部分プログラムのうち、前記置換対象パターンに含まれる全ての命令に対応する命令を含む部分プログラムをCPUの動作により検索して、最適化対象の対象部分プログラムとして記憶装置に格納し、
    前記記憶装置に格納された前記対象部分プログラムに対し、条件分岐命令よりも先に実行される命令を当該条件分岐命令の分岐先のそれぞれに移動させる変形をCPUの動作によって行って、前記対象部分プログラムに含まれる命令間の依存関係を前記置換対象パターンに一致させ、
    変形された前記対象部分プログラムを、前記置換対象パターンに対応して定められた置換先命令列に、CPUの動作により置換して、最適化後の対象プログラムに含めて出力する、方法。
  10. 最適化対象の対象プログラムの中から、予め定められた複数の命令を有する置換対象パターンを検索し、検索した前記置換対象パターンを、前記置換対象パターンに対応して定められた置換先命令列に置換して最適化するコンパイラ装置として、コンピュータを機能させるコンパイラプログラムであって、
    前記コンピュータを、
    前記対象プログラムが有する複数の部分プログラムのうち、前記置換対象パターンに含まれる全ての命令に対応する命令を含む部分プログラムをCPUの動作により検索して、最適化対象の対象部分プログラムとして記憶装置に格納する対象部分プログラム検索部と、
    前記記憶装置に格納された前記対象部分プログラムに対し、条件分岐命令よりも先に実行される命令を当該条件分岐命令の分岐先のそれぞれに移動させる変形をCPUの動作によって行って、前記対象部分プログラムに含まれる命令間の依存関係を前記置換対象パターンに一致させる命令列変形部と、
    前記命令列変形部により変形された前記対象部分プログラムを、前記置換対象パターンに対応して定められた置換先命令列に、CPUの動作により置換して、最適化後の対象プログラムに含めて出力する命令列置換部と
    して機能させるコンパイラプログラム。
JP2006277196A 2006-10-11 2006-10-11 プログラム中の命令列をより高速な命令に置換する技術 Pending JP2008097249A (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2006277196A JP2008097249A (ja) 2006-10-11 2006-10-11 プログラム中の命令列をより高速な命令に置換する技術
US11/853,854 US8296750B2 (en) 2006-10-11 2007-09-12 Optimization of a target program

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2006277196A JP2008097249A (ja) 2006-10-11 2006-10-11 プログラム中の命令列をより高速な命令に置換する技術

Publications (1)

Publication Number Publication Date
JP2008097249A true JP2008097249A (ja) 2008-04-24

Family

ID=39304380

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2006277196A Pending JP2008097249A (ja) 2006-10-11 2006-10-11 プログラム中の命令列をより高速な命令に置換する技術

Country Status (2)

Country Link
US (1) US8296750B2 (ja)
JP (1) JP2008097249A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013206289A (ja) * 2012-03-29 2013-10-07 Fujitsu Ltd プログラム、コード生成方法および情報処理装置
JP2018190261A (ja) * 2017-05-10 2018-11-29 富士通株式会社 情報処理装置、情報処理方法および情報処理プログラム

Families Citing this family (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8656381B2 (en) * 2006-12-07 2014-02-18 International Business Machines Corporation Presenting machine instructions in a machine-independent tree form suitable for post-link optimizations
CA2691851A1 (en) * 2010-02-04 2011-08-04 Ibm Canada Limited - Ibm Canada Limitee Control flow analysis using deductive reaching definitions
US20120117546A1 (en) * 2010-11-08 2012-05-10 International Business Machines Corporation Run-time Module Interdependency Verification
CN107003861B (zh) * 2014-08-29 2020-07-24 华为技术有限公司 用于编译源代码的方法
US9798527B1 (en) * 2017-01-06 2017-10-24 Google Inc. Loop and library fusion
CN115469931B (zh) * 2022-11-02 2023-03-24 北京燧原智能科技有限公司 一种循环程序的指令优化方法、装置、系统、设备及介质

Family Cites Families (20)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3602857B2 (ja) * 1991-04-23 2004-12-15 株式会社日立製作所 多機種対応型情報処理システム、および、方法
JPH0721032A (ja) 1993-07-01 1995-01-24 Mitsubishi Electric Corp プログラム最適化処理方式
JP3311462B2 (ja) 1994-02-23 2002-08-05 富士通株式会社 コンパイル処理装置
US6314562B1 (en) * 1997-09-12 2001-11-06 Microsoft Corporation Method and system for anticipatory optimization of computer programs
US6343375B1 (en) * 1998-04-24 2002-01-29 International Business Machines Corporation Method for optimizing array bounds checks in programs
US20020147969A1 (en) 1998-10-21 2002-10-10 Richard A. Lethin Dynamic optimizing object code translator for architecture emulation and dynamic optimizing object code translation method
US6292938B1 (en) * 1998-12-02 2001-09-18 International Business Machines Corporation Retargeting optimized code by matching tree patterns in directed acyclic graphs
GB2345989A (en) 1999-01-23 2000-07-26 Ibm Executing defined sequences of prolog instructions.
JP3470948B2 (ja) 1999-01-28 2003-11-25 インターナショナル・ビジネス・マシーンズ・コーポレーション 動的コンパイル時期決定方法、バイトコード実行モード選択方法、及びコンピュータ
JP2000284970A (ja) 1999-03-29 2000-10-13 Matsushita Electric Ind Co Ltd プログラム変換装置及びプロセッサ
US6507947B1 (en) * 1999-08-20 2003-01-14 Hewlett-Packard Company Programmatic synthesis of processor element arrays
US6892380B2 (en) 1999-12-30 2005-05-10 Texas Instruments Incorporated Method for software pipelining of irregular conditional control loops
US6772415B1 (en) * 2000-01-31 2004-08-03 Interuniversitair Microelektronica Centrum (Imec) Vzw Loop optimization with mapping code on an architecture
US7185330B1 (en) * 2001-01-05 2007-02-27 Xilinx, Inc. Code optimization method and system
US7140006B2 (en) * 2001-10-11 2006-11-21 Intel Corporation Method and apparatus for optimizing code
US7386839B1 (en) 2002-11-06 2008-06-10 Valery Golender System and method for troubleshooting software configuration problems using application tracing
US20050108695A1 (en) 2003-11-14 2005-05-19 Long Li Apparatus and method for an automatic thread-partition compiler
US7765534B2 (en) * 2004-04-30 2010-07-27 International Business Machines Corporation Compiler with cache utilization optimizations
JP4178278B2 (ja) 2004-05-25 2008-11-12 インターナショナル・ビジネス・マシーンズ・コーポレーション コンパイラ装置、最適化方法、コンパイラプログラム、及び記録媒体
US20060200811A1 (en) * 2005-03-07 2006-09-07 Cheng Stephen M Method of generating optimised stack code

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2013206289A (ja) * 2012-03-29 2013-10-07 Fujitsu Ltd プログラム、コード生成方法および情報処理装置
JP2018190261A (ja) * 2017-05-10 2018-11-29 富士通株式会社 情報処理装置、情報処理方法および情報処理プログラム

Also Published As

Publication number Publication date
US20080091926A1 (en) 2008-04-17
US8296750B2 (en) 2012-10-23

Similar Documents

Publication Publication Date Title
JP2008097249A (ja) プログラム中の命令列をより高速な命令に置換する技術
US9552335B2 (en) Expedited techniques for generating string manipulation programs
US7707568B2 (en) Compiler optimization
JP5437557B2 (ja) 検索処理方法及び検索システム
JP4118456B2 (ja) プログラム言語処理システム、コード最適化方法、及び機械読み出し可能な記憶媒体
JP4865022B2 (ja) オープンな仕様環境におけるデータの位置を決定するための方法及び装置
JP5966509B2 (ja) プログラム、コード生成方法および情報処理装置
JP2005025763A (ja) 構造化文書の分割プログラム、分割装置、及び分割方法
JP2008059279A (ja) 文字列出力処理を最適化する技術
JP2010287213A (ja) ファイル変換装置、ファイル変換方法およびファイル変換プログラム
US20100005058A1 (en) Computer product, information retrieving apparatus, and information retrieving method
CN113407709A (zh) 生成式文本摘要系统和方法
US7979853B2 (en) Compiler device, method, program and recording medium
US9524354B2 (en) Device, method, and program for processing data with tree structure
JP5342760B2 (ja) 訳語学習のためのデータを作成する装置、方法、およびプログラム
US20050071832A1 (en) Optimizing compiler
JP6737117B2 (ja) 符号化データ検索プログラム、符号化データ検索方法および符号化データ検索装置
JP5932707B2 (ja) 計算機、プログラム及びデータ生成方法
JP7035751B2 (ja) コード変換装置、コード変換方法、及びコード変換プログラム
JP3628580B2 (ja) 類似文検索方法、装置、および類似文検索プログラムを記録した記録媒体
JP5808264B2 (ja) コード生成装置及びコード生成方法及びプログラム
JP5483166B2 (ja) 文書検索装置、文書検索方法、及びプログラム
JP6044422B2 (ja) 略称生成方法および略称生成装置
JP4304146B2 (ja) 辞書登録装置、辞書登録方法および辞書登録プログラム
US20230101206A1 (en) Data Hazard Generation