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