JPH07248923A - コンパイラ - Google Patents

コンパイラ

Info

Publication number
JPH07248923A
JPH07248923A JP4084894A JP4084894A JPH07248923A JP H07248923 A JPH07248923 A JP H07248923A JP 4084894 A JP4084894 A JP 4084894A JP 4084894 A JP4084894 A JP 4084894A JP H07248923 A JPH07248923 A JP H07248923A
Authority
JP
Japan
Prior art keywords
instruction
intermediate code
branch
compiler
unit
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
JP4084894A
Other languages
English (en)
Inventor
Shigeyoshi Kaneko
栄美 金子
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.)
Toshiba Corp
Original Assignee
Toshiba 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 Toshiba Corp filed Critical Toshiba Corp
Priority to JP4084894A priority Critical patent/JPH07248923A/ja
Publication of JPH07248923A publication Critical patent/JPH07248923A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Devices For Executing Special Programs (AREA)
  • Advance Control (AREA)

Abstract

(57)【要約】 【目的】 遅延スロットを埋める有効な命令が基本ブロ
ック内にない場合でも、遅延スロットに有効な命令を置
くことができるような命令スケジューリング方法を有す
るコンパイラを提供することである。 【構成】 パイプライン機構を有するプロセッサで実行
され、字句解析部と、構文解析部と、中間コード解析部
と、命令スケジューリング部を有する中間コード最適化
部と、コード生成部とを備えたコンパイラにおいて、前
記命令スケジューリング部において、中間コードに対
し、遅延分岐命令の遅延スロットに有効な命令を埋める
ような最適化を行う際であって、基本ブロック内に遅延
スロットを埋める有効な命令が存在しない場合に、分岐
先の命令を分岐命令の直後に複写し、分岐前のプログラ
ムに対し、前記複写した命令の次の命令から実行するた
めの処理を行うサブルーチン間命令スケジューリング部
を前記命令スケジューリング部に備えてある。

Description

