为什么GCC 4.8.2不会传播'未使用但设置'优化?

时间:2016-07-07 09:31:03

标签: c++ gcc llvm compiler-optimization

如果从未读取变量,则显然已将其优化。但是,对该变量的唯一存储操作是另一个变量的唯一读操作的结果。因此,第二个变量也应该被优化掉。为什么没有这样做?

int main() {
  timeval a,b,c;

  // First and only logical use of a
  gettimeofday(&a,NULL);

  // Junk function
  foo();

  // First and only logical use of b
  gettimeofday(&b,NULL);

  // This gets optimized out as c is never read from.
  c.tv_sec = a.tv_sec - b.tv_sec;

  //std::cout << c;
}

Aseembly(gcc 4.8.2 with -O3):

subq    $40, %rsp
xorl    %esi, %esi
movq    %rsp, %rdi
call    gettimeofday
call    foo()
leaq    16(%rsp), %rdi
xorl    %esi, %esi
call    gettimeofday
xorl    %eax, %eax
addq    $40, %rsp
ret
subq    $8, %rsp

编辑:使用rand()的结果相同。

1 个答案:

答案 0 :(得分:3)

没有商店运营! 2次调用gettimeofday,是的,但这是可见效果。而可见效果正是可能无法优化的事物。