Mercurial > hg > CbC > old > device
diff Changes @ 463:50a59dfb4606
inline continue...
author | kono |
---|---|
date | Sat, 04 Dec 2004 12:21:47 +0900 |
parents | f7c87020e6fe |
children | d88f08d81bba |
line wrap: on
line diff
--- a/Changes Fri Dec 03 01:05:17 2004 +0900 +++ b/Changes Sat Dec 04 12:21:47 2004 +0900 @@ -6999,3 +6999,62 @@ partial evaluator って思ったより量が多いなぁ。 +Fri Dec 3 12:47:50 JST 2004 + +inline の引数を計算して、vartable に割り振る。pexpr で定数な +ら、そのまま定数に。変数だったら alias を避けないといけない +ので、new_lvar & copy 。変数でも、const (read only)なら、そ +のまま使って良い。このあたりは、const って宣言しなくてもコン +パイラの方で検出できるけどね。このコンパイラはさぼる方針なの +で。 + +複雑な式なら変数を確保(new_lvar)して代入する(式をparseに付け +加える)必要がある。なんだけど、一回しか使われてないなら、そ +のまま使っても良い。後で使われない可能性も高いので。この「一 +回」の意味は結構複雑。attr で評価されたどうかを覚えておく方 +が良い? ただし、副作用がある場合は、使われてなくても、一回は +評価する必要がある。f(k,i++) {ret k;} みたいな場合。しかも、 +f の前に評価する必要があるのか。i がその後使われないなら実行 +する必要ないし.... 副作用のあるなしや、evalられない場合を判 +定するのは難しいから、無条件生成でしょうね。でも、すぐにasm +に食わせる場合とかあるけど。 + + vartable argument (-4) + -> ptr local (0) + local (4) + +ってな感じ? argment size は、どうやって計算するんだっけ? + +あと、return value の返し方だけど... ない場合は簡単だけど、 +ある場合は、 + if()に使われる場合 + 代入される場合 + 使われない場合 +とあるよね。ST_COMPにすることは簡単なんだけど、余計な +変数が必要になる。COMMA でいいのか。 + if() { retrun ...} else { return ... } +のような場合はどうする? COND に変換する? + while() { return hoge; } +は? + ({ while() { ret = hoge }; } ret;) +かな。全体的に、 + ({hoge.... ret=hoge.... ; ret;}) +にする? hoge が構造体の場合は.... + +goto するっていう技もありか。 + { return exp; ... } => { exp; goto exit; ... exit: } +にする。こうすれば変数は不要。nest した時にだめか。いや、goto +しないとだめなのか。pexit_label ってのがあるわけね。 + +単純な場合を単純にするには? 単一で最後の時だけ特別扱いする? + +local 変数も使うものだけ生成した方が良いんだが... それには +2 pass 必要。rechability は2passでないとだめか。あ、めんどう。 +一旦展開した後、不要なコードを取り除くっていう感じですかね。 +そうでないと switch の不要コードを取り除けない? + +pcontrol みたいなので除去できない? pcontain みたいな感じで、 +直前のSTが実行される(かもしれない)コードを含んでいるかどうか +を判断する。pcontain = pcontrol のorみたいな感じ? + +