1.SSA表单
SSA表单表示每个变量只分配一次。LLVM IR是一个SSA表单,它具有无界的虚拟寄存器(每个变量只分配一次,并保存在不同的虚拟寄存器中)。因此,代码生成序列中所使用的优化步骤,包括指令选择、调度、形成和寄存器分配等阶段,不会失去任何优化机会。例如,如果使用有限的虚拟寄存器而不是无限制的代码,
%a = add nsw i32 1, i32 0 store i32 %a, i32* %c, align 4 %a = add nsw i32 2, i32 0 store i32 %a, i32* %c, align 4
上面使用有限的虚拟寄存器,因此虚拟寄存器%a使用了两次。编译器必须生成以下代码,因为它将虚拟寄存器%a指定为两个不同语句的输出。
=> %a = add i32 1, i32 0
st %a, i32* %c, 1 %a = add i32 2, i32 0 st %a, i32* %c, 2
以上代码必须按顺序运行。另一方面,如下所示的SSA表单可以重新定义,并与下面的不同版本并行运行:
%a = add nsw i32 1, i32 0 store i32 %a, i32* %c, align 4 %b = add nsw i32 2, i32 0 store i32 %b, i32* %d, align 4 // version 1 => %a = add i32 1, i32 0 st %a, i32* %c, 0 %b &