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の添付ファイルを保管しました... 다운로드