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

            Bug ID: 65922
           Summary: Switch statement with __builtin_unreachable creates a
                    wild branch
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: middle-end
          Assignee: unassigned at gcc dot gnu.org
          Reporter: bergner at gcc dot gnu.org
  Target Milestone: ---

The following test case compiled with -O2 creates a wild branch when it
generates the branch to the switch's "default" leg.  On both POWER and x86_64
(maybe others), it generates a branch with a label just past the last
instruction in the function.

POWER:

  .L.foo:
        cmplwi 7,4,6
        bgt 7,.L2
  [snip]
        blr
        .p2align 4,,15
  .L2:
        .long 0

X86_64:

  foo:
  .LFB0:
        .cfi_startproc
        cmpl    $6, %esi
        ja      .L2
  [snip]
        ret
        .p2align 4,,10
        .p2align 3
  .L2:
        .cfi_endproc
  .LFE0:
        .size   foo, .-foo

My guess is that since we've stated that the default leg is unreachable, we
should probably just delete the branch altogether, rather than allowing it to
branch into nowhere.  I'll note that I see the same behavior from GCC 4.8 thru
trunk.  The code from GCC 4.7 and earlier looks ok.

Reply via email to