エイリアス解析
From Wikipedia, the free encyclopedia
一般的には、エイリアス解析はあるメモリ参照が同じメモリ領域を示すかどうかを判定する。
これによって、コンパイラは、ある文によりプログラム中のどの変数が影響を受けるかを知ることができる。たとえば、以下のようなintへのポインタ経由でアクセスするC言語のコードを考える。
int* p;
int* q;
int i;
/* この時点でポインタ p と q は NULL でも不定値でもなく、何か有効なアドレスを指しているものとする */
*p = 1;
*q = 2;
i = *p + 3;
ここで、エイリアスに3つの場合がありうる。
- 変数
pとqはエイリアスしない。 - 変数
pとqは確実にエイリアスする。 - コンパイル時には、変数
pとqがエイリアスするかどうかは決定論的に判断できない。
p と q がエイリアスしないのであれば、i = *p + 3; は i = 4 に置き換えることができる。p と q が確実にエイリアスするのであれば、i = *p + 3; は i = 5 に置き換えることができる。いずれの場合も、エイリアスによる情報を元に最適化を施すことができる。一方、p と q がエイリアスするかどうか判断できない場合には、最適化を施すことができず、結果はコード全体を実行するまで得ることができない。2つのメモリ参照のエイリアスが不明の場合、「エイリアスする可能性がある」関係と呼ぶことができる。