hns - 日記自動生成システム - Version 2.19.9

先月 2010年03月 来月
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Namazu for hns による簡易全文検索
詳しくは 詳細指定/ヘルプを参照して下さい
検索式:

2010年03月03日(水) 旧暦 [n年日記] [更新:"2010/03/05 08:40:23"]

#1 [gcc] gcc の PHI って何かな

gcc の内部を見る時に、一つの方法は -da を付けて処理をすることがある。 -d の後に a を付けると、全ての中間譜を保存してね、だけれど、 a でなくて、色々な一文字も指定出来る *1 それで、その時に出来た、例えば、libgcc2.c.160r.shorten のような名前の中を見ると
 [orig:65 prephitmp.86 ]
このようなものがあってこれは何かなと思う。それで少なくともこの文字列の中の PHI が重要な用語だ。で何かの略かなと思うが、どうもそうでもないらしい。 info の gccint の中の 10.5 Static Single Assignment の中に解説がある。 まず、この SSA が重要である。

プログラムを書いた人にとっては一つの名前の変数を、gcc の内部では、 その代入のたびに枝番を付けて区別するというのが、この SSA。

それで、変数を参照する時には、その枝番の中で一番新しいものを参照す る必要がある。 ところが、プログラムの進行によっては、どの枝番が最新かが決められない こともある。上記 info に書いてある例だけど、元は全て a という名前の 変数だったとして、gcc 内部では次のように書替える。

  if (...)
    a_1 = 5;
  else if (...)
    a_2 = 2;
  else
    a_3 = 13;

  # a_4 = PHI <a_1, a_2, a_3>
  return a_4;
ここで a を返したいが、_1, _2, _3 のどれにして良いか決まらない時に、 この PHI <a_1, a_2, a_3> のように書いて、 「a_1 a_2 a_3 のどれか一つだけれど、そのどれかは分らない」と いう意味になる。 ついでなので、PHI 関連のマクロがあるので、挙げておく
PHI_RESULT (PHI)
PHI で作った SSA_NAME を返す
PHI_NUM_ARGS (PHI)
変数の数を返す
PHI_ARG_ELT (PHI, I)
I 番目の組を返す
PHI_ARG_EDGE (PHI, I)
PHI の I 番目の枝番を返す
PHI_ARG_DEF (PHI, I)
I 番目の SSA_NAME を返す
で、この時に出来た prehitmp という型の tree に、この最初に書いたような名 が付く。

PRE の方:

それで PREの方は Partial Redundancy Elimination の略だ。簡単に言うと、一部が同じなら省略しようね。

*1: gcc 4 からは一文字ばかりでなく、名前でも指定出来るようになっている

Comments related this article

Re: gcc の PHI って何かな by AoiMoe    2010/03/05 00:12
SSA φ でぐぐったらこんなページが: http://www.is.titech.ac.jp/~sassa/coins-www-s...
Re: gcc の PHI って何かな by h.suehiro    2010/03/05 03:57
関数を書いて引数で分岐するような例の方がわかりやすいような気がした。 PHIマクロが...
Re: gcc の PHI って何かな by makoto fujiwara    2010/03/06 00:12
つっこみをありがとうございます。正直なところ phi -> φという連想というか読み...


最近の日記
2024年03月10日
停電 (瞬電)
2024年03月03日
the second try on bare-metal
useradd
2024年02月29日
opendkim and senmail
2024年01月24日
chat/iam 0.0.8
2024年01月21日
uselocale vs setlocale (textproc/R-readxl)
以上、1 日分です。
タイトル一覧
カテゴリ分類
Powered by hns-2.19.9, HyperNikkiSystem Project

Count.cgi (since 2000/02/05)