On Mon, 5 Feb 2024, Jakub Jelinek wrote: > Hi! > > 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. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Richard. > 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. > > --- gcc/gimple-lower-bitint.cc.jj 2024-02-02 11:30:05.801776658 +0100 > +++ gcc/gimple-lower-bitint.cc 2024-02-03 12:49:52.997777574 +0100 > @@ -5832,7 +5832,14 @@ gimple_lower_bitint (void) > > if (optimize) > group_case_labels_stmt (swtch); > - switch_statements.safe_push (swtch); > + if (gimple_switch_num_labels (swtch) == 1) > + { > + single_succ_edge (bb)->flags |= EDGE_FALLTHRU; > + gimple_stmt_iterator gsi = gsi_for_stmt (swtch); > + gsi_remove (&gsi, true); > + } > + else > + switch_statements.safe_push (swtch); > } > } > > --- gcc/testsuite/gcc.dg/bitint-84.c.jj 2024-02-03 12:56:08.153622744 > +0100 > +++ gcc/testsuite/gcc.dg/bitint-84.c 2024-02-03 12:57:05.425835789 +0100 > @@ -0,0 +1,32 @@ > +/* PR tree-optimization/113737 */ > +/* { dg-do compile { target bitint } } */ > +/* { dg-options "-O2 -std=c23" } */ > + > +#if __BITINT_MAXWIDTH__ >= 129 > +_BitInt(129) a; > +#else > +_BitInt(63) a; > +#endif > + > +int b[1], c; > + > +int > +foo (void) > +{ > + switch (a) > + case 0: > + case 2: > + return 1; > + return 0; > +} > + > +void > +bar (int i) > +{ > + for (;; ++i) > + { > + c = b[i]; > + if (!foo ()) > + __asm__ (""); > + } > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Frankenstrasse 146, 90461 Nuernberg, Germany; GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)