Next: Reading RTL, Previous: Calls, Up: RTL
编译器假设某些类型的RTL表达式是唯一的;不会存在两个不同的对象表示相同的值。对于其它情况,有相反的假设:在被包含的结构体中,不会在多个地方出现某一类型的RTL表达式对象。
这些假设针对于一个单独的函数;除了描述全局变量和外部函数的RTL对象,一些标准对象,例如小整形常数以外,没有其它RTL对象可以在两个函数中共用。
reg
对象来表示,因此也只有一种机器模式。
symbol_ref
对象关联。
const_int
表达式被共享。
pc
表达式。
cc0
表达式。
const_double
表达式其值为0。同样对于值1,2。
const_vector
表达式其值为0。其为整数或者双精度常量向量。
label_ref
或scratch
;换句话说,对函数中所有insn进行树遍历时,可以认为每次遇到的label_ref
或者scratch
都与在其它地方遇到的不同。
mem
对象,所以这些对象在它们出现的所有地方被共享。然而,有时会为这些变量创建单独的,但是相等的对象。
asm
语句具有多个输出操作数时,会为每一个输出数创建一个不同的asm_operands
表达式。然后,这些表达式都共享包含着输入操作数序列的向量。这是为了之后用于测试两个asm_operands
表达式是否来自同一语句,所以,所有的优化当进行复制整个向量时,必须仔细保持共享。
unshare_all_rtl
进行复制,之后,将保证上面的规则会被遵循。
unshare_all_rtl
的子程序copy_rtx_if_shared
。