[Coins-compiler-users-j] LIR、Moduleの読み込みと書き出しに関する問題

Back to archive index

Ikuo Nakata nakat****@kamak*****
2010年 3月 28日 (日) 15:25:43 JST


神戸様

COINSの中田です.

> COINSに少し問題があったようで,ご迷惑をおかけしました.
> その件については神戸さんの言われるように修正をしてみた
> 結果,解決したようですので,COINSの次のバージョンには
> それを盛り込む予定です.

2つの修正のうち,後者は下記のように悪影響がある場合があります 
ので,
次のバージョンには盛り込みません.

> 修正する箇所は以下の2箇所です.
>
> (2)
> FunctionクラスのメソッドrenameLabels
> の(286行目)
>      if (module.lookupLabel(oldName) == null) {//...
>>      if (module.lookupLabel(oldName) != null) {//...
> に変更

この修正によって,確かに神戸さんのような使い方の場合は
うまく行きましたが,このメソッドはそれ以外の場合にも呼ばれ
この修正がバグの原因になる場合があります.

具体的には,たとえばcoinsのテストスーツの中にある
test/c/TestFnami2/Ge1.c
をコンパイルしたとき各関数のLIRに付けられたラベル"_epilogue"
が複数個残ってしまって,多重定義になる.

上記の修正をもとに戻せば,ラベル"_epilogue"はなくなる.

> On 2010/03/01, at 22:49, KANDO Takayuki wrote:
>
>> COINS協会の皆様
>> QTS/ISITの神戸です。
>> いつもお世話になっております。
>>
>> 我々のプロジェクトでは最適化モジュールの開発において信頼性 
>> 向上のため
>> JUnitなどのユニット・テスト・フレームワークを利用して
>> ユニットテストを行いながらテスト駆動の開発を進めることを考 
>> えています。
>> しかし少々問題があり困っています。
>>
>> <現象>
>> 現状、ある程度の最適化済みLIRをS式にダンプして 
>> おいて、それを
>>
>>   ImList imlist = (ImList)ImList.readSexp(lirSExpInput);
>>   Module mod = new Module(imlist, this.root);
>>
>> あるいは、
>>
>>   ImList imlist = (ImList)ImList.readSexp(lirSExpInput);
>>   Module mod = new Module(imlist, "mips", "spim", this.root);
>>
>> あるいは、
>>
>>   ImList imlist = (ImList)ImList.readSexp(lirSExpInput);
>>   Module mod = Module.loadSLir(imlist, "mips", "spim",  
>> this.root);
>>
>> で読み込んで
>>
>>   printStandardForm(PrintWriter) : void -  
>> coins.backend.Module
>>
>> でダンプしますと、
>>
>>   書き出したS式LIR→読み込んで→S式と 
>> して書き出した
>>
>> だけの筈なのにLIRが変形されてしまいます。
>>
>> この変形はModuleコンストラクタ内で起こり、
>> 変形によって意味が変わることはないのですが、文字列による単 
>> 純比較で検証が
>> できなくなるため同値性の確認が行いにくくなり、
>> テスト用に簡単なLIRを用意しておいて最適化モジュール 
>> 単体で動作をチェック
>> するという類のユニット・テストが大変行いにくくなっています。
>>
>> 具体的な変形箇所は3つ:
>> 1)グローバル・シンボルの重複
>>  最適化済みのLIRに既に含まれているターゲットのレジ 
>> スタを表すグローバル
>> 変数が重複する。
>>
>> 2) ラベルの無意味な名前変更
>>  特に問題ないと思われる.L*ラベル全てについて名前が 
>> 変更される。
>>
>> 3)ベーシック・ブロックの順序が入れ替わる
>>  分岐の仕方でベーシックブロックの出力順序が変わる。
>>
>> COINSの関連コードを調べましたところ以下のようなことが原因 
>> となっているよ
>> うに思われます。
>>
>> <原因と対策案>
>> ====
>> 1)グローバル・シンボルの重複
>>  最適化済みのLIRに既に含まれているターゲットのレジ 
>> スタを表すグローバル
>> 変数が重複する。
>>
>> Moduleの構築子から呼ばれる
>>   doSymtbl(ImList) : void - coins.backend.Module
>> で重複チェックがなされていないので、最適化済みのLIR 
>> に既に含まれている
>> ターゲットのレジスタを表すグローバル変数が重複する。
>> より精確にはSymTabでは
>> table(java.util.HashMap)と
>> list(coins.backend.util.BiList)という2つの 
>> データ構造でシンボルを保持し
>> ており、
>> tableでは同じシンボルがaddされると上書きされるので重 
>> 複は発生しないのに対して
>> listでは重複挿入される。
>> SymTabのsymbols()メソッドやiterator()メソッドなどは 
>> listを返す一方
>> get()メソッドはtableを検索する。
>> SymTabのprintStandardForm()メソッドはlistに基 
>> づいて動作するので
>> 重複挿入された変数が重複して出力されることになる。
>>
>> tableの動作で問題が発生していないように見えることからおそ 
>> らくは上書きに
>> より重複しないのが正しい動作であると思われるので、table 
>> に対するputの結果
>> を調べる(!=nullであれば上書きが発生している)か、HashMap 
>> のcontainsKey()
>> メソッドで重複チェックをしてlistを更新/置き換 
>> えすべきであると思われる。
>> SymTabにはsanitize()というメソッドもあるようなのでSymTab 
>> の作者もこの問題
>> に気付いていたようではあるが、残念ながらdoSymtbl()では 
>> sanitize()が実行さ
>> れてはいない。
>>
>> 取り敢えずの対策としてはModuleの構築子から呼ばれる
>>   doSymtbl(ImList) : void - coins.backend.Module
>> においてターゲットマシン設定後にsanitize()を実行する 
>> ことが考えられる。
>>
>> (そもそも現状のSymTabの仕様はsanitize()を忘れ 
>> やすい欠点があると思われる。
>> Java1.4以降を前提とするのであればHashMapではなく 
>> LinkedHashMapを使って、
>> 後方互換のためにBiListを必要な時だけ作る方が適当では 
>> ないだろうか?)
>>
>> ====
>> 2) ラベルの無意味な名前変更
>>  特に問題ないと思われる.L*ラベル全てについて名前が 
>> 変更される。
>>
>>    flowGraph() : FlowGraph - coins.backend.Function
>> から呼び出される
>>    renameLabels() : void - coins.backend.Function
>> について名前をつけなおす際にModule全体との重複を 
>> チェックしていると思われ
>> るifの条件判定が
>> 逆になっているように思われる:
>> 現状:
>>      if (module.lookupLabel(oldName) == null) {//...
>> 正?:
>>      if (module.lookupLabel(oldName) != null) {//...
>>
>> 対策としては条件式を改訂することが考えられる。
>>
>> ====
>> 3)ベーシック・ブロックの順序が入れ替わる
>>  分岐の仕方でベーシックブロックの出力順序が変わる。
>>
>> 原因不明。ただし、ラベル名の変更が行われなくなったら入れ替 
>> わらなくなった
>> ように思われる。
>> 対策としては特になし。
>>
>> ====
>> 以上です。よろしくご検討をお願いします。
>>
>> -- 
>> KANDO Takayuki (kando****@isit*****)
>> Quoliarc Technology Solutions Ltd.
>> --
>> Institute of Systems & Information Technologies/KYUSHU
>> Fukuoka SRP Center Building 7F, c/o ISIT
>> 2-1-22 Momochihama, Sawara-ku, Fukuoka, 814-0001, Japan
>> TEL:092-852-3460(extension:7228)/092-852-3461(direct)
>> FAX:092-852-3465
>>
>> _______________________________________________
>> Coins-compiler-users-j mailing list
>> Coins****@lists*****
>> http://lists.sourceforge.jp/mailman/listinfo/coins-compiler-users-j
>
> 中田 育男
> nakat****@kamak*****
>
>
>
> _______________________________________________
> Coins-compiler-users-j mailing list
> Coins****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/coins-compiler-users-j

中田 育男
nakat****@kamak*****



-------------- next part --------------
HTMLの添付ファイルを保管しました...
다운로드 



Coins-compiler-users-j メーリングリストの案内
Back to archive index