Fix ICE in vectorizable_live_operation

This fixes the case where the insertion iterator for the live stmt
is the end of a BB by adjusting the dominance query to the definition
of the def we're substituting.

2020-10-15  Richard Biener  <rguenther@suse.de>

	* tree-vect-loop.c (vectorizable_live_operation): Adjust
	dominance query.

	* gcc.dg/vect/bb-slp-52.c: New testcase.
This commit is contained in:
Richard Biener 2020-10-15 10:58:41 +02:00
parent d8394e2aa2
commit 852dce0608
2 changed files with 20 additions and 2 deletions

View File

@ -0,0 +1,15 @@
/* { dg-do compile } */
int a, e;
void g(float);
typedef struct {
float b, c;
} d;
d f;
void h(double i, double j) {
if (a && e)
return;
f.b = j;
f.c = i;
g(i);
}

View File

@ -8395,8 +8395,11 @@ vectorizable_live_operation (vec_info *vinfo,
were not code-generated yet so it is not too bad.
??? In fact we'd likely want to avoid this situation
in the first place. */
if (gimple_code (use_stmt) != GIMPLE_PHI
&& !vect_stmt_dominates_stmt_p (gsi_stmt (*gsi), use_stmt))
if (TREE_CODE (new_tree) == SSA_NAME
&& !SSA_NAME_IS_DEFAULT_DEF (new_tree)
&& gimple_code (use_stmt) != GIMPLE_PHI
&& !vect_stmt_dominates_stmt_p (SSA_NAME_DEF_STMT (new_tree),
use_stmt))
{
enum tree_code code = gimple_assign_rhs_code (use_stmt);
gcc_assert (code == CONSTRUCTOR