Hi!

The following testcase ICEs on x86_64-linux, because we try to
gsi_insert_on_edge_immediate a statement on an edge which already has
statements queued with gsi_insert_on_edge, and the deferral has been
intentional so that we don't need to deal with cfg changes in between.

The following patch uses the delayed insertion as well.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2024-07-17  Jakub Jelinek  <ja...@redhat.com>

        PR middle-end/115887
        * gimple-lower-bitint.cc (gimple_lower_bitint): Use gsi_insert_on_edge
        instead of gsi_insert_on_edge_immediate and set edge_insertions to
        true.

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

--- gcc/gimple-lower-bitint.cc.jj       2024-06-19 21:10:33.037708202 +0200
+++ gcc/gimple-lower-bitint.cc  2024-07-17 12:17:30.407211495 +0200
@@ -6903,7 +6903,8 @@ gimple_lower_bitint (void)
                    if (stmt_ends_bb_p (stmt))
                      {
                        edge e = find_fallthru_edge (gsi_bb (gsi)->succs);
-                       gsi_insert_on_edge_immediate (e, g);
+                       gsi_insert_on_edge (e, g);
+                       edge_insertions = true;
                      }
                    else
                      gsi_insert_after (&gsi, g, GSI_SAME_STMT);
--- gcc/testsuite/gcc.dg/bitint-108.c.jj        2024-07-17 12:18:04.684768583 
+0200
+++ gcc/testsuite/gcc.dg/bitint-108.c   2024-07-17 12:21:19.594252002 +0200
@@ -0,0 +1,38 @@
+/* PR middle-end/115887 */
+/* { dg-do compile { target { bitint && int128 } } } */
+/* { dg-options "-O -fnon-call-exceptions -finstrument-functions -w" } */
+
+float f;
+#if __BITINT_MAXWIDTH__ >= 1024
+#define N1024 1024
+#define N127 127
+#define N256 256
+#else
+#define N1024 64
+#define N127 64
+#define N256 64
+#endif
+
+_BitInt(N1024) a;
+
+static inline void
+bar (_BitInt(N127) b, _BitInt(N256) c, int,
+     int, int, int, int, int, int, int, int, 
+     int, int, int, int, int, int, int, int,
+     int *)
+{
+  b %= 0;
+  do
+    c -= *(short *) 0;
+  while (__builtin_add_overflow_p (a, 0, 0));
+  __int128 d = b + c + f;
+}
+
+void
+foo (void)
+{
+  int x;
+  bar (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, &x);
+  while (x)
+    ;
+}

        Jakub

Reply via email to