[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
GNU CC は、ある種類の RTL 式は一意的であることを仮定している。 すなわち、同じ値を表す二つの異なるオブジェクトは存在しないと 仮定しているのである。 一方、それとは逆の、 ある種類の RTL 式オブジェクトは、それを含む構造の中では 2 回以上 現れることはないという仮定をしている場合もある。
これらの仮定は一個の関数に関するものである。 グローバル変数や外部関数を記述する RTL オブジェクト、 それに小さな整数定数のような2,3の基本的なオブジェクトを除いて、 二つの関数に共通の RTL オブジェクトは存在しない。
reg
オブジェクトは一個しか
持たず、そのため、マシンモードも一個しかない。
symbol_ref
オブジェクトは
一個しかない。
const_int
式はそれぞれ一個だけである。
それ以外の幾つかの整数値も一意的に格納される。
pc
式は一個しかない。
cc0
式は一個しかない。
const_double
式は
それぞれ一個しかない。値が 1 と 2 についても同様である。
label_ref
や scratch
は、RTL 構造体の中で
二箇所以上は現れない。言い換えると、関数の中の全 insn をツリーウォーク
したときに、label_ref
や scratch
が見つかるたびに、
すでに見た他の全てとは違ったものであると仮定しても良い。
mem
オブジェクトが作られる。このため、これらのオブジェクトはそれが現れる
全ての場所で共用されることが多い。
しかし、これらの変数に対して、等価であるが別の独立したオブジェクトが
作られることがたまにある。
asm
文に複数の出力オペランドがあると、
出力オペランド毎に別々の asm_operands
式が作られる。
しかし、これらの式は全て、入力オペランドの列を含むベクトルを共有する。
この共有は後で、二つの asm_operands
式が同じ文に由来するものか
どうかを調べるのに使われる。このため、全ての最適化で、
ベクトルを全部コピーした場合には注意深く共有を維持しなくては
ならない。
unshare_all_rtl
関数によりコピーされる。その後で上記のルールが成り立つことが保証される。
copy_rtx_if_shared
を呼び出すことにより行なわれる。
この関数は unshare_all_rtl
のサブルーチンである。
This document was generated
using texi2html 1.78.