> Am 17.07.2024 um 16:01 schrieb Jakub Jelinek <ja...@redhat.com>:
> 
> 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?

Ok

Richard 

> 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