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?

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

Reply via email to