bitint: Use gsi_insert_on_edge rather than gsi_insert_on_edge_immediate [PR115887]

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.

2024-07-17  Jakub Jelinek  <jakub@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.

(cherry picked from commit 5104fe4c7808a66ed3041a8da8e4720585cc8a1f)
This commit is contained in:
Jakub Jelinek 2024-07-17 17:32:21 +02:00 committed by Jakub Jelinek
parent d668f87598
commit 01dfc5b4ad
2 changed files with 40 additions and 1 deletions

View file

@ -6903,7 +6903,8 @@ gimple_lower_bitint (void)
if (stmt_ends_bb_p (stmt)) if (stmt_ends_bb_p (stmt))
{ {
edge e = find_fallthru_edge (gsi_bb (gsi)->succs); 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 else
gsi_insert_after (&gsi, g, GSI_SAME_STMT); gsi_insert_after (&gsi, g, GSI_SAME_STMT);

View file

@ -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)
;
}