一、编译器想做什么
编译器的优化,希望将整个函数用最少的时钟周期来实现。
对于编译器看到的,没有直接关系的不同变量(无volatile),可以进行乱序的指令调度,而对于相同变量或者有别名或者传播关系的变量,需要按照编译器静态分析的依赖分析结果进行合理调度[注1]。
假设有如下场景:假设该架构下,读取指令从发出到实际读取到数据需要等待2个时钟周期,计算c = b * 3需要一个时钟周期。
{
load a;
load b;
c = b * 3;
use a and c;
}
正常执行的顺序如下:
{
load instruction for a (cycle 0);
load instruction for b (cycle 1);
wait for b's loading (cycle 2);
wait for b's loading (cycle 3);
calculate for c using b (cycle 4);
use a and c (cycle 5);
}
打乱执行顺序之后:
{
load instruction for b (cycle 0);