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

--- Comment #2 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

https://gcc.gnu.org/g:dede174fbb57bdd3e26f322b6096d53edf0089c4

commit r14-8798-gdede174fbb57bdd3e26f322b6096d53edf0089c4
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Mon Feb 5 10:57:39 2024 +0100

    lower-bitint: Remove single label _BitInt switches [PR113737]

    The following testcase ICEs, because group_case_labels_stmt optimizes
      switch (a.0_7) <default: <L6> [50.00%], case 0: <L7> [50.00%], case 2:
<L7> [50.00%]>
    where L7 block starts with __builtin_unreachable (); to
      switch (a.0_7) <default: <L6> [50.00%]>
    and single label GIMPLE_SWITCH is something the switch expansion refuses to
    lower:
      if (gimple_switch_num_labels (m_switch) == 1
          || range_check_type (index_type) == NULL_TREE)
        return false;
    (range_check_type never returns NULL for BITINT_TYPE), but the gimple
    lowering pass relies on all large/huge _BitInt switches to be lowered
    by that pass.

    The following patch just removes those after making the single successor
    edge EDGE_FALLTHRU.  I've done it even if !optimize just in case in case
    we'd end up with single case label from earlier passes.

    2024-02-05  Jakub Jelinek  <ja...@redhat.com>

            PR tree-optimization/113737
            * gimple-lower-bitint.cc (gimple_lower_bitint): If GIMPLE_SWITCH
            has just a single label, remove it and make single successor edge
            EDGE_FALLTHRU.

            * gcc.dg/bitint-84.c: New test.

Reply via email to