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?

--
Best regards,
LH_Mouse

Reply via email to