【発明の詳細な説明】
【0001】
【産業上の利用分野】本発明は、高級プログラミング言
語等で記述された原始プログラムから目的プログラムを
生成するコンパイラに関し,特に、パイプライン機構を
持ったプロセッサ向けの命令スケジューリングの最適化
をするためのコンパイラに関する。
【0002】
【従来の技術】パイプライン処理とは一連のプロセッサ
の処理を複数のサブ処理に分割し、各段階のサブ処理を
各サブ処理装置に次々と入力して同時に行うものであ
る。従って、定常状態では処理を分割しただけ並列に処
理がされていることになる。
【0003】しかしながら、パイプライン機構を持つプ
ロセッサ向けのコンパイラでは、並列に命令が実行され
るため、命令が利用する演算装置やレジスタなどの資源
に衝突(インタロック)が生じてしまう。特に、パイプ
ライン特有の処理である前の命令の実行結果を待たずに
次の命令の読み込みを行う機能を有するため、例えば命
令が目的プログラムリストの順序通りに実行されない分
岐命令である場合には、分岐命令の後にnop(No OPe
ration:計算機は別に何もしないで、ただプログラムを
次に進めることだけを指示する命令をいう。)をコンパ
イラ側で付け加えなければならない。このため、前記目
的プログラムのステップ数の増加やパイプラインの停止
等により、プログラムの実行時間も増加してしまうとい
う問題点があった。
【0004】そこで、目的プログラムにおける基本ブロ
ック内の命令コードを並べ換えたり、分岐命令により、
パイプライン制御が乱れるのを回避するため、サブルー
チンコールや、ブランチ命令等の遅延分岐命令の直後の
命令(以下遅延スロットという。)に、有効な命令を置
いたりするような「命令スケジューリング」と呼ばれる
最適化手法が用いられている。
【0005】なお、「基本ブロック」とは、先頭の命令
から、最後の命令まで1つづつ順に実行される一連の命
令の並びで構成されたものをいい、前記一連の命令の並
びの途中にラベルの定義や分岐命令は含まないものをい
う。
【0006】従来のコンパイラの構成図の一例を図5に
示す。このコンパイラは、字句解析部51と、構文解析
部52と、中間コード生成部53と、中間コード最適化
部54と、コード生成部56とを備え、更に中間コード
最適化部54には、パイプライン・アーキテクチャ向き
の命令スケジューリング部55を備えている。
【0007】次に従来のコンパイラの動作を説明する。
一般にコンパイラとは、高級プログラミング言語等で記
述された原始プログラムを機械語で記述された目的プロ
グラムに翻訳するものをいう。まず、入力となる原始プ
ログラム50に対し、字句解析部51において原始プロ
グラム50に記述された字句の解析を行い、構文解析部
52において原始プログラム50内の構文の解析を行
い、中間コード生成部53において、構文解析部52で
生成された構文木をもとに中間コードを生成する。この
中間コードも目的プログラムではあるが、パイプライン
処理用の最適化処理が施されていない。従って、以下に
説明する最適化処理を行う。まず、中間コード最適化部
54において、中間コードに対してプログラムの意味を
変えないで、演算の数をできるだけ減らすような変形を
施す。中間コード最適化部54では、パイプライン・ア
ーキテクチャ向きの最適化として命令スケジューリング
部55を備え、遅延分岐命令の遅延スロットに、“no
p”以外の有効な命令を置くように、命令を並べ換える
ような最適化を行う。中間コード最適化部54で最適化
された中間コードは、コード生成部56に渡され目的プ
ログラム57が生成される。
【0008】命令スケジューリング部55の詳細な処理
の流れの一例を図6に示す。また、図6の流れ図で用い
る最適化処理のタイプを図7に示す。図6で用語として
用いている[タイプ1]から[タイプ3]の方法とは、
図7に示す[タイプ1]から[タイプ3]の方法を示す
ものとする。
【0009】従来のコンパイラの命令スケジューリング
方法として、図7に示す3種類のタイプを、以下の手順
で組合せて用いることにより、遅延分岐命令のスケジュ
ーリングを行う方法が開示されている(文献:T.R Gros
s “Code Optimization Techniques for Pipelined Arc
hitecture ”)。
【0010】以下、前記開示された遅延分岐命令のスケ
ジューリングを行う方法についての説明を行う。まず、
前記方法の手順を説明する。 (1)[タイプ1]の最適化によって、分岐命令の前の
命令を分岐命令の後に移動させることを試みる。無条件
分岐命令に対しては、この方法で遅延スロットを埋める
ことができる。 (2)(1)で遅延スロットが埋まらなかった場合に
は、[タイプ2]及び[タイプ3]の最適化により残り
を埋める。
【0011】次に、前記方法により、図8の原始プログ
ラムに対する中間コードが、命令スケジューリング部5
5によって最適化処理される様子を、図6の流れ図と図
7に従って説明する。
【0012】図8は、C言語で記述された原始プログラ
ムである。今、図8のプログラムが中間コード生成部5
3までの各処理部によって、命令スケジューリングを施
していない図9のような中間コードに変換されていると
する。図9において、“:”(コロン)が付加された文
字列、func:、sub1:、及び、sub2:はラ
ベルを表し、“call”命令は、オペランドに指定さ
れたラベルが示すサブルーチンを呼び出す命令(サブル
ーチンコール命令)を表している。なお、“call”
命令は分岐命令(無条件分岐命令)である。例えば、図
9の第4行目の命令である call sub1 は、サブルーチン“sub1”を呼び出す命令を表して
いる。
【0013】図9の中間コードは、まだ命令スケジュー
リング最適化は施されていない状態を表している。この
中間コードに対して、命令スケジューリング部55によ
って、命令スケジューリングを行う。
【0014】図6において、図9の中間コードの第1行
目から処理を進め、第3行目までは、遅延分岐命令では
ないので図6のステップ129により次の行へ移行す
る。第4行目の命令である call sub1 は、遅延分岐命令であるのでステップ120からステッ
プ121へ移行する。
【0015】ステップ121において、第4行目の“c
all”命令に対し、[タイプ1]の方法により、“c
all”命令の直前の命令である mov %iO,%oO を“call”命令の直後に移動することで、遅延スロ
ットが埋められるか試みる。このとき“mov”命令
は、分岐条件に依存しないためこの方法が成立する。よ
って、ステップ122により[タイプ1]の方法を実行
し第3行目の命令である mov %iO,%oO を第4行目の命令である call sub1 の直前に移動し、次の行へ移行する。
【0016】次に、遅延分岐命令は、第6行目の call sub2 であるため、この命令に対し[タイプ1]の方法を試み
る。第6行目の“call”命令の直前の命令は、前の
処理で移動したmov命令である。この命令は、サブル
ーチンsub1への分岐前に実行されていなければなら
ないため、ここでは命令の入れ換えはできず、ステップ
123へ移行する。
【0017】[タイプ2]の方法では、分岐先の命令を
遅延分岐命令の直後にコピーするが、この場合、遅延分
岐命令がサブルーチンコール命令であり、分岐先の命令
が基本ブロック内の命令ではないため成立せずステップ
125へ移行する。
【0018】[タイプ3]の方法では、分岐しないパス
上の命令を移動するが、この場合、該当する命令がない
ため、ここでも移動可能な命令はなくステップ129に
より次の行の処理へ移行する。以下同様の処理を図9の
中間コード全てに対して行う。
【0019】以上のように、従来のパイプライン機構を
持ったプロセッサ向けのコンパイラにより、命令スケジ
ューリングの最適化をすることにより、中間コードに対
してプログラムの意味を変えずに、最適化前の中間コー
ドに対して、演算のステップ数を減らすことができる。
【0020】
【発明が解決しようとする課題】しかしながら、従来の
パイプライン機構を持ったプロセッサ向けのコンパイラ
では以下のような問題点が生じる。
【0021】上述した処理によって、図9の中間コード
は図10のように変換される。第4行目の遅延分岐命令
である call sub1 に対しては、遅延スロットに“nop”以外の有効な命
令である mov %iO,%oO を置くことができたが、第6行目の命令である call sub2 に対しては、”nop“以外の命令を置くことができな
いまま、命令スケジューリング部55による最適化処理
を終了している。つまり、分岐命令の後の遅延スロット
に分岐命令がある場合には、”nop“以外の命令を置
くことができない。すなわち、基本ブロック内の命令に
対してのみ、命令の入れ換えを施すような従来のコンパ
イラの命令スケジューリング方法では、必ずしも遅延分
岐命令の遅延スロットに有効な命令を入れることができ
ない場合があった。
【0022】本発明では、このような問題点を解決し、
遅延スロットを埋める有効な命令が基本ブロック内にな
い場合でも、遅延スロットに有効な命令を置くことがで
きるような命令スケジューリング方法を有するコンパイ
ラを提供する。
【0023】
【課題を解決するための手段】上記問題点を解決するた
め、本発明の特徴は、パイプライン機構を有するプロセ
ッサで実行され、字句解析部と、構文解析部と、中間コ
ード解析部と、命令スケジューリング部を有する中間コ
ード最適化部と、コード生成部とを備えたコンパイラに
おいて、前記命令スケジューリング部において、中間コ
ードに対し、遅延分岐命令の遅延スロットに有効な命令
を埋めるような最適化を行う際であって、基本ブロック
内に遅延スロットを埋める有効な命令が存在しない場合
に、分岐先の命令を分岐命令の直後に複写し、前記複写
した命令の次の命令に進むための処理を行うサブルーチ
ン間命令スケジューリング部を前記命令スケジューリン
グ部に備えることである。
【0024】ここで、前記複写した命令の次の命令に進
むための処理には、分岐先のアドレスを複写した命令分
進める処理を行うことが好ましく、更に好ましくは、分
岐元の分岐命令に分岐先のアドレスを複写した命令分進
める処理を行うことが好ましい。
【0025】
【作用】本発明のコンパイラの命令スケジューリング部
では、中間コードに対し従来の命令スケジューリングを
行っても、基本ブロック内から遅延分岐命令の遅延スロ
ットに有効な命令を置くことができない場合に、サブル
ーチン間命令スケジューリング部を起動し、分岐先の命
令を分岐命令の直後にコピーし、前記複写した命令の次
の命令に進むための処理を行うことで遅延スロットに有
効な命令を置くことを可能にする。
【0026】
【実施例】本発明の一実施例を、図面に基づいて説明す
る。まず、本発明に係るコンパイラの構成図を図1に示
し、図1を用いて本発明に係るコンパイラの動作の概要
について説明する。
【0027】本発明のコンパイラは、字句解析部11
と、構文解析部12と、中間コード生成部13と、中間
コード最適化部14と、コード生成部17とを備え、更
に中間コード最適化部14が備えている命令スケジュー
リング部15にサブルーチン間命令スケジューリング部
16を追加して備えていることを特徴としている。
【0028】本コンパイラでは命令スケジューリング部
15において、中間コードに対し従来の命令スケジュー
リングを行っても、基本ブロック内から遅延分岐命令の
遅延スロットに有効な命令を置くことができない場合
に、サブルーチン間命令スケジューリング部を起動し、
サブルーチンにまたがる分岐先から、遅延スロットを埋
める有効な命令を見つけ出し、該当する命令を分岐命令
の直後にコピーし、分岐先アドレスを命令分進めるよう
な処理を行うことを特徴としている。
【0029】命令スケジューリング部15の詳細な処理
の流れを示す図を図2に、サブルーチン間命令スケジュ
ーリング部16の処理の流れを示す図を図3に示す。ま
た、図2,図3の流れ図で用いる最適化処理のタイプを
図4に示す。図2,図3で用語として用いている[タイ
プ1]から[タイプ4]の方法とは、図4に示す[タイ
プ1]から[タイプ4]の方法を示すものとする。
【0030】本発明のコンパイラの命令スケジューリン
グ部15では、図4に示す4種類のタイプを以下の手順
で組み合わせて用いることにより、遅延分岐命令のスケ
ジューリングを行う。
【0031】(1)まず[タイプ1]の最適化によっ
て、分岐命令の前の命令を分岐命令の後に移動させるこ
とを試みる。無条件分岐命令に対しては、この方法で遅
延スロットを埋めることができる。 (2)(1)で遅延スロットが埋まらなかった場合に
は、[タイプ2]及び[タイプ3]の最適化により残り
を埋める。 (3)(1),(2)の方法で遅延スロットが埋まらな
かった場合に、サブルーチン間命令スケジューリング部
17を起動し、[タイプ4]の最適化により遅延スロッ
トを埋める。
【0032】次に、図8の原始プログラムに対する中間
コードが、命令スケジューリング部15によって最適化
処理される様子を、図2,図3の流れ図と図4に従って
説明する。
【0033】図8は、従来例で用いた原始プログラムと
同じプログラムである。今、図8のプログラムが中間コ
ード生成部13までの各処理部によって、図9のような
中間コードに変換されているものとする。図9も、従来
例で用いた命令スケジューリング処理前の中間コードと
同じであり、まだ命令スケジューリング最適化は施され
ていない状態を表している。この中間コードに対して、
命令スケジューリング部15によって命令スケジューリ
ングを行う。
【0034】図2において、図9の中間コードの第1行
目から処理を進め、第3行目までは遅延分岐命令ではな
く、また、次の命令があるため、ステップ109により
次の行へ移行する。第4行目の call sub1 は遅延分岐命令であるので、ステップ100からステッ
プ101へ移行する。
【0035】ステップ101において、第4行目の“c
all”命令に対し[タイプ1]の方法により“cal
l”命令の直前の命令 mov %iO,%oO を“call”命令の直後に移動することで、遅延スロ
ットが埋められるか試みる。このとき“mov”命令は
分岐条件に依存しないため、この方法が成立する。よっ
て、ステップ102により[タイプ1]の方法を実行
し、第3行目の mov %iO,%oO を第4行目の call sub1 の直前に移動し次の行へ移行する。
【0036】次に遅延分岐命令であるのは、第6行目の call sub2 であるので、この命令に対し[タイプ1]の方法を試み
る。第6行目の“call”命令の直前の命令は、前の
処理で移動したmov命令である。この命令は、サブル
ーチンsub1への分岐前に実行されていなけらばなら
ないため、ここでは命令の入れ換えはできずステップ1
03へ移行する。
【0037】[タイプ2]の方法では、分岐先の命令を
遅延分岐命令の直後にコピーするが、この場合、遅延分
岐命令がサブルーチンコール命令であり、分岐先の命令
が基本ブロック内の命令ではないため、成立せずステッ
プ105へ移行する。
【0038】[タイプ3]の方法では分岐しないパス上
の命令を移動するが、この場合、該当する命令がないた
めステップ107へ移行し、サブルーチン間命令スケジ
ューリング部16を起動する。
【0039】図3において、ステップ110で[タイプ
4]の方法を試みる。第6行目の命令である call sub2 の分岐先はサブルーチン“sub2”であるので、第2
5行目のラベルである sub2:以降の命令の中から、第6行目の“cal
l”命令の遅延スロットを埋めることができる命令が存
在するかを調べる。ここで、サブルーチン“sub2”
の第1番目の命令 sethi %hi(data),%o3 が遅延スロットを埋めることができるので、ステップ1
11へ移行し[タイプ4]の方法に従い、以下の処理を
行う。
【0040】(1)分岐先の命令 sethi %hi(data),%o3 を分岐命令 call sub2 の直後にコピーする。 (2)分岐命令 call sub2 の分岐先を示すアドレスを1命令分進め、 call sub2+4 に変更する。ここで、1命令分の命令長は4であるとす
る。
【0041】以下、同様の処理を図9の中間コード全て
に対して行うことにより、図9の中間コードは、図11
のように変換される。
【0042】このように、従来のコンパイラの命令スケ
ジューリング方法では、図10の第6行目のように、遅
延分岐命令の遅延スロットに“nop”以外の有効な命
令を置くことができなかったような場合でも、本発明の
コンパイラの命令スケジューリング部によれば、図11
の第6行目のように遅延スロットに有効な命令を置くこ
とが可能になる。
【0043】
【発明の効果】従来のコンパイラでは、遅延分岐命令の
遅延スロットに有効な命令を置くことができなかったよ
うな場合でも、本発明によれば、コンパイラの命令スケ
ジューリング部の遅延分岐命令スケジューリング部によ
り、基本ブロック外からも、遅延スロットを埋める命令
を見つけ出すことが可能になる。従って、”nop“を
追加することによる目的プログラムのステップ数の増加
を回避することができ、プログラムの実行をより高速化
することが可能になる。
【図面の簡単な説明】
【図1】本発明の実施例のコンパイラの構成図。
【図2】本発明の実施例のコンパイラの命令スケジュー
リング部の処理の流れ図。
【図3】本発明の実施例のコンパイラのサブルーチン間
命令スケジューリング部の処理の流れ図。
【図4】本発明の実施例のコンパイラのサブルーチン間
命令スケジューリング部の処理のタイプを示す図。
【図5】従来のコンパイラの構成図。
【図6】従来のコンパイラの命令スケジューリング部の
処理の流れ図。
【図7】従来のコンパイラの命令スケジューリング部の
処理のタイプを示す図。
【図8】C言語のプログラムを示す図。
【図9】図8のプログラムが、コンパイラによって変換
されて得た中間コードを示す図。
【図10】図9の中間コードが、従来のコンパイラの命
令スケジューリング部によって最適化されて得た中間コ
ードを示す図。
【図11】図9の中間コードが、本発明の実施例のコン
パイラの命令スケジューリング部によって最適化されて
得た中間コードを示す図。

