Re: [PATCH] gimplify: Allow declarations in recalculate_side_effects [PR126497]
Andrea Pinski <[email protected]>
| Newsgroups | gmane.comp.gcc.patches |
|---|---|
| Message-ID | <CALvbMcAXibXTah9S+iqekPaaHDp7z3g-WtrMvGo2mnG=vjngsw@mail.gmail.com> |
On Thu, Jul 30, 2026 at 2:20 PM Jakub Jelinek <[email protected]> wrote: > > Hi! > > The following testcase ICEs, because we decide to fold a comparison > into just one of its operands, we call recalculate_side_effects on that > and ICE on the assertion that it isn't called on anything unexpected > (here PARM_DECL). > Already some time ago we had to add an exception for SSA_NAME for the > same reason. > The tcc_declaration case is slightly different, TREE_SIDE_EFFECTS is > sometimes present on those if they are TREE_THIS_VOLATILE, but it is > something the FE should take care of when creating those decls, not > a business of the gimplifier. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/16.2? Ok. > > 2026-07-30 Jakub Jelinek <[email protected]> > > PR middle-end/126497 > * gimplify.cc (recalculate_side_effects): Return for > tcc_declaration. > > * gcc.dg/bitint-141.c: New test. > > --- gcc/gimplify.cc.jj 2026-07-29 23:02:59.826913052 +0200 > +++ gcc/gimplify.cc 2026-07-30 16:36:45.710098749 +0200 > @@ -3361,6 +3361,13 @@ recalculate_side_effects (tree t) > /* No side-effects. */ > return; > > + case tcc_declaration: > + /* These can have side-effects if TREE_THIS_VOLATILE, > + but those should be set elsewhere, not in > + recalculate_side_effects. Can be triggered e.g. if > + a comparison is folded into one of its operands. */ > + return; > + > default: > if (code == SSA_NAME) > /* No side-effects. */ > --- gcc/testsuite/gcc.dg/bitint-141.c.jj 2026-07-30 16:40:32.362324944 +0200 > +++ gcc/testsuite/gcc.dg/bitint-141.c 2026-07-30 16:41:04.970925875 +0200 > @@ -0,0 +1,19 @@ > +/* PR middle-end/126497 */ > +/* { dg-do compile { target bitint } } */ > +/* { dg-options "-std=c23" } */ > + > +typedef unsigned _BitInt (1) U; > + > +U > +foo (U a) > +{ > + U t = a >= 1uwb; > + return t; > +} > + > +U > +bar (U a) > +{ > + U t = a == 1uwb; > + return t; > +} > > Jakub >