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))
|
||||
{
|
||||
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);
|
||||
|
|
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