[Bug c/80410] New: Improve merging of identical branches

pascal_cuoq at hotmail dot com gcc-bugzilla@gcc.gnu.org
Wed Apr 12 09:22:00 GMT 2017


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

            Bug ID: 80410
           Summary: Improve merging of identical branches
           Product: gcc
           Version: 7.0.1
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: pascal_cuoq at hotmail dot com
  Target Milestone: ---

Consider the following code:

  va_list ap;
  void *result;

  va_start(ap, ptr_type);

  switch (ptr_type) {
    case 0: result = va_arg(ap, int*); break;
    case 1: result = va_arg(ap, char*); break;
    case 2: result = va_arg(ap, short*); break;
    default: result = va_arg(ap, void*); break;
  }

  va_end(ap);

GCC correctly recognizes that the assembly code for the cases 0, 1, 2 is
identical, which is the difficult part (the source code for the branches is
different and cannot be merged by the programmer unless
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80409 is resolved). At the time of
writing, the Compiler Explorer trunk version produces:

        movq    %rax, -56(%rsp)
        je      .L15
        cmpl    $2, %edi
        je      .L15
        testl   %edi, %edi
        je      .L16
.L15:
        movq    -56(%rsp), %rax
.L16:

(Compiler Explorer link: https://godbolt.org/g/0NvnSX )

It would be nice if GCC was able to omit all the conditional branches, since
they all lead to doing the same thing at the assembly level.


More information about the Gcc-bugs mailing list