https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86732

            Bug ID: 86732
           Summary: Potential nullptr dereference does not propagate
                    knowledge about the pointer
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Keywords: missed-optimization
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: antoshkka at gmail dot com
  Target Milestone: ---

Following example 

static const int* get_if(const int* v) {
    if (v && *v == 0) return v;
    return nullptr;
}

int example(const int& a) {
    return *get_if(&a);
}

Generates quite a large assembly:

_Z7exampleRKi:
  mov eax, DWORD PTR [rdi]
  test eax, eax
  jne .L2
  xor eax, eax
  ret
_Z7exampleRKi.cold.0:
.L2:
  mov eax, DWORD PTR ds:0
  ud2

However clang generates a better code:
_Z7exampleRKi: # @_Z7exampleRKi
  mov eax, dword ptr [rdi]
  ret

If we unconditionally dereference the result of `get_if`, then it is UB to
return a nullptr. So all the nullptr checks could be eliminated.

Reply via email to