On Tue, 10 May 2022, Jakub Jelinek wrote:

> Hi!
> 
> The following testcase ICEs (and only without -g), because we don't replace
> one VEC_COND_EXPR with .VCOND* call.
> We don't do that because gimple_expand_vec_set_expr adds some stmts before
> *gsi and then uses gsi_remove to remove it.  gsi_remove moves the iterator
> to the next stmt and in the caller we then do gsi_next before looking at
> another stmt, which means we can skip processing of one stmt, which in this
> case happened to be a VEC_COND_EXPR but with -g is some debug stmt in
> between.  As we always emit some stmts before it, it is easy to update the
> iterator to the last stmt emitted there, so that caller continues really
> with the next stmt.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

Richard.

> 2022-05-10  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/105528
>       * gimple-isel.cc (gimple_expand_vec_set_expr): After gsi_remove
>       set *gsi to gsi_for_stmt (ass_stmt).  Fix up function comment.
> 
>       * gcc.dg/pr105528.c: New test.
> 
> --- gcc/gimple-isel.cc.jj     2022-05-09 09:09:20.386472253 +0200
> +++ gcc/gimple-isel.cc        2022-05-09 11:28:27.295925124 +0200
> @@ -43,7 +43,7 @@ along with GCC; see the file COPYING3.
>  /* Expand all ARRAY_REF(VIEW_CONVERT_EXPR) gimple assignments into calls to
>     internal function based on vector type of selected expansion.
>     i.e.:
> -     VIEW_CONVERT_EXPR<int[4]>(u)[_1] =  = i_4(D);
> +     VIEW_CONVERT_EXPR<int[4]>(u)[_1] = i_4(D);
>     =>
>       _7 = u;
>       _8 = .VEC_SET (_7, i_4(D), _1);
> @@ -104,6 +104,7 @@ gimple_expand_vec_set_expr (struct funct
>         if (gsi_remove (gsi, true)
>             && gimple_purge_dead_eh_edges (bb))
>           cfg_changed = true;
> +       *gsi = gsi_for_stmt (ass_stmt);
>       }
>      }
>  
> --- gcc/testsuite/gcc.dg/pr105528.c.jj        2022-05-09 11:30:09.476529621 
> +0200
> +++ gcc/testsuite/gcc.dg/pr105528.c   2022-05-09 11:30:35.091179163 +0200
> @@ -0,0 +1,23 @@
> +/* PR tree-optimization/105528 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -Wno-psabi -fcompare-debug" } */
> +/* { dg-additional-options "-mavx512f" { target i?86-*-* x86_64-*-* } } */
> +
> +typedef unsigned V __attribute__((__vector_size__ (64)));
> +V g;
> +
> +V
> +bar (V v)
> +{
> +  V w;
> +  v <<= (V){(V){}[53]} >= v & 5;
> +  w[w[5]] -= ~0;
> +  v %= ~0;
> +  return v + w;
> +}
> +
> +void
> +foo (void)
> +{
> +  g -= (V){bar((V){~0})[3]};
> +}
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Ivo Totev; HRB 36809 (AG Nuernberg)

Reply via email to