[PATCH] tree-optimization/101229 - fix vectorizer SLP hybrid detection with PHIs

Richard Biener rguenther@suse.de
Mon Jun 28 09:55:17 GMT 2021


This fixes the missing handling of PHIs in gimple_walk_op which causes
the new vectorizer SLP hybrid detection scheme to fail.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed to trunk.

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.
---
 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 e4a55f1eeb6..18884c449a0 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 <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;
diff --git a/gcc/testsuite/gcc.dg/torture/pr101229.c b/gcc/testsuite/gcc.dg/torture/pr101229.c
new file mode 100644
index 00000000000..37080313727
--- /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.26.2


More information about the Gcc-patches mailing list