themagicalyang
themagicalyang

Reputation: 2553

Why does GCC 4.8.2 not propagate 'unused but set' optimization?

If a variable is not read from ever, it is obviously optimized out. However, the only store operation on that variable is the result of the only read operation of another variable. So, this second variable should also be optimized out. Why is this not being done?

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

Edit: The results are the same for using rand() .

Upvotes: 1

Views: 79

Answers (1)

MSalters
MSalters

Reputation: 180235

There's no store operation! There are 2 calls to gettimeofday, yes, but that is a visible effect. And visible effects are precisely the things that may not be optimized away.

Upvotes: 3

Related Questions