tree-optimization/101229 - fix vectorizer SLP hybrid detection with PHIs
This fixes the missing handling of PHIs in gimple_walk_op which causes the new vectorizer SLP hybrid detection scheme to fail. 2021-06-28 Richard Biener <rguenther@suse.de> PR tree-optimization/101229 * gimple-walk.c (gimple_walk_op): Handle PHIs. * gcc.dg/torture/pr101229.c: New testcase.
This commit is contained in:
parent
ad26c076aa
commit
f80c4eaca0
|
@ -517,6 +517,30 @@ walk_gimple_op (gimple *stmt, walk_tree_fn callback_op,
|
|||
case GIMPLE_PREDICT:
|
||||
break;
|
||||
|
||||
case GIMPLE_PHI:
|
||||
/* PHIs are not GSS_WITH_OPS so we need to handle them explicitely. */
|
||||
{
|
||||
gphi *phi = as_a <gphi *> (stmt);
|
||||
if (wi)
|
||||
{
|
||||
wi->val_only = true;
|
||||
wi->is_lhs = true;
|
||||
}
|
||||
ret = walk_tree (gimple_phi_result_ptr (phi), callback_op, wi, pset);
|
||||
if (wi)
|
||||
wi->is_lhs = false;
|
||||
if (ret)
|
||||
return ret;
|
||||
for (unsigned i = 0; i < gimple_phi_num_args (phi); ++i)
|
||||
{
|
||||
ret = walk_tree (gimple_phi_arg_def_ptr (phi, i),
|
||||
callback_op, wi, pset);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
enum gimple_statement_structure_enum gss;
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
/* { dg-do compile } */
|
||||
|
||||
int a[1024];
|
||||
void foo()
|
||||
{
|
||||
for (int i; i; i += 4) {
|
||||
int suma = a[i];
|
||||
int sumb = a[i + 1];
|
||||
int sumc;
|
||||
for (unsigned j = 0; j < 77; ++j) {
|
||||
suma = (suma ^ i) + 1;
|
||||
sumb = (sumb ^ i) + 2;
|
||||
sumc = suma ^ i;
|
||||
}
|
||||
a[i] = suma;
|
||||
a[i + 1] = sumb;
|
||||
a[i + 2] = sumc;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue