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:
parent
d668f87598
commit
01dfc5b4ad
2 changed files with 40 additions and 1 deletions
|
@ -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);
|
||||||
|
|
38
gcc/testsuite/gcc.dg/bitint-108.c
Normal file
38
gcc/testsuite/gcc.dg/bitint-108.c
Normal 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)
|
||||||
|
;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue