JP4181326B2 - コード最適化のための方法、装置及びプログラム - Google Patents
コード最適化のための方法、装置及びプログラム Download PDFInfo
- Publication number
- JP4181326B2 JP4181326B2 JP2002055483A JP2002055483A JP4181326B2 JP 4181326 B2 JP4181326 B2 JP 4181326B2 JP 2002055483 A JP2002055483 A JP 2002055483A JP 2002055483 A JP2002055483 A JP 2002055483A JP 4181326 B2 JP4181326 B2 JP 4181326B2
- Authority
- JP
- Japan
- Prior art keywords
- code
- function
- call
- instruction
- calls
- 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.)
- Expired - Lifetime
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements 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/30—Arrangements for executing machine instructions, e.g. instruction decode
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
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)
Description
【発明の属する技術分野】
本発明は一般に、高速実行を達成するコンピュータ・コードの最適化に関し、特に、コードのコンパイル及びリンクに続くオブジェクト・コードの最適化に関する。
【0002】
【従来の技術】
ポストリンク・コード最適化プログラムは、一般に、静的にリンクされたライブラリ・コードを含む実行可能コード全体に渡る、全体的な分析を実行する。実行可能コードは再コンパイルまたは再リンクされないので、ポストリンク最適化プログラムは、コンパイラ及びリンカ規定を保守する必要がない。従って、ポストリンク最適化プログラムは、コンパイル単位に渡って、最適化コンパイラ(optimizing compiler)では使用できない積極的な最適化を実行することができる。
【0003】
同時に、ポストリンク最適化プログラムは、コンパイル時の最適化において遭遇する問題を扱わねばならない。最適化コンパイラは高水準言語記述形式の入力に作用し、これは一般に、セマンティックスが明確に定義されたソース・コードである。それに対して、静的ポストリンク最適化ツールは、入力として、低水準実行可能命令(オブジェクト・コード)を受け取る。ポストリンク最適化プログラムは最初に、オブジェクト・コードに含まれるデータ及び命令を識別するために、オブジェクト・コードのディスアセンブルを試行しなければならない。ディスアセンブル後であっても、ポストリンク最適化プログラムに与えられる実行可能コードのセマンティックスは、以下の理由から、部分的にしか知られていない。すなわち、
1)実行可能オブジェクト内のコード命令及びデータが混ざり合い、ときとして、両者間の区別を不可能にする。一般に最適化プログラムが、データまたはコード命令のいずれかに明確に分類できないコード域が存在する。本出願の状況では、これらのコード域は"未分類コード域"(non-classified code area)と呼ばれる。
2)コード命令を含むことが知られている完全に分類されたコード域であっても、プログラムのセマンティックスは常に決定できる訳ではない。機械語命令は、データ情報またはメモリ位置のいずれかを含むレジスタに作用する。従って、最適化プログラムは、所与の命令が純粋なデータ計算を実行するか否か、或いは所与の命令がデータを検索または記憶するために、またはプログラム・コード内の制御転送を実行するために、後にプログラム内で使用されるアドレスを計算するか否かに関して不確かである。
3)データ要素、及びそれらのタイプに当たるアレイ、構造またはスカラなどは、C、C++またはパスカルなどの、高水準言語内でのみ識別可能である。ポストリンク・コードでは、これらの要素が任意のデータ域として現れ、それらの参照が任意のアドレスとして扱われる。従って、ポストリンク・レベルでは、データ要素の参照が完全に解析されない。
【0004】
これらの要因により、プログラムのコード・セマンティックスをポストリンク・コードから完全に抽出することはできず、プログラムにより使用されるデータとコード要素との間の幾つかの依存性が、不確かのままとなる。
【0005】
Haberらは、彼らの論文"Reliable Post-Link Optimizations Based on Partial Information"、Proceedings of Feedback Directed and Dynamic Optimizations Workshop 3 (Monterey、California、December、2000)、Pages 91-100で、これらの問題を扱うアプローチについて述べている。最初に、最適化されるプログラムが、基本ブロックにディスアセンブルされる。これは、プログラム内で解析される全ての制御フロー・パスを、増分的に追跡することにより行われる。基本ブロックがコード、データ、または未分類(完全に分析されない)としてマークされる。コード・ブロックは更に、それらの制御フロー属性に従いフラグを立てられる。プログラムの部分的に分析されたエリアが、未分類ブロックを含むように区切られ、残りのプログラムを、これらのブロックが最適化に課する制限から解放する。部分的に分析されたエリアは、それらが内部的に最適化されなくても、まとめて安全に再配置され、全体としてコードの再順序化及び最適化を可能にする。
【0006】
ポストリンク・コード最適化及び再構成の別の面が、Henisらによる"Feedback Based Post-Link Optimization for Large Subsystems"、Second Workshop on Feedback Directed Optimization (Haifa、Israel、November、1999)、pages 13-20、或いはSchmidtらによる"Profile-Directed Restructuring of Operating System Code"、IBM Systems Journal 37:2 (1998)、pages 270-297で述べられている。
【0007】
【発明が解決しようとする課題】
特定のレジスタを使用する関数がプログラムの実行中に読出されるとき、一般に関数が実行を開始する前に、これらのレジスタの内容を記憶し(メモリに保管する)、この関数が復帰するとき、レジスタ内容を復元することが必要である。この目的のためにコンパイラは一般に、適切なストア命令を、エピローグ内の対応するリストア命令と一緒に、コンパイル済みコード内のその関数のプロローグに追加する。しかしながら、関数の特定の呼び出しでは、これらのストア/リストア命令の幾つかが余計となる。例えば、関数呼び出し後にレジスタが"kill"される場合(すなわち、レジスタ内の値が再度使用される前に上書きされる)、レジスタ内容を記憶し復元する目的は無くなる。最新の高速プロセッサではメモリ・アクセスがボトルネックとなるので、これらの余計なストア操作及びリストア操作を除去すれば、プログラム実行時間を大幅に低減することができる。
【0008】
Martinらは、"Exploiting Dead Value Information"(Proceedings of Micro-30発行)で、デッド(dead)レジスタの内容の記憶及び復元の排除にもとづく、コンパイラ最適化の方法について述べている。レジスタの将来の使用に関する表明を提供するデッド値情報が、コンパイル時に計算される。著者は、この情報がプロセッサに伝達されるように、プロセッサ命令セット・アーキテクチャを拡張することを提案している。このハードウェア特殊化が無いと、プロシージャ呼び出し時及び復帰時に、一部のストア操作及びリストア操作を排除する際、標準RISC呼び出し規定により、依然として、デッド値情報のサブセットがプロセッサにより推論され使用されることになる。
【0009】
【課題を解決するための手段】
本発明の好適な実施例は、プログラム実行の最適化を目的とする、余計なストア命令及びリストア命令のポストリンク除去のための方法を提供する。Martinらにより述べられる方法などの、コンパイラ・ベースの方法と異なり、ポストリンク最適化は、デッド・レジスタがコンパイラ境界を横断して識別されることを可能にする。従って本発明の方法は、一般に最適化単位の範囲が制限されるコンパイラ最適化と異なり、実行可能コード全体を統一して扱うことができるので、グローバル・プログラム最適化を可能にする。
【0010】
更に、コンパイラの最適化はリンク規定により拘束されるのに対して、ポストリンク最適化プログラムはこれらの規定を無視し、不要なストア命令及びリストア命令を除去することができる。従って本発明の方法は、コンパイル時ツールだけが使用される場合に比較して、不要なメモリ操作をより十分に排除するために使用される。更にこれらの方法は、例えばレガシー・オブジェクト・コードや、静的にリンクされたオブジェクト・コード・ライブラリが、実行可能コード内に組み込まれる場合のように、ソース・コードがコンパイル時の最適化のために使用不能な場合であっても、コード最適化のために使用される。
【0011】
本発明の好適な実施例では、ポストリンク最適化プログラムがポストリンク・オブジェクト・コードをディスアセンブルし、ディスアセンブルされた該コード内で呼び出される関数を識別する。既知の最適化方法の場合のように、関数の制御フロー・グラフ全体を分析する必要はなく、それらの構成命令を決定するだけでよい。各々の関数は一般にプロローグとエピローグを有し、これらは、その関数により使用されるレジスタに関連するストア命令及びリストア命令を含む。これらのレジスタは、ここでは不揮発性レジスタと呼びばれる。最適化プログラムはディスアセンブルされたコードを分析し、その関数の呼び出しを突き止め、次に各関数呼び出しに続く命令を調査し、その関数が復帰した後に、不揮発性レジスタのいずれかがkillされるか否かを判断する。killされる場合、最適化プログラムは、killされるレジスタに関する関数プロローグ及びエピローグ内のストア命令及びリストア命令が、その関数のこの特定の呼び出しにおいて(また恐らく他の呼び出しにおいても、)必要でないと判断する。次に、最適化プログラムは、その関数がこの呼び出しにより呼び出されるときに、その関数から少なくとも不要なストア命令と、好適にはリストア命令も削除するように、ポストリンク・コードを変更する。
【0012】
本発明の幾つかの好適な実施例では、最適化プログラムがポストリンク・コード内で、所与の関数の複数の呼び出しを識別及び分析し、その関数の特定の呼び出しに続いて、どの不揮発性レジスタがkillされるかを判断する。最適化プログラムは次に、killされる全ての不揮発性レジスタに関連するストア命令及びリストア命令が削除されるように、その関数の最適化バージョンを作成する。ある不揮発性レジスタがkillされる各関数呼び出しに対して、最適化プログラムは、その関数の最適化バージョンを呼び出すそれぞれのラッパ・コードを作成し、その関数呼び出しを、適切なラッパ・コードへの無条件分岐により置換する。ラッパ・コードは一般に、最適化関数の呼び出しに先行して、特定の関数呼び出しに続きkillされることのないレジスタの内容を記憶する1つ以上のストア命令を含み、更に、最適化関数に続く対応するリストア命令を含む。換言すると、ラッパは、最適化関数のプロローグ及びエピローグから削除された、一部のストア/リストア命令を置換するが、それらはその関数のそれぞれの特定の呼び出しにおいて必要とされるものに限られる。
【0013】
ラッパ・コード及び最適化関数は、好適には、オリジナル・ポストリンク・コードの終わりに追加される。従って、この段階では、オリジナル関数呼び出しをラッパ・コードへの分岐命令により置換する以外は、コード本体の変更は行われない。その結果、オリジナル関数に代わる最適化関数の使用は、完全には分析できないオリジナル・コードの一部内に存在する参照へは影響せず、それらが有効に維持されるという意味で、全く安全である。最適化コードは一般に、オリジナル・ポストリンク・コードよりも長いが、コード矯正(code straightening)などの既知の追加の最適化ステップが、その後コードに適用される。
【0014】
或いは、ストア命令が、前述のように分析される関数のプロローグ(または関数の最適化バージョン)内で都合良く順序付けられる場合、関数呼び出しを指定変更することにより、単に不要なストア操作をスキップするように、ポストリンク・コードが変更される。当業者には明らかであろう、コードを変更する他の方法についても、本発明の範囲に含まれるものとみなされる。
【0015】
従って、本発明の好適な実施例によれば、コード最適化のための方法が提供され、この方法は、コンパイルされ且つリンクされたオブジェクト・コードをディスアセンブルするステップと、ディスアセンブルされた前記コード内で、レジスタに関連するストア命令及びリストア命令を含む関数の複数の呼び出しを識別するステップと、ディスアセンブルされた前記コードを分析し、前記レジスタをkillする命令が後に続く前記関数の前記呼び出しの一つを突き止めるステップと、前記関数が、突き止められた前記呼び出しにより呼び出されるとき、前記関数から前記ストア命令を削除するように、前記関数に対応する前記コードを変更するステップとを含み、
前記コードを変更するステップが、前記ストア命令が削除された前記関数の最適化バージョンを作成するように、前記関数に対応する前記コードの一部を前記コードの終わりに複製するステップをさらに含む。
【0016】
好適には、前記コードを変更するステップが、前記関数が前記呼び出しの前記1つにより呼び出されるとき、前記関数から前記リストア命令を削除するように、前記コードを変更するステップを含む。
【0017】
好適には、前記呼び出しの前記1つを指定変更するステップが、複数の前記呼び出しを前記関数の前記最適化バージョンの前記アドレスに指定変更するステップを含む。
【0018】
好適には、前記関数が複数のレジスタに関連するストア命令及びリストア命令を含み、指定変更される前記複数の呼び出しの各々が、前記複数のレジスタの少なくとも1つをkillするそれぞれの命令が後に続き、前記コードの一部を前記コードの終わりに複製するステップが、前記関数の前記最適化バージョンから、指定変更された前記呼び出しに続きkillされる全てのレジスタに関連する、前記ストア命令及びリストア命令を削除するステップを含む。
【0019】
好適には、前記コードを変更するステップが、前記関数の少なくとも1つの他の呼び出しに対して、ラッパ・コードを作成するステップを含み、前記ラッパ・コードが、前記関数の前記最適化バージョンの呼び出しを含み、該呼び出しが、前記レジスタに関連するストア命令により先行され、前記レジスタに関連するリストア命令が後に続き、前記コードを変更するステップが、前記関数の少なくとも1つの他の呼び出しを前記ラッパ・コードに指定変更するステップを含む。
【0020】
好適には、前記関数の少なくとも1つの他の呼び出しをラッパ・コードに指定変更するステップが、前記関数の少なくとも1つの他の呼び出しを、前記ラッパ・コードへの分岐命令により置換するステップを含む。
【0021】
好適には、前記ラッパ・コードを作成するステップが、指定変更される異なる呼び出しに対して、複数のそれぞれのラッパ・コードを作成するステップを含み、前記複数の呼び出しを指定変更するステップが、異なる前記呼び出しをそれぞれの前記ラッパ・コードに指定変更するステップを含む。
【0022】
好適には、ディスアセンブルされた前記コードが、最後の命令で終わる命令の固定シーケンスを含み、前記コードの一部を置換するステップが、複製された前記コードを、前記固定シーケンスを変更することなく、前記最後の命令の後に追加するステップを含む。
【0023】
更に、本発明の好適な実施例によれば、コード最適化のための装置が提供され、この装置は、コンパイルされ且つリンクされたオブジェクト・コードをディスアセンブルし、ディスアセンブルされた前記コード内で、レジスタに関連するストア命令及びリストア命令を含む関数を識別し、ディスアセンブルされた前記コードを分析し、前記レジスタをkillする命令が後に続く前記関数の前記呼び出しの一つを突き止め、ここで前記関数の少なくとも1つの他の呼び出しはレジスタをkillする命令が後に続かず、前記関数が少なくとも1つの他の呼び出しにより呼び出されるとき前記ストア命令の実行を削除せず、前記関数が前記呼び出しの前記1つにより呼び出されるとき前記関数から前記ストア命令の実行を削除するように前記関数に対応する前記コードを変更し、ここで前記コードを変更することが、前記ストア命令が削除された前記関数の最適化バージョンを作成するように、前記関数に対応する前記コードの一部を前記コードの終わりに複製する。
【0024】
更に、本発明の好適な実施例によれば、コード最適化のためのプログラムが提供され、前記命令がコンピュータにより呼び出され、前記コンピュータに、コンパイルされ且つリンクされたオブジェクト・コードをディスアセンブルするステップと、ディスアセンブルされた前記コード内で、レジスタに関連するストア命令及びリストア命令を含む関数の複数の呼び出しを識別するステップと、ディスアセンブルされた前記コードを分析し、前記レジスタをkillする命令が後に続く前記関数の前記呼び出しの一つを突き止めるステップであって、前記関数の少なくとも1つの他の呼び出しはレジスタをkillする命令が後に続かない、前記突き止めるステップと、前記関数が少なくとも1つの他の呼び出しにより呼び出されるとき前記ストア命令の実行を削除せず、前記関数が前記呼び出しの前記1つにより呼び出されるとき前記関数から前記ストア命令の実行を削除するように前記関数に対応する前記コードを変更するステップとを実行させる。ここで、前記コードを変更するステップが、前記ストア命令が削除された前記関数の最適化バージョンを作成するように、前記関数に対応する前記コードの一部を前記コードの終わりに複製するステップをさらに含む。
【0025】
【発明の実施の形態】
図1は、本発明の好適な実施例に従い、コンピュータ・プログラム・コードを処理するシステム20を示すブロック図である。システム20は好適には汎用コンピュータ・プロセッサを含み、これは後述の関数を実行するようにプログラムされる。プロセッサはこれらの関数を、この目的のために供給されるソフトウェアの制御の下で実行する。ソフトウェアはネットワークを介して、プロセッサに電子形式でダウンロードされるか、或いはCD−ROMなどの有形媒体上に提供される。
【0026】
システム20は一般に、プログラマにより用意されたソース・コードを受信する。周知のように、コンパイラ22がソース・コードをコンパイルして、オブジェクト・コードを生成し、リンカ24がコンパイル済みのコードをライブラリ・コードとリンクする。リンクされたオブジェクト・コードが最適化プログラム26に供給され、以下で詳述するように、これがコードを分析し、冗長なストア/リストア命令を削除するように変更する。次に同様に周知のように、最適化されたコードがランタイム・モジュール28により実行される。単純化のために、これら全ての関数22乃至28は、システム20内で実行されるように示されるが、これらは分離され、異なるコンピュータ上で実行されてもよい。従って、最適化プログラム26は本発明にとって重要な要素であり、システム20の外部にある別のソースからポストリンク・コードを受け取り、最適化されたコードを別のコンピュータに受け渡して実行する。
【0027】
図2は、本発明の好適な実施例に従い、ポストリンク・コードを最適化するために、最適化プログラム26により実行される方法を示すフローチャートである。ポストリンク・コードは、ディスアセンブル・ステップ30においてディスアセンブルされ、コード内の命令が識別される。既知の任意の好適な方法が、この目的のために使用される。好適には、例えば前述のHaberら及びHenisらによる論文で述べられるように、増分ディスアセンブル方法が、コードをその基本ブロックにディスアセンブルするために使用される。この目的のために、実行可能コード内の命令のアドレスが、様々なソースから抽出されて、"潜在的なエントリ・ポイント"のリストが形成される。ソースは一般に、プログラム/DLLエントリ・ポイント、(関数及びラベルの)記号テーブル、及び再配置テーブル(これを通じて、コードを指し示すポインタがアクセスされる)を含む。最適化プログラムはこれらのエントリ・ポイントから開始して、制御フローに従いプログラムを横断し、全ての可能な制御フロー・パスを解析し、リストに例えばJUMPやCALL命令のターゲットなどの、追加の潜在的なエントリ・ポイントの新たに発見されたアドレスを追加する。
【0028】
このようにプログラムの制御フローに従う割合が、コードの大きな割合を占める。増分ディスアセンブルにより直接発見可能でない基本ブロックは、"未分類コード"とマークされる。これらのブロックは一般に、ランタイム時にだけ解析されるターゲット・レジスタにより、ジャンプを介して到達されるコードから成る。ときに、Henisらにより述べられるように、コード及び動的ランタイム分析のツールを用いて、これらのブロックを分類することが可能であるが、この方法の説明は本願の範囲を超えるため、ここでは説明を省略する。
【0029】
増分ディスアセンブルプロセスの終わりに、オリジナル・プログラムのコード・セクション全体が、分類済みまたは未分類の基本ブロックにディスアセンブルされる。分類済みブロックはフラグによりマークされ、フラグがそれらをコードまたはデータ(例えば分岐テーブル・データ)として特徴付け、例えばFallthrough、Continue、Call、Return、Jumpなどの、コード・ブロックの制御フロー属性を識別する。特に、Callフラグ及びReturnフラグは、関数識別ステップ32において、コード内の関数及び関数呼び出しを識別するために使用される。
【0030】
一般に、ステップ32で識別される関数の各々は、プロローグ及びエピローグを有し、その関数により使用される特定のレジスタの内容を記憶及び復元する命令を含む。本願の状況では、これらのレジスタは"不揮発性レジスタ"と称される。各関数における不揮発性レジスタの処理が、分析ステップ34で分析され、これらのどのレジスタがその関数の各呼び出しに続き、ランライム時に再度参照される前にkillされるかを判断する。好適には、レジスタRxが、プログラム・コード内のその関数の呼び出し命令に続く、所与のアドレスaddrにおいてkillされるか否かを判断するために、そのアドレスに続くディスアセンブルコードの制御フローが、Rxをkillする命令に達するまでトレースされる。この場合、Rxはアドレスaddrにおいてkillされるとみなされる。一方、トレースがRxを使用する命令に達する場合、または例えば条件付き分岐命令や、レジスタを介する分岐、或いは未分類コード域などに達し、トレースが失敗する場合には、Rxはアドレスaddrでkillされるとみなされない。
【0031】
各関数fに対して、ステップ34の分析は、好適には次の情報を決定するために使用される。すなわち、
a)REG(f):関数f内で使用される全ての不揮発性レジスタのセット。
b)KREG(addr,f):アドレスaddrでkillされるREG(f)内の全てのレジスタのサブセット。但し、addrは前述のように、関数fの呼び出し命令に続くアドレス。
c)OPT(f):全てのKREG(addri,f)の和集合内の不揮発性レジスタのセット。但し、addriは関数fの呼び出し命令に続くアドレス(すなわち、全体プログラム内で、関数fの呼び出し命令の1つの後でkillされる、その関数f内の不揮発性レジスタのセット)。
【0032】
OPT(f)が空でないとき、プログラム内に、関数fの特定の不揮発性レジスタが続きkillされる1つ以上の呼び出し命令が存在する。従って、プログラム・コードは、コード変更ステップ36において、killされるレジスタに対する、冗長なストア命令及びリストア命令を削除するように変更される。この変更は好適には、後述のように、冗長なストア/リストア命令無しに、関数fのコードを複製し、次に、必要なストア命令及びリストア命令を"ラッパ・コード"内に追加することにより実行される。或いは、コード変更の他の方法が同じ目的のために使用されてもよい。
【0033】
図3は、本発明の好適な実施例に従うコード変更ステップ36の詳細を示すフローチャートである。コード変更は、OPT(f)が空でないプログラム内の各関数fに対して実行される。最初に複製ステップ40で、関数fのコードが、好適には既存のプログラム・コードの終わりにおいて複製される。この新たに複製された関数をf_optと命名する。OPT(f)セット内の各レジスタRxに対して、削除ステップ42で、f_optのプロローグ内のRxのストア命令、及びf_optのエピローグ内のRxのリストア命令が削除される。
【0034】
プログラム内の関数fの各呼び出し命令に対して、ラッパ・ステップ44で、ラッパ・コードが生成される。このステップの目的上、addrを、関数fの呼び出し命令に続くコード・アドレスとする。OPT(f)−KREG(addr,f)が空でないと仮定すると、ラッパ・コードは次の命令を含む。すなわち、
store R1
store R2
・・・
store Rn
call f_opt
restore Rn
restore Rn-1
・・・
restore R1
branch addr
【0035】
ここで{R1,R2,..,Rn}=OPT(f)−KREG(addr,f)である。オリジナル・プログラム内のfの呼び出し命令は、分岐ステップ46において、前記のラッパ・コードへの無条件分岐により置換される。OPT(f)−KREG(addr,f)が空の場合、関数fの呼び出し命令を、f_optの直接呼び出しにより置換すればよい。他方、KREG(addr,f)が空の場合、オリジナル・プログラム内の関数fの呼び出し命令は、好適には無変更のままである。
【0036】
ステップ40で関数fのコードを複製する理由は、プログラムの正当性を保持するためである。なぜなら、プログラムは関数fの他の検出されていない呼び出し命令を含み得るからである。これらの呼び出し命令はレジスタを介して、またはライブラリや、ポストリンク・コードが与えられていない他の実行可能コードなどの、他のコード・モジュールから生成され得るので、静的ポストリンク分析により呼び出しを確実に検出することは不可能である。関数fの不揮発性レジスタの1つのkillが後に続く、検出された全ての呼び出し命令が、前述のように、最適化関数f_optを呼び出すために指定変更される。不揮発性レジスタのkillが後に続かない呼び出し命令は、前述のように、好適には変更されずに維持される。同様に未検出の呼び出し命令は、オリジナル非最適化関数fへの分岐を続け、従って以前のプログラム・セマンティックスを維持する。
【0037】
下記の表1は、ディスアセンブルされたポストリンク・コードのサンプルを示し、そこでは関数fooの幾つかの呼び出しが発生する。この例では、関数fooは次の定義により特徴付けされる。すなわち、
a)REG(foo)={R27,R28,R29}
b)KREG(L2,foo)={R27}、
KREG(L4,foo)={}
KREG(L4,foo)={R28}
c)OPT(foo)={R27,R28}
【0038】
下記の表の左辺は、最適化前のポストリンク・コードを示し、右辺はfooの2つの呼び出しを適切なラッパ・コードへの分岐により置換した、最適化後のコードを示す。
【表1】
コード比較:
最適化前 最適化後
プログラム開始 プログラム開始
・・・ ・・・
L1: call foo L1: branch L7
L2: R27をここでkill L2: R27をここでkill
・・・ ・・・
L3: call foo L3: call foo
L4: .../*ここではfooの不揮発性*/ L4: .../*ここではfooの不揮発性*/
/*レジスタをkillしない*/ /*レジスタをkillしない*/
・・・ ・・・
L5: call foo L5: branch L8
L6: R28をここでkill L6: R28をここでkill
・・・ ・・・
機能foo: 機能foo:
プロローグ: プロローグ:
store R27 storeR27
store R28 storeR28
store R29 storeR29
・・・ ・・・
エピローグ: エピローグ:
・・・ ・・・
restore R29 restoreR29
restore R28 restoreR28
restore R27 restoreR27
return return
・・・ ・・・
プログラム終了 L7: store R28 /*ラッパ・コード1*/
call foo_opt/*指定変更呼び出し*/
restore R28
branch L2
L8: store R27 /*ラッパ・コード2*/
call foo_opt/*指定変更呼び出し*/
restore R27
branch L6
・・・
機能foo_opt:
プロローグ:
store R29
/*store R27, R28削除*/
・・・
エピローグ:
restore R29
/*restore R27, R28削除*/
return
・・・
プログラム終了
【0039】
好適には、前述の最適化を実行後、生成コードにコード矯正(code-straightening)アルゴリズムが適用され、ラッパ・コードへの、及びラッパ・コードからの無条件分岐を削除する。この矯正アルゴリズムは、ポストリンク最適化ツールの分野では既知であり、こうしたツールには、例えばIBMからAIX(商標)オペレーティング・システムのパフォーマンス・ツール・ボックス(PTX)の一部として提供される、FDPR(Feedback Directed Program Restructuring)ツールなどがある。PTXの詳細については、Haberら、Henisら、及びSchmidtらによる前記論文で述べられている。
【0040】
前述のような、コード複製及びラッパ・コードの使用は、便利で一般的な解決方法であり、プログラムのパーツが未分類または未知のままであっても、冗長なストア/リストア命令の削除を可能にする。しかしながら、プログラム・コード全体が使用可能で、完全に分析され、従って、コード内のfの全ての関数呼び出し命令が確実に見いだされるケースが存在する。これらの場合、複製ステップ40は不要となる。代わりに好適には、関数fのプロローグ及びエピローグから、冗長なストア/リストア命令が、対応するNOP命令により置換される。このとき、ステップ44で生成されるラッパ・コードは、f_optではなく、fの呼び出しを含む。冗長なストア/リストア命令を単に削除する代わりに、NOPにより置換することは、関数fのプログラム・コード全体を再配置する必要性を排除する。
【0041】
fの所与の関数呼び出し命令において、関数呼び出しに続きkillされる不揮発性レジスタのセットKREG(addr,f)に関するストア命令が、その関数のプロローグ内の最初の連続命令である場合がある。或いは、プログラム・セマンティックスに影響を及ぼすことなく、これらのストア命令がプロローグの先頭に再スケジュールされるかもしれない。こうした場合、ストア命令はf_opt内に(または前述のようにfが複製されない場合には、f自身内に)取り残される。このとき、f_optまたはfの先頭に配置される冗長なストア命令をスキップするように、所与の呼び出し命令のターゲット・アドレスを単に指定変更することにより、冗長なストア命令が回避される。このアプローチは、より短い単純なラッパ・コードの使用を可能にする。
【0042】
同様に、fのkillされる全ての不揮発性レジスタOPT(f)に関するストア命令が、関数のプロローグ内の最初の連続命令であるか、或いはこのように再スケジュールされる場合が発生し得る。こうした場合にも、関数fのコードを複製することなく、本発明の最適化が実行される。代わりに、f内のストア命令がプロローグの先頭の所定位置に取り残され、関数の呼び出し命令が、適宜ストア命令をスキップするように指定変更される。この場合、冗長なリストア命令のあるものは依然実行されるかもしれない。
【0043】
本発明の別の実施例は、ポストリンク時に新たなスタック・フレームを増加または作成することが可能な場合において使用される。この実施例では、OPT(f)内のレジスタに関連するf内の全てのストア命令及びリストア命令が、NOP命令により置換され、fがf_optとリネームされる。このとき前述のように、関数fに関して解析された全ての呼び出し命令が、killされないレジスタを記憶及び復元する適切なラッパ・コードの呼び出しにより置換される。関数fの任意の未解析の呼び出し命令を処理するために、次のように、新たな関数fがプログラム・コードに追加される。すなわち、
store R1
store R2
・・・
store Rn
call f_opt
restore Rn
restore Rn-1
・・・
restore R1
return
【0044】
ここで再度、{R1,R2,...,Rn}は、OPT(f)内の不揮発性レジスタのセットである。
【0045】
fの新たなスタック・フレームを増加または作成することにより、オリジナル関数fの全ての参照がこの新たな関数に指定変更されるように、ポストリンク・プログラムの再配置情報が更新される。このように、fに対する全ての未解析の呼び出し命令が自動的に新たなfに分岐するようになり、プログラムのオリジナル・セマンティックスが維持される。
【0046】
前述の好適な実施例は全て、安全性のために、オリジナル・ポストリンク・コードが最適化の間に拡張または短縮されないことを前提とする。しかしながら、本発明の原理は、コードの削除、追加及び移動を可能にする環境においても、適用可能である。この環境では代わりに、要求されるストア命令及びリストア命令を、fの対応する呼び出し命令の前後に直接挿入することにより、ラッパ・コードの必要性が回避される。同様な理由で、前述のように、ストア命令及びリストア命令をNOP命令により置換することにより、不要な命令が単にコードから削除される。
【0047】
前述の好適な実施例は、例証として引用されたもので、本発明はここで特に示され、述べられた実施例に制限されるものではないことが理解されよう。本発明の範囲は、前述の様々なフィーチャの組み合わせ及び一部の組み合わせを含み、同様に本開示を参照することで、当業者に明らかになろうこれらの変形及び変更も含むものである。
【0048】
【図面の簡単な説明】
【図1】 本発明の好適な実施例に従い、コンピュータ・プログラム・コードを処理するシステムを示すブロック図である。
【図2】 本発明の好適な実施例に従い、ポストリンク・コードを最適化する方法を示すフローチャートである。
【図3】 本発明の好適な実施例に従い、ポストリンク・コード内の冗長なストア命令及びリストア命令を削除する方法を示すフローチャートである。
【0049】
【符号の説明】
20 システム
22 コンパイラ
24 リンカ
26 最適化プログラム
28 ランタイム・モジュール
Claims (19)
- コード最適化のための方法であって、コンピュータが、
コンパイルされ且つリンクされたオブジェクト・コードをディスアセンブルするステップと、
ディスアセンブルされた前記コード内で、レジスタに関連するストア命令及びリストア命令を含む関数の複数の呼び出しを識別するステップと、
ディスアセンブルされた前記コードを分析し、前記レジスタをkillする命令が後に続く前記関数の前記呼び出しの一つを突き止めるステップであって、前記関数の少なくとも1つの他の呼び出しはレジスタをkillする命令が後に続かない、前記突き止めるステップと、
前記関数が少なくとも1つの他の呼び出しにより呼び出されるとき前記ストア命令の実行を削除せず、前記関数が前記呼び出しの前記1つにより呼び出されるとき前記関数から前記ストア命令の実行を削除するように前記関数に対応する前記コードを変更するステップと
を実行し、
前記コードを変更するステップが、前記ストア命令が削除された前記関数の最適化バージョンを作成するように、前記関数に対応する前記コードの一部を前記コードの終わりに複製するステップをさらに含む、方法。 - 前記コードを変更するステップが、前記関数が前記呼び出しの前記1つにより呼び出されるとき、前記関数から前記リストア命令を削除するように、前記コードを変更するステップを含む、請求項1記載の方法。
- 前記コードを変更するステップが、前記呼び出しの前記1つを前記関数の前記最適化バージョンのアドレスに指定変更するステップを含む、請求項1記載の方法。
- 前記呼び出しの前記1つを指定変更するステップが、複数の前記呼び出しを前記関数の前記最適化バージョンの前記アドレスに指定変更するステップを含む、請求項3記載の方法。
- 前記関数が複数のレジスタに関連するストア命令及びリストア命令を含み、指定変更される前記複数の呼び出しの各々が、前記複数のレジスタの少なくとも1つをkillするそれぞれの命令が後に続き、前記コードの一部を前記コードの終わりに複製するステップが、前記関数の前記最適化バージョンから、指定変更された前記呼び出しに続きkillされる全てのレジスタに関連する、前記ストア命令及びリストア命令を削除するステップを含む、請求項4記載の方法。
- 前記コードを変更するステップが、前記関数の少なくとも1つの他の呼び出しに対して、ラッパ・コードを作成するステップを含み、前記ラッパ・コードが、前記関数の前記最適化バージョンの呼び出しを含み、該呼び出しが、前記レジスタに関連するストア命令により先行され、前記レジスタに関連するリストア命令が後に続き、前記コードを変更するステップが、前記関数の少なくとも1つの他の呼び出しを前記ラッパ・コードに指定変更するステップを含む、請求項5記載の方法。
- 前記関数の少なくとも1つの他の呼び出しをラッパ・コードに指定変更するステップが、前記関数の少なくとも1つの他の呼び出しを、前記ラッパ・コードへの分岐命令により置換するステップを含む、請求項6記載の方法。
- 前記ラッパ・コードを作成するステップが、指定変更される異なる呼び出しに対して、複数のそれぞれの前記ラッパ・コードを作成するステップを含み、前記複数の呼び出しを指定変更するステップが、異なる前記呼び出しをそれぞれの前記ラッパ・コードに指定変更するステップを含む、請求項6記載の方法。
- ディスアセンブルされた前記コードが、最後の命令で終わる命令の固定シーケンスを含み、前記コードを変更するステップが、複製された前記コードを、前記固定シーケンスを変更することなく、前記最後の命令の後に追加するステップを含む、請求項3記載の方法。
- コード最適化のための装置であって、
コンパイルされ且つリンクされたオブジェクト・コードをディスアセンブルし、
ディスアセンブルされた前記コード内で、レジスタに関連するストア命令及びリストア命令を含む関数の複数の呼び出しを識別し、
ディスアセンブルされた前記コードを分析し、前記レジスタをkillする命令が後に続く前記関数の前記呼び出しの一つを突き止め、ここで前記関数の少なくとも1つの他の呼び出しはレジスタをkillする命令が後に続かず、
前記関数が少なくとも1つの他の呼び出しにより呼び出されるとき前記ストア命令の実行を削除せず、前記関数が前記呼び出しの前記1つにより呼び出されるとき前記関数から前記ストア命令の実行を削除するように前記関数に対応する前記コードを変更し、ここで前記コードを変更することが、前記ストア命令が削除された前記関数の最適化バージョンを作成するように、前記関数に対応する前記コードの一部を前記コードの終わりに複製することを含む、
前記装置。 - 前記コードを変更することが、前記関数が前記呼び出しの前記1つにより呼び出されるとき、前記関数から前記リストア命令を削除するように、前記コードを変更することを含む、請求項10記載の装置。
- 前記コードを変更することが、前記呼び出しの前記1つを前記関数の前記最適化バージョンのアドレスに指定変更することを含む、請求項10記載の装置。
- 前記呼び出しの前記1つを指定変更することが、複数の前記呼び出しを前記関数の前記最適化バージョンの前記アドレスに指定変更することを含む、請求項12記載の装置。
- 前記関数が複数のレジスタに関連するストア命令及びリストア命令を含み、指定変更される前記複数の呼び出しの各々が、前記複数のレジスタの少なくとも1つをkillするそれぞれの命令が後に続き、前記コードの一部を前記コードの終わりに複製することが、前記関数の前記最適化バージョンから、指定変更された前記呼び出しに続きkillされる全てのレジスタに関連する、前記ストア命令及びリストア命令を削除することを含む、請求項13記載の装置。
- 前記コードを変更することが、前記関数の少なくとも1つの他の呼び出しに対して、ラッパ・コードを作成することを含み、前記ラッパ・コードが、前記関数の前記最適化バージョンの呼び出しを含み、該呼び出しが、前記レジスタに関連するストア命令により先行され、前記レジスタに関連するリストア命令が後に続き、前記コードを変更することが、前記関数の少なくとも1つの他の呼び出しが前記ラッパ・コードに指定変更することを含む、請求項14記載の装置。
- 前記関数の少なくとも1つの他の呼び出しをラッパ・コードに指定変更することが、前記関数の少なくとも1つの他の呼び出しを、前記ラッパ・コードへの分岐命令により置換することを含む、請求項15記載の装置。
- 前記ラッパ・コードを作成することが、指定変更される異なる呼び出しに対して、複数のそれぞれの前記ラッパ・コードを作成することを含み、前記複数の呼び出しを指定変更することが、異なる前記呼び出しをそれぞれの前記ラッパ・コードに指定変更することを含む、請求項15記載の装置。
- ディスアセンブルされた前記コードが、最後の命令で終わる命令の固定シーケンスを含み、前記コードを変更することが、複製された前記コードを、前記固定シーケンスを変更することなく、前記最後の命令の後に追加することを含む、請求項12記載の装置。
- コード最適化のためのプログラムであって、
コンピュータに、請求項1〜9のいずれか一項に記載の方法の各ステップを実行させる、前記プログラム。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US09/798879 | 2001-03-02 | ||
US09/798,879 US6966055B2 (en) | 2001-03-02 | 2001-03-02 | Optimizing post-link code |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2002259134A JP2002259134A (ja) | 2002-09-13 |
JP4181326B2 true JP4181326B2 (ja) | 2008-11-12 |
Family
ID=25174497
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2002055483A Expired - Lifetime JP4181326B2 (ja) | 2001-03-02 | 2002-03-01 | コード最適化のための方法、装置及びプログラム |
Country Status (4)
Country | Link |
---|---|
US (1) | US6966055B2 (ja) |
JP (1) | JP4181326B2 (ja) |
KR (1) | KR20020070809A (ja) |
CN (1) | CN1265290C (ja) |
Families Citing this family (25)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6748589B1 (en) | 1999-10-20 | 2004-06-08 | Transmeta Corporation | Method for increasing the speed of speculative execution |
AU2001239425A1 (en) * | 2000-03-31 | 2001-10-15 | British Telecommunications Public Limited Company | Resource modelling |
CN100388191C (zh) * | 2003-04-01 | 2008-05-14 | 松下电器产业株式会社 | 程序连接方法、装置以及终端装置 |
US7269830B2 (en) * | 2003-09-16 | 2007-09-11 | Sun Microsystems, Inc. | Methods and hardware for safe memory allocation in arbitrary program environments |
US7814467B2 (en) * | 2004-01-15 | 2010-10-12 | Hewlett-Packard Development Company, L.P. | Program optimization using object file summary information |
CN100359470C (zh) * | 2004-06-30 | 2008-01-02 | 中国科学院计算技术研究所 | 动静结合二进制翻译中静态信息不完备的处理方法及装置 |
US7797690B2 (en) * | 2005-03-15 | 2010-09-14 | International Business Machines Corporation | System, method and program product to optimize code during run time |
JP5119590B2 (ja) * | 2005-11-10 | 2013-01-16 | 富士通セミコンダクター株式会社 | マルチプロセッサを有するプロセッサ装置用のタスク分配プログラム及びタスク分配装置 |
US8214813B2 (en) * | 2007-01-12 | 2012-07-03 | Microsoft Corporation | Code optimization across interfaces |
US8370821B2 (en) * | 2007-08-21 | 2013-02-05 | International Business Machines Corporation | Method for enabling profile-based call site tailor-ing using profile gathering of cloned functions |
US9678775B1 (en) | 2008-04-09 | 2017-06-13 | Nvidia Corporation | Allocating memory for local variables of a multi-threaded program for execution in a single-threaded environment |
US8776030B2 (en) * | 2008-04-09 | 2014-07-08 | Nvidia Corporation | Partitioning CUDA code for execution by a general purpose processor |
GB2463942B (en) * | 2008-10-03 | 2012-08-08 | Icera Inc | Disassembling an executable to analyse function calls to minimise cache misses |
CA2684226A1 (en) * | 2009-10-30 | 2011-04-30 | Ibm Canada Limited - Ibm Canada Limitee | Eleminating redundant operations for common properties using shared real registers |
US9134977B2 (en) * | 2010-02-26 | 2015-09-15 | Red Hat, Inc. | Compiler operation for handling conditional statements |
US8694978B1 (en) * | 2011-03-25 | 2014-04-08 | Google Inc. | Function side-effect modeling by prototyping |
US9183021B2 (en) * | 2011-05-31 | 2015-11-10 | Red Hat, Inc. | Runtime optimization of application bytecode via call transformations |
US8966463B2 (en) * | 2011-11-29 | 2015-02-24 | Microsoft Technology Licensing, Llc | Eliminating redundant function calls |
CN104063208B (zh) * | 2013-03-21 | 2017-11-17 | 北京百度网讯科技有限公司 | 代码文件的优化方法、系统和服务器 |
KR102152735B1 (ko) | 2013-09-27 | 2020-09-21 | 삼성전자주식회사 | 그래픽 처리 장치 및 이의 동작 방법 |
US9274769B1 (en) | 2014-09-05 | 2016-03-01 | International Business Machines Corporation | Table of contents pointer value save and restore placeholder positioning |
US9146715B1 (en) | 2014-09-05 | 2015-09-29 | International Business Machines Corporation | Suppression of table of contents save actions |
US9244663B1 (en) | 2014-12-22 | 2016-01-26 | International Business Machines Corporation | Managing table of contents pointer value saves |
US10013255B2 (en) * | 2015-11-01 | 2018-07-03 | Centipede Semi Ltd. | Hardware-based run-time mitigation of conditional branches |
CN109726816A (zh) * | 2018-12-12 | 2019-05-07 | 中国航空工业集团公司西安航空计算技术研究所 | 一种汇编级染色器程序链接优化方法 |
Family Cites Families (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
DE69427193T2 (de) * | 1993-07-15 | 2001-09-20 | Apple Computer, Inc. | Verfahrensauswahl mit mehreren eingangspunkten |
JP3311462B2 (ja) * | 1994-02-23 | 2002-08-05 | 富士通株式会社 | コンパイル処理装置 |
JPH08147155A (ja) * | 1994-11-22 | 1996-06-07 | Sumitomo Metal Ind Ltd | オブジェクトプログラムの命令の変更/挿入方法及びシステム |
US6021272A (en) * | 1995-10-04 | 2000-02-01 | Platinum Technology, Inc. | Transforming and manipulating program object code |
US6324683B1 (en) * | 1996-02-23 | 2001-11-27 | International Business Machines Corporation | System, method and program for debugging external programs in client/server-based relational database management systems |
JP3278603B2 (ja) * | 1998-01-12 | 2002-04-30 | エヌイーシーマイクロシステム株式会社 | コンパイル装置、コンパイラの最適化方法及びコンパイラの最適化手順を記録した記録媒体 |
JPH11272473A (ja) | 1998-03-24 | 1999-10-08 | Toshiba Corp | プログラム言語処理装置のコード最適化方式 |
GB2345989A (en) * | 1999-01-23 | 2000-07-26 | Ibm | Executing defined sequences of prolog instructions. |
US6763452B1 (en) * | 1999-01-28 | 2004-07-13 | Ati International Srl | Modifying program execution based on profiling |
GB2349485B (en) * | 1999-04-23 | 2003-12-10 | Ibm | Application management |
US6408433B1 (en) * | 1999-04-23 | 2002-06-18 | Sun Microsystems, Inc. | Method and apparatus for building calling convention prolog and epilog code using a register allocator |
US6588009B1 (en) * | 1999-11-29 | 2003-07-01 | Adelante Technologies Nv | Method and apparatus for compiling source code using symbolic execution |
US6539543B1 (en) * | 1999-11-29 | 2003-03-25 | Adelante Technologies, Nv | Method and apparatus for compiling source code by flattening hierarchies |
-
2001
- 2001-03-02 US US09/798,879 patent/US6966055B2/en not_active Expired - Lifetime
-
2002
- 2002-02-23 KR KR1020020009703A patent/KR20020070809A/ko not_active Application Discontinuation
- 2002-02-27 CN CNB021053723A patent/CN1265290C/zh not_active Expired - Fee Related
- 2002-03-01 JP JP2002055483A patent/JP4181326B2/ja not_active Expired - Lifetime
Also Published As
Publication number | Publication date |
---|---|
US20040205739A1 (en) | 2004-10-14 |
CN1265290C (zh) | 2006-07-19 |
KR20020070809A (ko) | 2002-09-11 |
CN1374585A (zh) | 2002-10-16 |
US6966055B2 (en) | 2005-11-15 |
JP2002259134A (ja) | 2002-09-13 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4181326B2 (ja) | コード最適化のための方法、装置及びプログラム | |
US6427234B1 (en) | System and method for performing selective dynamic compilation using run-time information | |
US5313387A (en) | Re-execution of edit-compile-run cycles for changed lines of source code, with storage of associated data in buffers | |
US5182806A (en) | Incremental compiler for source-code development system | |
US5325531A (en) | Compiler using clean lines table with entries indicating unchanged text lines for incrementally compiling only changed source text lines | |
US5170465A (en) | Incremental-scanning compiler for source-code development system | |
US5193191A (en) | Incremental linking in source-code development system | |
US5966539A (en) | Link time optimization with translation to intermediate program and following optimization techniques including program analysis code motion live variable set generation order analysis, dead code elimination and load invariant analysis | |
US5201050A (en) | Line-skip compiler for source-code development system | |
US6072951A (en) | Profile driven optimization of frequently executed paths with inlining of code fragment (one or more lines of code from a child procedure to a parent procedure) | |
Hall | Managing interprocedural optimization | |
US20030093780A1 (en) | Annotations to executable images for improved dynamic optimization of functions | |
US7010785B2 (en) | Eliminating cold register store/restores within hot function prolog/epilogs | |
US6968541B1 (en) | Apparatus and method for template instantiation with a cross compiler | |
US7036116B2 (en) | Percolating hot function store/restores to colder calling functions | |
Rocha et al. | Effective function merging in the ssa form | |
US20190171426A1 (en) | Program compiler and linker, and method | |
US7017154B2 (en) | Eliminating store/restores within hot function prolog/epilogs using volatile registers | |
US6810519B1 (en) | Achieving tight binding for dynamically loaded software modules via intermodule copying | |
JP2018510445A (ja) | プログラム性能を向上させる領域特化システムおよび方法 | |
US5301327A (en) | Virtual memory management for source-code development system | |
AU638999B2 (en) | Incremental compiler for source-code development system | |
EP1202171A2 (en) | Compile method and program recording medium | |
US20040045018A1 (en) | Using address space bridge in postoptimizer to route indirect calls at runtime | |
WO2023155863A1 (en) | Methods and devices for compiler function fusion |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20041214 |
|
A601 | Written request for extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A601 Effective date: 20050311 |
|
A602 | Written permission of extension of time |
Free format text: JAPANESE INTERMEDIATE CODE: A602 Effective date: 20050316 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20050613 |
|
A02 | Decision of refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A02 Effective date: 20050817 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20051026 Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20051026 |
|
RD12 | Notification of acceptance of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7432 Effective date: 20051026 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20051026 |
|
A911 | Transfer to examiner for re-examination before appeal (zenchi) |
Free format text: JAPANESE INTERMEDIATE CODE: A911 Effective date: 20051202 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20051220 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20060309 Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20060309 |
|
A912 | Re-examination (zenchi) completed and case transferred to appeal board |
Free format text: JAPANESE INTERMEDIATE CODE: A912 Effective date: 20060421 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20080104 |
|
RD12 | Notification of acceptance of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7432 Effective date: 20080715 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20080717 Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20080717 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20080716 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 |
|
A521 | Request for written amendment filed |
Free format text: JAPANESE INTERMEDIATE CODE: A821 Effective date: 20080827 |
|
RD14 | Notification of resignation of power of sub attorney |
Free format text: JAPANESE INTERMEDIATE CODE: A7434 Effective date: 20080827 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20080829 |
|
R150 | Certificate of patent or registration of utility model |
Ref document number: 4181326 Country of ref document: JP Free format text: JAPANESE INTERMEDIATE CODE: R150 Free format text: JAPANESE INTERMEDIATE CODE: R150 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20110905 Year of fee payment: 3 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20120905 Year of fee payment: 4 |
|
FPAY | Renewal fee payment (event date is renewal date of database) |
Free format text: PAYMENT UNTIL: 20130905 Year of fee payment: 5 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
EXPY | Cancellation because of completion of term |