From bd5391d309efc8533deb04dd0b5a7b8072592c1d Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Mon, 28 Jun 2021 11:05:46 +0200 Subject: [PATCH] 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 PR tree-optimization/101229 * gimple-walk.c (gimple_walk_op): Handle PHIs. * gcc.dg/torture/pr101229.c: New testcase. (cherry picked from commit f80c4eaca0805bc9e68ed944519519c3dd1c12e1) --- gcc/gimple-walk.c | 24 ++++++++++++++++++++++++ gcc/testsuite/gcc.dg/torture/pr101229.c | 19 +++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr101229.c diff --git a/gcc/gimple-walk.c b/gcc/gimple-walk.c index f8b0482564bc..b1d2f10f52f4 100644 --- a/gcc/gimple-walk.c +++ b/gcc/gimple-walk.c @@ -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 (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; diff --git a/gcc/testsuite/gcc.dg/torture/pr101229.c b/gcc/testsuite/gcc.dg/torture/pr101229.c new file mode 100644 index 000000000000..37080313727d --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr101229.c @@ -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; + } +} -- 2.47.2