前面介紹過,在指令選擇時會執行一系列優化過程,本節介紹下“比特級常量傳播優化”的實現。
一:什么是比特級常量傳播優化
舉一個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,就不需要參與后面的計算了;比特級常量傳播優化就是找出這些常量部分,優化位運算