Mercurial > hg > Papers > 2011 > nobu-prosym
comparison presen/advice.txt~ @ 65:baace77d7d30
add some pix files
author | Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 29 Dec 2011 00:39:01 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
64:743afe406e56 | 65:baace77d7d30 |
---|---|
1 Continuation | |
2 ベーシック | |
3 | |
4 環境付き継続が普通。 | |
5 schemeとの継続は違う | |
6 light-weight | |
7 スタック | |
8 会議室 | |
9 SICP のContinuation | |
10 | |
11 Micro-C 2001 年 | |
12 『GCC上の』をつける。 | |
13 『行った~』くらいに。赤いみない。 | |
14 | |
15 難しいところがどこで、どうやって解決し方。 | |
16 | |
17 フルセットのCに | |
18 C with Continuation | |
19 それを制限するとContinuation Based Cになる。 | |
20 | |
21 より高度に最適化。。。の部分は外す。 | |
22 | |
23 どのパス | |
24 | |
25 コンパイラは幾つかパスを通る。 | |
26 そのたんびにTree | |
27 | |
28 トレースをだす。 | |
29 GCC をいじるというのはどういうことなのかをいいたい。 | |
30 execute_pass_list: 1616 | |
31 | |
32 passes.c:1558 | |
33 execute_one_pass() を読んでないと行けない。 | |
34 | |
35 pass_execute | |
36 | |
37 pass の前後でデバッグオプションがあるから | |
38 | |
39 NEXT_PASS はオプティマイゼーションパス | |
40 | |
41 passes.c: | |
42 do_per_function() | |
43 IPAモード関数単位でしかコンパイルしない場合…?。 | |
44 | |
45 NEXT_PASS | |
46 | |
47 OpenMP 様 | |
48 | |
49 eh = error handler | |
50 worn_function_return はcbCなのにreturn | |
51 | |
52 NEXT_PASS (pass_build_ssa); | |
53 | |
54 昔はGIMPLEは残っていたけど、消されてはまった。 | |
55 | |
56 INter procedure Optimization | |
57 (ipa) | |
58 | |
59 CbC だとほとんど使わないはず。 | |
60 なので、CbC で書いたほうが性能が悪くなる可能性がある。 | |
61 | |
62 SSAからgimpleにもどす。 | |
63 昔はいきなりRTLに変換していた | |
64 SSAをRTLに変換するルーチン | |
65 | |
66 | |
67 cse | |
68 common se… elimination | |
69 共通部分の最適化 | |
70 | |
71 | |
72 pass の中でコード生成されていたと思うので。 | |
73 最終的にコード生成のところまでいくのはながい。 | |
74 | |
75 | |
76 SSAからgimpleに戻しているところがあるはず… | |
77 gimple_expand cfg | |
78 | |
79 | |
80 | |
81 | |
82 pass_expand から | |
83 call_expand は gimple から rtl を生成しているはず。 | |
84 こっから下は | |
85 | |
86 | |
87 rtlをSSAに変換しているアホがいる。 | |
88 そこのスライドはこのパスにそって説明する必要がある。 | |
89 | |
90 | |
91 pass_expandから上としたは全然ちがう。 | |
92 call_expandはgimpleだけど途中SSAに変換してgimpleに戻す。 | |
93 | |
94 | |
95 実際にpass_listがあって、そのpass_listの中でexpand_callがどこにあるのかっていうのを説明してほしい。 | |
96 なぜか、プログラミングシンポジウムはハッカーの為の詳細なので、 | |
97 GCCを今いじるならどんなふうにいじるのか。 | |
98 | |
99 | |
100 自分が以下にGCCを理解しているのかを行って欲しい。 | |
101 | |
102 | |
103 | |
104 | |
105 実際は | |
106 gotoとなってるけど、単にfactorialと書いたのと同じだよね。 | |
107 factorial0() | |
108 | |
109 | |
110 goto factorial() | |
111 だとtail recursive call が矯正される。 | |
112 | |
113 | |
114 | |
115 右側のgoto はとる。 | |
116 | |
117 | |
118 実際にどんな引数渡しになるのか。 | |
119 micro-C ベースのやつがレジスタ渡しだったのでださいコンパイラに負けるということになった。 | |
120 Intel64はレジスタが増えた。レジスタ16になったから増えた。 | |
121 | |
122 | |
123 | |
124 | |
125 basic.c は引数渡しに使われるレジスタの数を調べる。 | |
126 | |
127 | |
128 表にする。 | |
129 i386 | |
130 ia64 | |
131 | |
132 | |
133 引数は浮動小数点と整数があるよね。その浮動小数点と整数の2つを。 | |
134 | |
135 | |
136 | |
137 | |
138 環境付き継続がの説明のスライド。 | |
139 本来はクロージャである必要はない。 | |
140 GCCで | |
141 setjmpで実装しても問題はあまり変わらなくて。 | |
142 それでどうなるか、static を使うと | |
143 thread local な static だったらうまくいくのでは。 | |
144 | |
145 | |
146 setjmpでない普通のやつを先に。 | |
147 setjmpのソースは | |
148 どうやって生成しているかのソースを内部的に生成しているのをみせてもいいと。 | |
149 | |
150 | |
151 問題は return val 。だから意味がない。 | |
152 setjmp | |
153 重要なのはretval。 | |
154 これでない | |
155 | |
156 | |
157 問題はreturn val がmainの中の環境にある。 | |
158 これが普通のローカル変数だと、tail recurcive でぬけると駄目になる。だからstatic にしないといけない。 | |
159 static にすればこれを | |
160 なぜまずかったのか。mainから tail recursive call で抜けてるからまずい。普通にcallすれば生きてるので、 | |
161 クロージャを使ってうまくできると… | |
162 | |
163 | |
164 mainで抜ける所で | |
165 goto は二種類。 | |
166 普通の関数からgotoする場合。 | |
167 コードセグメントからgotoする場合で実装が違う。 | |
168 | |
169 | |
170 statci tls をスレッドローカルにすればいんだけど、実際には決まったレジスタにすればいい。 | |
171 レジスタとは->リターンするレジスタ | |
172 | |
173 | |
174 書きこむ先は相手側にあるので関係ない。 | |
175 それをそっちの方にコピーするってのはどっかそのへんでやっている。 | |
176 多分return 文の中でコピーする。 | |
177 return は | |
178 正しく構造体の戻り値を指していればいいだけで、 | |
179 | |
180 | |
181 引数がついている。 | |
182 構造体の場合は引数で一個呼ばれているのでその引数をとっておかないといけなくて。 | |
183 実は引数、 evnpがついてる。 | |
184 値を返す evnp がさしてる allocate させてるところにおいてもいい。 | |
185 | |
186 | |
187 evnpni | |
188 | |
189 | |
190 Micro-C ではフレームポインタが入っている。 | |
191 実装ではフレームピオンタが入っている。 | |
192 | |
193 | |
194 さっき行ったとおり、return val はレジスタでいいので、return レジスタ | |
195 simple return; | |
196 return だけで戻る。 | |
197 前にレジスタを設定したので戻ってくると。 | |
198 | |
199 | |
200 関数の戻りからの動作はおもいので、 | |
201 goto 剃る前にはレジスタの値がきまっているはず。 | |
202 | |
203 | |
204 return val があればbuild1 で | |
205 | |
206 | |
207 if(0)なので中にはいってこない。このコードが最適化で消えないように工夫しないといけない。 | |
208 最適化をかけるとここがきえちゃう。消えないようにCOND をいれて〜とかある。 | |
209 | |
210 | |
211 cbc_exit0: が外から | |
212 TREE_used とか | |
213 c_decl_flag_label | |
214 | |
215 | |
216 最適化で消えちゃわないようになってる。 | |
217 | |
218 | |
219 最適化かけてうまく動かなかいのはこのコードが消されちゃうから。 | |
220 そのあたりをチェック。 | |
221 | |
222 | |
223 setjmp 使えば常にもどれるので。 | |
224 CbCのなかでsetjmp してlongjmp をかいてももどれる。 | |
225 | |
226 | |
227 | |
228 | |
229 CbC バージョン GCC バージョン | |
230 typedef | |
231 | |
232 | |
233 __rectype | |
234 __selftype | |
235 | |
236 | |
237 それを入れるためにはどうすればいいのかっていうのも議論すればいい。 | |
238 | |
239 | |
240 typdef をやると、先輩たちがやって | |
241 もちろん両方。 | |
242 |