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みたいな感じ?
+
+