当限制为959但不是960时,为什么优化了一个简单循环?
考虑以下简单循环: float f(float x[]) { float p = 1.0; for (int i = 0; i < 959; i++) p += 1; return p; } 如果使用gcc 7(快照)或clang(树干)进行编译,-march=core-avx2 -Ofast则会得到非常类似的结果。 .LCPI0_0: .long 1148190720 # float 960 f: # @f vmovss xmm0, dword ptr [rip + .LCPI0_0] # xmm0 = mem[0],zero,zero,zero ret 换句话说,它只是将答案设置为960而不会循环。 但是,如果将代码更改为: …