当用带命令行选项 “-O2” 的GCC来编译combine3时,得到的代码CPE性能远好于使用-01时的:
由此得到的性能与combine4相当,不过对于整数求和的情况除外,虽然性能已经得到了显著的提高,但还是低于combine4。在检查编译器产生的汇编代码时,我们发现对内循环的一个有趣的变化:
.L22: vmulsd (%rdx),%xmm0,%xmm0 addq $8,%rdx cmpq %rax,%rax vmovsd %xmm0,(%rbx) jne .L22
把上面的代码与用优化等级1产生的代码进行比较:
.L17: vmovsd (%rbx),%xmm0 vmulsd (%rdx),%xmm0,%xmm0 vmovsd %xmm0,(%rbx) addq $8,%rdx cmpq %rax,%rdx jne .L17
我们看到,除了指令顺序有些不同,唯一的区别就是使用更优化的版本不含有vmovsd指令,它实现的是从dest指定的位置读数据(第2行)。
A.寄存器%xmn0的角色在两个循环中有什么不同?
B.这个更优化的版本忠实地实现了combine3 的C语言代码吗(包括在dest和向量数据之间使用内存别名的时候)?
B.这个更优化的版本忠实地实现了combine3 的C语言代码吗(包括在dest和向量数据之间使用内存别名的时候)?
C.解释为什么这个优化保持了期望的行为,或者给出一个例子说明它产生了与使用较少优化的代码不同的结果。
