PR tree-optimization/109392

If we have an object with SSA_NAME_OCCURS_IN_ABNORMAL_PHI, then
maybe_push_res_to_seq may fail.  Directly build the extraction
for that case.

	PR tree-optimization/109392

gcc/
	* tree-vect-generic.cc (tree_vec_extract): Handle failure
	of maybe_push_res_to_seq better.

gcc/testsuite/

	* gcc.dg/pr109392.c: New test.
This commit is contained in:
Jakub Jelinek 2023-04-08 12:21:42 -06:00 committed by Jeff Law
parent a99f6c7f0b
commit 101380a839
2 changed files with 25 additions and 1 deletions

View file

@ -0,0 +1,15 @@
/* PR tree-optimization/109392 */
/* { dg-do compile } */
/* { dg-options "-O2 -Wno-psabi" } */
typedef short __attribute__ ((__vector_size__ (64))) V;
V v, w;
void bar (void) __attribute__((returns_twice));
V
foo (V a, V b)
{
bar ();
b &= v < b;
return (V) { foo (b, w)[3], (V) {}[3] };
}

View file

@ -174,7 +174,16 @@ tree_vec_extract (gimple_stmt_iterator *gsi, tree type,
opr.resimplify (NULL, follow_all_ssa_edges);
gimple_seq stmts = NULL;
tree res = maybe_push_res_to_seq (&opr, &stmts);
gcc_assert (res);
if (!res)
{
/* This can happen if SSA_NAME_OCCURS_IN_ABNORMAL_PHI are
used. Build BIT_FIELD_REF manually otherwise. */
t = build3 (BIT_FIELD_REF, type, t, bitsize, bitpos);
res = make_ssa_name (type);
gimple *g = gimple_build_assign (res, t);
gsi_insert_before (gsi, g, GSI_SAME_STMT);
return res;
}
gsi_insert_seq_before (gsi, stmts, GSI_SAME_STMT);
return res;
}