总的来说,以下数据流优化会将表达式替换为成本较低的表达式,检测并删除不必要的赋值,并避免对已计算过的值进行运算。启用优化的编译器在局部(在基本块内)和全局(跨整个函数)执行这些数据流优化。
- 复制传播。在对变量赋值之后,编译器用变量值替换对变量的引用。该值可以是另一个变量、常量或通用子表达式。因此导致更多的机会使常量折叠、通用子表达式消除甚至变量完全消除。这种类型的优化通过 --opt_level=1 和更高的优化设置来启用。
- 通用子表达式消除。当两个或多个表达式产生相同的值时,编译器一次计算该值,保存并重复使用该值。这种类型的优化通过 --opt_level=2 和更高的优化设置来启用。
- 冗余赋值消除。通常,复制传播和通用子表达式消除优化会导致对变量进行不必要的赋值(在另一个赋值之前或函数结束之前无后续引用的变量)。编译器会删除这些无效的赋值。此类优化可通过 --opt_level=1(对于局部赋值)和 --opt_level=2(对于全局赋值)来启用。