Claims (1)

    【特許請求の範囲】
  1. 【請求項1】 パイプライン機構を有するプロセッサで
    実行され、 字句解析部と、構文解析部と、中間コード解析部と、命
    令スケジューリング部を有する中間コード最適化部と、
    コード生成部とを備えたコンパイラにおいて、 前記命令スケジューリング部において、中間コードに対
    し、遅延分岐命令の遅延スロットに有効な命令を埋める
    ような最適化を行う際であって、基本ブロック内に遅延
    スロットを埋める有効な命令が存在しない場合に、 分岐先の命令を分岐命令の直後に複写し、 分岐前のプログラムに対し、前記複写した命令の次の命
    令から実行するための処理を行うサブルーチン間命令ス
    ケジューリング部を前記命令スケジューリング部に備え
    ることを特徴とするコンパイラ。
JP4084894A 1994-03-11 1994-03-11 コンパイラ Pending JPH07248923A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP4084894A JPH07248923A (ja) 1994-03-11 1994-03-11 コンパイラ

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP4084894A JPH07248923A (ja) 1994-03-11 1994-03-11 コンパイラ

Publications (1)

Publication Number Publication Date
JPH07248923A true JPH07248923A (ja) 1995-09-26

Family

ID=12592007

Family Applications (1)

Application Number Title Priority Date Filing Date
JP4084894A Pending JPH07248923A (ja) 1994-03-11 1994-03-11 コンパイラ

