(57)【要約】【課題】同一関数の複数箇所からの呼出しをインライン展開した場合のコードサイズを低減するコンパイルプログラムを提供する。【解決手段】コンピュータ上で動作し、関数呼出しを含む原始プログラムを目的コードに変換するプログラムであって、インライン展開の対象となる関数に対し、同一関数の呼出しが複数箇所にわたって存在する場合に、呼出しの位置からの分岐命令を用いることにより呼出し先関数の展開コードを共用する。【選択図】　図７
2004062234.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ上で動作し、関数呼出しを含む原始プログラムを目的コードに変換するプログラムであって、
インライン展開の対象となる関数に対し、同一関数の呼出しが複数箇所にわたって存在する場合に、前記呼出しの位置からの分岐命令を用いることにより呼出し先関数の展開コードを共用することを特徴とするコンパイルプログラム。
【請求項２】
コンピュータ上で動作し、関数呼出しを含む原始プログラムを目的コードに変換するプログラムであって、インライン展開の対象となる関数に対し、同一関数の呼出しが複数箇所にわたって存在する場合に、
インライン展開の対象となる関数の展開コードのステップ数と前記呼び出しの回数とに基づいて得られる非分岐型インライン展開による第１ステップ数を算出する手順と、
インライン展開の対象となる関数の展開コードのステップ数と前記関数の引数の数と前記呼び出しの回数とに基づいて分岐型インライン展開による第２ステップ数を算出する手順と、
前記第１ステップ数と前記第２ステップ数とを比較して、分岐型インライン展開を用いるか否かを決定する手順と、
分岐型インライン展開に有効性があると判定された場合に、インライン展開対象の関数の呼出し位置と前記展開コードとを関連付けるコードを挿入する手順とを含むコンパイルプログラム。
【請求項３】
さらに、分岐型インライン展開の有効性がないと判定された場合に、前記関数呼出し位置に前記展開コードを挿入する手順を含む
請求項２に記載のコンパイルプログラム。
【請求項４】
関数呼出しを含む原始プログラムを目的コードに変換する方法であって、
インライン展開の対象となる関数に対し、分岐型インライン展開のために必要となる情報を抽出する第１ステップと、
インライン展開の対象となる関数の展開コードから分岐型インライン展開の効果を判定するために必要となる情報を抽出する第２ステップと、
前記第１及び第２ステップにより抽出された情報に基づき、分岐型インライン展開の効果を判定する第３ステップと、
分岐型インライン展開の効果があると判定された場合にインライン展開対象の関数の呼出し位置と前記展開コードの間で制御を相互に受渡しするために必要となるコードを挿入するステップと
を有することを特徴とするインライン展開方法。
【請求項５】
さらに、分岐型インライン展開の効果がないと判定された場合に前記関数呼出し位置に前記展開コードを挿入するステップ
を有することを特徴とする請求項４に記載のインライン展開方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、原始プログラムを入力し目的コードに変換するコンパイルプログラムに関し、特に、上記変換過程において関数の呼出しをインライン展開する技術に関する。
【０００２】
【従来の技術】
関数呼出し機構を有する高級言語によるプログラムは、関数呼出しを行う過程において、引数の受け渡し、戻り番地の設定、関数の呼出し、動的スタックの割り当てと解放、レジスタの待避と回復、返却値の設定など、多くの処理を必要とする。このため、呼出す関数の本体が小さい場合、関数呼出しに対する上記処理によるオーバヘッドの割合が大きくなり、プログラムを実行する上での効率が低下する。この問題を解決する方法の１つとして、インライン展開による手法が存在する。インライン展開によれば、実際に関数の呼出しを行う代わりに、呼出そうとする関数の本体のコードを呼出そうとする位置に展開することにより、オーバヘッドの割合を低減することができる。
【０００３】
【発明が解決しようとする課題】
しかしながら、インライン展開を適用すると関数の呼出し毎に呼出し先のコードが展開されるため、関数呼出しの多いプログラムでは、コードサイズが増大してしまう。コードサイズの増大を避けるための方法として、コードサイズに対して制限を設ける方法がある。その他、選択的にインライン展開を適用する方法もいくつか提案されている。
【０００４】
例えば、末端関数のみをインライン展開する方法（特開平０５−０７３３３５号公報）、制御フローの解析結果に基づいた重み付けを行いインライン展開の要否を判定する方法（特開平０６−２０２８７５号公報）、呼出し先関数の条件部分のみをインライン展開する方法（特開平０８−２６３３００号公報）などが挙げられる。
【０００５】
しかしながら、インライン展開方法を用いた上記いずれのコンパイルプログラムにおいても、関数の呼出し位置に呼出し先関数のコードを展開する。従って、同一関数の呼出し箇所が少ない場合には有効であるが、同一関数の呼出し箇所が数多く存在するような場合には、コードサイズが増大するという問題がある。
【０００６】
本発明は、インライン展開を効率良く適用するコンパイルプログラムを提供することを特徴とする。
【０００７】
【課題を解決するための手段】
本発明の一観点によれば、コンピュータ上で動作し、関数呼出しを含む原始プログラムを目的コードに変換するプログラムであって、インライン展開の対象となる関数に対し、同一関数の呼出しが複数箇所にわたって存在する場合に、前記呼出しの位置からの分岐命令を用いることにより呼出し先関数の展開コードを共用することを特徴とするコンパイルプログラムが提供される。
【０００８】
また、コンピュータ上で動作し、関数呼出しを含む原始プログラムを目的コードに変換するプログラムであって、インライン展開の対象となる関数に対し、同一関数の呼出しが複数箇所にわたって存在する場合に、インライン展開の対象となる関数の展開コードのステップ数と前記呼び出しの回数とに基づいて得られる非分岐型インライン展開による第１ステップ数を算出する手順と、インライン展開の対象となる関数の展開コードのステップ数と前記関数の引数の数と前記呼び出しの回数とに基づいて分岐型インライン展開による第２ステップ数を算出する手順と、前記第１ステップ数と前記第２ステップ数とを比較して、分岐型インライン展開を用いるか否かを決定する手順と、分岐型インライン展開に有効性があると判定された場合に、インライン展開対象の関数の呼出し位置と前記展開コードとを関連付けるコードを挿入する手順とを含むコンパイルプログラムが提供される。
【０００９】
上記コンパイルプログラムを用いると、同一関数の呼出し箇所が数多く存在するような場合にも、コードサイズの増大を抑制できる。
さらに、分岐型インライン展開の有効性がないと判定された場合に、前記関数呼出し位置に前記展開コードを挿入する手順を含むのが好ましい。
【００１０】
【発明の実施の形態】
本明細書において、分岐型インライン展開方法とは、分岐を使用して展開コードを共用する方法のことを言う。すなわち、呼出し先関数のコードを呼出し位置に展開するのではなく、呼出し位置からの分岐命令を用いて呼出し先関数の展開コードを共用する方法である。
【００１１】
発明者は、原始プログラムを入力し、目的コードに変換するコンパイルプログラムを用いる場合に、コンパイル過程で関数の呼出しをインライン展開する際に、同一関数の呼出しが複数箇所にわたって存在する場合は、呼出し先関数のコードを呼出し位置に展開するのではなく、呼出し位置からの分岐命令を用いて呼出し先関数の展開コードを共用する手法を思いついた。このような手法を用いると、複数箇所からの同一関数の呼出しをインライン展開することによるコードサイズの増大を抑制することができる。
【００１２】
具体的には、例えば、まずプログラム中の関数毎に関数の定義内容を調べ、定義内容にインライン展開の対象となる関数の呼出しを含んでいる場合は、呼出し元の関数名、呼出し先の関数名、呼出し位置、引数の変数名を抽出し、テーブルを作成する。次に、インライン展開の対象となる関数を展開したコードを生成する。テーブルとこのコードを基に、関数の呼出し位置にコードを展開した場合と、分岐を使用して展開コードを共用した場合とのコードサイズの差違を見積もり、コードサイズが小さくなる方を選択する。
【００１３】
より具体的には、関数の呼出し位置にコードを展開する場合には、各呼出し位置に展開したコードを挿入する。分岐を使用して展開コードを共用する場合には、展開したコードの先頭にラベルを、展開したコードの末尾に分岐コードを付加し、適当な位置（コードを共用できる位置）に挿入する。各呼出し位置には、呼出しで使用する引数の変数から展開コードで使用する引数の変数への代入コード、戻り番地の設定コード、展開コードへの分岐コードおよびラベルを挿入する。このようにすれば、インライン展開方法を用いることができるコンパイルプログラムにおいて、効率良くプログラムを実行することができる。
【００１４】
上記の考察に基づき、以下に、本発明の実施の一形態によるコンパイルプログラムについて、図面を参照して説明する。図１は、本発明の実施の一形態によるコンパイルプログラム（コンパイラ）の構成例を示すブロック図である。図１に示すように、コンパイラ１０１は、構文解析部１０２と、中間コード最適化部１０３と、コード生成部１０４と、を含む。構文解析部１０２は、入力されたソースプログラム１０６の字句構文解析を行い、中間コード１０７を生成する。中間コード最適化部１０３は、入力された中間コード１０７に対して最適化を適用し、最適化中間コード１０８を生成する。中間コード最適化部１０３は、インライン展開処理部１０５を含み、本実施の形態によるインライン展開技術を用いたインライン展開手法が適用される。コード生成部１０４は、入力された最適化中間コード１０８に基づいて目的コード１０９を生成する。
【００１５】
図６は、本実施の形態によるコンパイルプログラムによるコンピュータ処理のうちインライン展開処理部１０５（図１）における処理の流れを示すフローチャート図である。図１と図６とを参照して説明する。インライン展開処理部１０５は、ステップ２０１において処理を開始する。ステップ２０２において、コンパイルプログラム中の全ての関数について処理が終了したかどうか判定する。処理すべき関数がない場合は、ステップ２０７に進む。処理すべき関数がある場合は、ステップ２０３に進み、処理すべき関数が関数呼出しを含む関数か否かを判定する。
【００１６】
処理中の関数が関数呼出しを含まない関数の場合には、ステップ２０２に戻り、次の関数について処理を行う。処理すべき関数が関数呼出しを含む関数の場合は、ステップ２０４に進む。ステップ２０４において、関数内の全ての関数呼出し処理が終了したか否かを判定する。ステップ２０４において、処理すべき関数呼出し処理が全て終了したと判断されるとステップ２０２に戻り、次の関数について処理を行う。ステップ２０３において処理すべき関数呼出しがあると判断された場合は、ステップ２０５に進み、ステップ２０５において、呼出す関数がインライン展開の対象となる関数か否かを判定する。
【００１７】
インライン展開の対象となる関数かどうかの判定技術に関しては、必要な関数のみについて選択的なインライン展開を行う方式が提案されている（例えば、特開昭６１−２６４４４１号公報、特開平３−２６８０３０号公報および特開平５−７３３３５号公報）。特開昭６１−２６４４４１号公報は、原始プログラムにインライン展開する関数を指定する記述を追加する方法を記載している。例えば，ある原始プログラム中の“ＦＵＮＣ”という名前の関数の呼出しをインライン展開する場合、その原始プログラムの先頭に“＊＄ＦＵＮＣ”と記述する。
【００１８】
特開平３−２６８０３０号公報は、関数の呼出しがネストしている場合に，何段までインライン展開するかを指定できる方法を記載している。ユーザが、コンパイラに対してオプションで展開レベルｋを指定する。例えば，関数ｆが関数ｇを呼び出し、さらに関数ｇが関数ｈを呼出す状況において，ｋ＝１の場合，関数ｆ中に関数ｇのコードが展開され、関数ｆ中に関数ｈの呼出しが残り、ｋ＝２の場合は、上記に加え関数ｆ中に関数ｈのコードも展開される。
【００１９】
特開平５−７３３３５号公報は、関数呼出しを含まない関数（末端関数）のみをインライン展開する方法を記載している。但し、コンパイラオプションで関数を指定すると、指定された関数のみの呼出しを含む関数もインライン展開の対象とすることができる。以上のいずれかの方法を用いることにより、インライン展開の対象となる関数をより効率的に選択できる。
尚、ステップ２０５の判定処理をスキップすることもでき、ステップ２０５の判定処理を行うか否かは任意である。
【００２０】
ステップ２０５においてインライン展開の対象となる関数でないと判断された場合は、ステップ２０４に戻り、次の関数呼出しについての処理を継続する。インライン展開の対象となる関数の場合、関数情報の抽出ステップ２０６に進みステップ２０６において関数の定義内容を調べ、例えば、呼出し元関数テーブル２１１、呼出し先関数テーブル２１２および関数呼出し情報テーブル２１３を作成する。
【００２１】
図２に示すように、呼出し元関数テーブル２１１（図６）は、呼出し元関数名と呼出し先関数テーブルへのポインタとを含んで構成され、関数呼出しを含む関数毎にエントリを作成する。図３に示すように、呼出し先関数テーブル２１２（図６）は、呼出し先関数名と関数呼出し情報テーブルへのポインタとを含んで構成され、関数呼出しを含む関数に対し、呼出す関数毎にエントリを作成する。図４に示すように、関数呼出し情報テーブル２１３（図６）は、関数呼出し位置と、返却値を格納する変数名と、引数の変数名（引数の数だけ要素が存在する）と、を含んで構成され、関数呼出しを含む関数中の同一関数の異なる箇所からの呼出しに対して、呼出し位置毎にエントリを作成する。
【００２２】
図６のステップ２０７において、呼出し元関数テーブル２１１のエントリを調べ、関数呼出しを含む全ての関数についての処理が終了したか否かを判定する。処理すべき関数がない場合は、ステップ２１０に進み処理を終了する。処理すべき関数が存在する場合は、その関数に対応した呼出し先関数テーブルのポインタを渡し、ステップ２０８において、受け取ったポインタが指示する呼出し先関数テーブル２１２のエントリを調べ、関数呼出しを含む関数中の全てのインライン展開対象の関数呼出しについての処理が終了したか否かを判定する。
【００２３】
処理すべき関数呼出しがない場合は、ステップ２０７に戻り、次の関数について処理を継続する。処理すべき関数呼出しがある場合、呼出す関数に対応した関数呼出し情報テーブル２１３のポインタを分岐型インライン展開コード生成ステップ２０９に渡す。この分岐型インライン展開コード生成ステップ２０９では、受け取ったポインタが指す関数呼出し情報テーブル２１３を参照して、分岐命令を使用したインライン展開コードを生成する。
【００２４】
図７は、分岐型インライン展開コード生成処理ステップ２０９における処理の流れをより詳細に示すフローチャート図である。分岐型インライン展開コード生成処理ステップ２０９は、ステップ３０１において処理を開始する。展開コード生成ステップ３０２において、呼出し先関数の展開コードを生成し、展開コード情報３１１を作成する。
【００２５】
図５に示すように、展開コード情報３１１（図７）は、展開コード、展開コードサイズ、引数の数、引数に対応する変数名、返却値に対応する変数名、ラベル名、分岐先番地を格納する変数名等を構成要素とする。展開コード生成ステップ３０２では、ラベル名および分岐先番地を格納する変数名は設定しない。コードサイズ計算ステップ３０３では、関数呼出し情報テーブル２１３から呼出し個所の数（エントリ数）を、展開コード情報３１１から展開コードサイズおよび引数の数を取得し、従来のインライン展開を適用した場合と分岐型インライン展開を適用した場合とのコードサイズを計算する。
【００２６】
インライン展開コードのステップ数の見積りを導出する式、すなわち、本実施の形態によるインライン展開方法が有効であるか否かを判断する基準であるコードのステップ数を見積もるために以下の式を用いることができる。従来のインライン展開を適用した場合のコードサイズは、展開コードサイズと呼出し箇所の数とを乗算したものである。すなわち、従来の方法を用いた場合のステップ数Ａは、以下の式（１）により求めることができる。
ステップ数Ａ＝インライン展開の対象となる関数の展開コードのステップ数×呼出し回数　（１）
【００２７】
分岐型インライン展開では、呼出し位置に、引数分の代入コードと、戻り番地の設定コードと、分岐コードと、ラベルと、返却値の代入コードと、が必要となる、そこで、これらのコードサイズに呼出し箇所の数を乗算した数と展開コードサイズにラベルと分岐コードを加算した数との和をとり、分岐型インライン展開を適用した場合のコードサイズを見積もる。
【００２８】
すなわち、本実施の形態によるインライン展開方法によるステップ数Ｂは、以下の（２）式により求めることができる。
ステップ数Ｂ＝インライン展開の対象となる関数の展開コードのステップ数＋（（引数の数＋３＊１）×呼出し回数）　　　　　（２）
【００２９】
ここで、＊１）の記号により示された“３”は、戻り番地の設定コード＋分岐コード＋返却値の代入コードである。（１）式と（２）式より求めたステップ数Ａ＞ステップ数Ｂとなる場合に本実施の形態による分岐を使用して展開コードを共用する方法が有効と判断される。
【００３０】
ステップ３０４では、コードサイズ計算ステップ３０３において計算されたコードサイズを比較し、分岐型インライン展開の効果があるか否かの判定を行う。ステップ３０４において、分岐型インライン展開の効果がないと判定された場合はステップ３０５に進み、効果があると判定された場合は拡張展開コード挿入ステップ３０７に進む。
【００３１】
ステップ３０５では、関数呼出し情報テーブル２１３のエントリを調べ、全ての呼出し位置について処理が終了したか否かを判定する。処理すべき呼出しがない場合は、ステップ３１０に進み、分岐型インライン展開コード生成処理ステップ２０９の処理を終了する。処理すべき呼出しがある場合は、展開コード挿入ステップ３０６において、関数呼出し情報テーブル２１３からの呼出し位置を取得し、呼出し位置に展開コードを挿入する。加えて、関数呼出しコードの削除も行う。その後、ステップ３０５に進み、次の呼出しについて処理を継続する。拡張展開コード挿入ステップ３０７において、展開コードの先頭にラベルを付加するとともに、展開コードの末尾に分岐コードを付加し、適当な位置（コードが共用できる位置）に挿入する。分岐コードには間接分岐を用いる。また、ラベル名と分岐先の番地を格納する変数の情報を、展開コード情報３１１に設定する。
【００３２】
ステップ３０８において、関数呼出し情報テーブル２１３のエントリを調べ、全ての呼出し位置について処理が終了したか否かを判定する。処理すべき呼出しがない場合は、ステップ３１０に進み処理を終了する。処理すべき呼出しがある場合は、分岐コード挿入ステップ３０９に進み、関数呼出し情報テーブル２１３から呼出し位置を取得し、呼出し位置に必要なコードを挿入する。呼出し位置に必要なコードは、引数の代入コードと、戻り番地の設定コードと、分岐コードと、ラベル及び返却値の代入コードと、である。
【００３３】
まず、図４に示す関数呼出し情報テーブル２１３から引数の変数名を、図５に示す展開コード情報３１１から引数に対応する変数名を取得し、引数の変数から引数に対応する変数への代入コードを挿入する。次にラベルを生成し、このラベルの番地を変数に設定するコードを挿入する。設定先の変数は、図５に示す展開コード情報３１１の分岐先番地を格納する変数名に設定されているものを使用する。
【００３４】
続いて、図５に示す展開コード情報３１１のラベル名を使用し展開コードへの分岐コードを生成し、引数の代入コードおよび戻り番地の設定コードの後に挿入する。分岐コードの直後には、先に生成したラベルを挿入する。最後に、図４に示す関数呼出し情報テーブル２１３から返却値を格納する変数名を、図５に示す展開コード情報３１１から返却値に対応する変数名を取得し、返却値に対応する変数から返却値を格納する変数への代入コードを生成し、ラベルの後に挿入する。必要なコードを挿入した後はステップ３０８に戻り、次の呼出しについての処理を継続する。
【００３５】
以下に、実際に本実施の形態による分岐型インライン展開方法を用いた場合と用いない場合とのコードの比較例を示す。図８（ａ）は、関数呼出しの場合のコード例を示す図であり、図８（ｂ）は、呼出し位置にコードを展開した場合のコード例を示す図であり、図８（ｃ）は、分岐型インライン展開によりコードを共用した場合のコード例を示す図である。
【００３６】
図８（ａ）では、関数ｆは関数ｇを３個所で呼出している。また、関数ｇを展開したコードは３ステップである。従って、コードサイズ計算ステップ３０３（図７）では、呼出し位置にコードを展開する場合に必要となるのは９ステップと計算される。すなわち、上記（１）式を適用すると、呼び出し位置にコードを展開した場合のステップ数Ａ＝インライン展開の対象となる関数の展開コードのステップ数×呼出し回数であるから、ステップ数Ａ＝３×３＝９ステップと算出でき、これは、図８（ｂ）に示すステップ数と一致する。
【００３７】
一方、分岐型インライン展開でコードを共用する場合、関数ｇは引数を１つ持つため引数代入コード１ステップと、この他に戻り番地設定コード、分岐コードおよび返却値の代入コードを合わせ、各呼出し位置に対して４ステップ、呼出し位置３個所では１２ステップが必要となる。また、展開コードは分岐コードを付加して４ステップとなる。従って、コードサイズ計算ステップ３０３では、分岐型インライン展開でコードを共用する場合に必要となるのは１６ステップと計算される。すなわち、上記（２）式を適用すると、本実施の形態による分岐型インライン展開のステップ数Ｂ＝インライン展開の対象となる関数の展開コードのステップ数＋（（引数の数＋３＊１）×呼出し回数）であるから、ステップ数Ｂ＝４＋（１＋３）×３＝１６と算出でき、図８（ｃ）に示すステップ数と一致する。
【００３８】
以上の見積もりにより、図８（ａ）に示す関数呼び出しの場合に本実施の形態による分岐型インライン展開方法を用いても、コード数の低減という意味でのメリットがないと判定され、通常は、図８（ｂ）に示すようなコードを生成する。
【００３９】
図９（ａ）は関数呼出しコード例であり、図９（ｂ）は、図９（ａ）のコード例に対して呼出し位置にコードを展開した場合のコード例を、図９（ｃ）は、分岐型インライン展開でコードを共用した場合のコード例を示す図である。図９（ａ）では、関数ｆは関数ｇを３個所で呼出している。また、関数ｇを展開したコードは１５ステップである。従って、コードサイズ計算処理３０３では、呼出し位置にコードを展開する場合に必要となるのは４５ステップと計算される。すなわち上記（１）式に基づき、３×１５＝４５と算出でき、図９（ｂ）に示すステップ数と一致する。
【００４０】
一方、分岐型インライン展開でコードを共用する場合、関数ｇは引数を１つ持つため引数代入コード１ステップと、この他に戻り番地設定コード、分岐コードおよび返却値の代入コードを合わせ、各呼出し位置に対して４ステップ、呼出し位置３個所では１２ステップが必要となる。また、展開コードは分岐コードを付加して１６ステップとなる。従って、コードサイズ計算ステップ３０３では、分岐型インライン展開でコードを共用する場合に必要となるのは２８ステップと計算される。式（２）に基づき計算すると、ステップ数Ｂ＝１６＋（１＋３）×３＝２８と算出でき、図８（ｃ）に示すステップ数と一致する。この場合、本実施の形態による分岐型インライン展開方法を用いるメリットがあると判定され、図９（ｃ）のようなコードを生成するのが好ましいと判断される。
【００４１】
本発明の実施の形態によるインライン展開技術を用いると、関数内で同一関数の呼出しが複数箇所存在する場合に、呼出し先関数のコードを一個所に展開し、呼出し位置から分岐することによりその展開コードを共用するため、呼出し位置毎にコードを展開する従来のインライン展開方法に比べ、コードサイズを小さくすることができる。
【００４２】
以上、本発明の実施の形態に沿って説明したが、本発明はこれらの例に限定されるものではなく、種々の変形が可能であるのは言うまでもない。
【００４３】
【発明の効果】
本発明によるインライン展開技術を用いると、関数内で同一関数の呼出しが複数箇所存在する場合にコードサイズを小さくすることができる。
【図面の簡単な説明】
【図１】本発明の実施の一形態によるコンパイラの構成を示すブロック図である。
【図２】本実施の形態による呼出し元関数テーブルの構成例を示す図である。
【図３】本実施の形態による呼出し先関数テーブルの構成例を示す図である。
【図４】本実施の形態による関数呼出し情報テーブルの構成例を示す図である。
【図５】本実施の形態による展開コード情報の構成例を示す図である。
【図６】本実施の形態によるインライン展開処理部における処理の流れを示すフローチャート図である。
【図７】本実施の形態による分岐型インライン展開コード生成処理部の処理の流れを示すフローチャート図である。
【図８】関数呼出しの場合と呼出し位置にコードを展開した場合および分岐型インライン展開でコードを共用した場合の第１のコード例を示す図である。
【図９】関数呼出しの場合と呼出し位置にコードを展開した場合および分岐型インライン展開でコードを共用した場合の第２のコード例を示す図である。
【符号の説明】
２１１…呼び出し元関数テーブル、２１２…呼び出し先関数テーブル、２１３…関数呼出し情報テーブル、３０２…展開コード生成処理、３０３…コードサイズ計算処理、３０４…分岐型インライン展開適用判定、３０５…展開コード挿入処理ループの終了判定、３０６…展開コード挿入処理、３０７…拡張展開コード挿入処理、３０８…分岐コード挿入処理ループの終了判定、３０９…分岐コード挿入処理、３１１…展開コード情報。
【図１】
2004062234.tif 000003
【図２】
2004062234.tif 000004
【図３】
2004062234.tif 000005
【図４】
2004062234.tif 000006
【図５】
2004062234.tif 000007
【図６】
2004062234.tif 000008
【図７】
2004062234.tif 000009
【図８】
2004062234.tif 000010
【図９】
2004062234.tif 000011