On 08/14/2018 09:45 PM, Liu Hao wrote:
> Dear GCC people,
> 
> At the moment, with GCC 8.2, I compile the program
> 
> ```
> int foo(const char *p)
> {
>     if(p == 0)
>         return 2;
>     const char *q = p + 1;
>     if(q == 0)
>         return 1;
>     return 0;
> }
> ```
> 
> using
> 
> ```
> gcc-8 test.c -Wall -Wextra -Wpedantic -O3 -S
> ```
> 
> and get the following assembly (with irrelevant directives stripped out):
> 
> ```
> foo:
>     testq   %rdi, %rdi
>     je  .L3
>     xorl    %eax, %eax
>     cmpq    $-1, %rdi
>     sete    %al
>     ret
> .L3:
>     movl    $2, %eax
>     ret
> ```
> 
> My question is that, when the first `if` is not taken, i.e. when `p` is
> not null, is it possible that after adding 1 to `p` would result in a
> null `q`?  Clang has been assuming that the result can't be null and
> optimize out the second `if` statement for years, but GCC is still
> emitting a check there. Are there any special reasons that prevent GCC
> from optimizing code this way?
I just don't think anyone's ever bothered to catch this case.  I believe
there is a BZ which touches on this issue.

Jeff

Reply via email to