Country Status (1)

Country Link
JP (1) JPH07248923A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20030078467A (ko) * 2002-03-29 2003-10-08 학교법인 인하학원 목적코드 수준에서의 벡터 스케줄링 기법 및 그 시스템
JP2007287186A (ja) * 2007-08-09 2007-11-01 Denso Corp Risc型cpu,コンパイラ及びマイクロコンピュータ

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20030078467A (ko) * 2002-03-29 2003-10-08 학교법인 인하학원 목적코드 수준에서의 벡터 스케줄링 기법 및 그 시스템
JP2007287186A (ja) * 2007-08-09 2007-11-01 Denso Corp Risc型cpu,コンパイラ及びマイクロコンピュータ

Similar Documents

Publication Publication Date Title
EP1385090B1 (en) Program code conversion for variably sized registers
US5500942A (en) Method of indicating parallel execution compoundability of scalar instructions based on analysis of presumed instructions
US5502826A (en) System and method for obtaining parallel existing instructions in a particular data processing configuration by compounding instructions
US6243864B1 (en) Compiler for optimizing memory instruction sequences by marking instructions not having multiple memory address paths
US4879646A (en) Data processing system with a pipelined structure for editing trace memory contents and tracing operations during system debugging
US7877741B2 (en) Method and corresponding apparatus for compiling high-level languages into specific processor architectures
JP4718901B2 (ja) 命令実行装置、デバッグ方法、デバッグ装置及びデバッグプログラム
WO1990001738A1 (en) Machine process for translating programs in binary machine language into another binary machine language
JPH11242597A (ja) Javaバイトコードデータのフローグラフの生成方法
US6301652B1 (en) Instruction cache alignment mechanism for branch targets based on predicted execution frequencies
JP3130446B2 (ja) プログラム変換装置及びプロセッサ
JPH0738158B2 (ja) コード最適化方法およびコンパイラ・システム
US6064818A (en) Straight path optimization for compilers
US6009515A (en) Digital data processing system including efficient arrangement to support branching within trap shadows
US5850551A (en) Compiler and processor for processing loops at high speed
JPH11514119A (ja) 転送可能および転送不可能なプログラム部分を有するプログラムを移送するための方法
JPH07248923A (ja) コンパイラ
JPH1031595A (ja) シミュレーション装置及びシミュレーション方法
JPH06309193A (ja) 機械語プログラムの動作検証方法および装置
JP3335735B2 (ja) 演算処理装置
JPH02176938A (ja) 機械語命令最適化方式
JPH1083311A (ja) シミュレータ
JPH07191845A (ja) 即値データ転送装置
JP2007233805A (ja) プログラム変換システム
JPH02255918A (ja) 命令取出し制御方式