前面介绍过,在指令选择时会执行一系列优化过程,本节介绍下“比特级常量传播优化”的实现。
一:什么是比特级常量传播优化
举一个GLSL语言例子:
#version 450layout(location = 0) in vec4 inColor;
layout(location = 0) out vec4 outColor;void main() {vec4 tmp = inColor & ivec4(0xFF00FF00); // 位与操作outColor = tmp;
}
上面这段代码在编译器中间过程,会生产类似下面的IR指令:
%tmp = IAND %inColor, 0xFF00FF00
outColor = MOV %tmp
对于 vec4 tmp = inColor & ivec4(0xFF00FF00) 来说,0xFF00FF00 = 11111111 00000000 11111111 00000000 (二进制), 那么对于 tmp
的每个分量,bit[0–7] 和 bit[16–23] 永远是常量 0。 既然这些位是常量0,就不需要参与后面的计算了;比特级常量传播优化就是找出这些常量部分,优化位运算