From ce521ae644954b0869428201225e85d8e86eaf2e Mon Sep 17 00:00:00 2001
From: Richard Biener <rguenther@suse.de>
Date: Thu, 23 May 2013 12:23:59 +0000
Subject: [PATCH] re PR tree-optimization/57380 (GCC 4.9.0 will not vectorize
 std::max and similar functions)

2013-05-23  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/57380
	* tree-ssa-phiprop.c (propagate_with_phi): Do not require at
	least one invariant or re-used load.
	* passes.c (init_optimization_passes): Move pass_phiprop before
	pass_forwprop.

	* g++.dg/tree-ssa/pr57380.C: New testcase.

From-SVN: r199246
---
 gcc/ChangeLog                           |  8 ++++++++
 gcc/passes.c                            |  2 +-
 gcc/testsuite/ChangeLog                 |  5 +++++
 gcc/testsuite/g++.dg/tree-ssa/pr57380.C | 21 +++++++++++++++++++++
 gcc/tree-ssa-phiprop.c                  | 10 ----------
 5 files changed, 35 insertions(+), 11 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/tree-ssa/pr57380.C

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fdfa20c0ddc2..0c46d03ee9f1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2013-05-23  Richard Biener  <rguenther@suse.de>
+
+	PR tree-optimization/57380
+	* tree-ssa-phiprop.c (propagate_with_phi): Do not require at
+	least one invariant or re-used load.
+	* passes.c (init_optimization_passes): Move pass_phiprop before
+	pass_forwprop.
+
 2013-05-23  James Greenhalgh  <james.greenhalgh@arm.com>
 
 	* config/aarch64/aarch64-simd.md
diff --git a/gcc/passes.c b/gcc/passes.c
index 0f1d21436be4..02f2022cea52 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -1402,12 +1402,12 @@ init_optimization_passes (void)
       NEXT_PASS (pass_ccp);
       /* After CCP we rewrite no longer addressed locals into SSA
 	 form if possible.  */
+      NEXT_PASS (pass_phiprop);
       NEXT_PASS (pass_forwprop);
       /* pass_build_alias is a dummy pass that ensures that we
 	 execute TODO_rebuild_alias at this point.  */
       NEXT_PASS (pass_build_alias);
       NEXT_PASS (pass_return_slot);
-      NEXT_PASS (pass_phiprop);
       NEXT_PASS (pass_fre);
       NEXT_PASS (pass_copy_prop);
       NEXT_PASS (pass_merge_phi);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index db6e9fa4fdaf..0a22b4a92bc3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-05-23  Richard Biener  <rguenther@suse.de>
+
+	PR tree-optimization/57380
+	* g++.dg/tree-ssa/pr57380.C: New testcase.
+
 2013-05-23  Richard Biener  <rguenther@suse.de>
 
 	PR middle-end/57381
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr57380.C b/gcc/testsuite/g++.dg/tree-ssa/pr57380.C
new file mode 100644
index 000000000000..0a2b2ad5f553
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr57380.C
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-phiopt1" } */
+
+struct my_array {
+    int data[4];
+};
+
+const int& my_max(const int& a, const int& b) {
+    return a < b ? b : a;
+}
+
+int f(my_array a, my_array b) {
+    int res = 0;
+    for (int i = 0; i < 4; ++i) {
+	res += my_max(a.data[i], b.data[i]);
+    }
+    return res;
+}
+
+/* { dg-final { scan-tree-dump "MAX_EXPR" "phiopt1" } } */
+/* { dg-final { cleanup-tree-dump "phiopt1" } } */
diff --git a/gcc/tree-ssa-phiprop.c b/gcc/tree-ssa-phiprop.c
index 6555ae344b70..96d7ba6a9356 100644
--- a/gcc/tree-ssa-phiprop.c
+++ b/gcc/tree-ssa-phiprop.c
@@ -247,7 +247,6 @@ propagate_with_phi (basic_block bb, gimple phi, struct phiprop_d *phivn,
   ssa_op_iter i;
   bool phi_inserted;
   tree type = NULL_TREE;
-  bool one_invariant = false;
 
   if (!POINTER_TYPE_P (TREE_TYPE (ptr))
       || !is_gimple_reg_type (TREE_TYPE (TREE_TYPE (ptr))))
@@ -282,17 +281,8 @@ propagate_with_phi (basic_block bb, gimple phi, struct phiprop_d *phivn,
       if (!type
 	  && TREE_CODE (arg) == SSA_NAME)
 	type = TREE_TYPE (phivn[SSA_NAME_VERSION (arg)].value);
-      if (TREE_CODE (arg) == ADDR_EXPR
-	  && is_gimple_min_invariant (arg))
-	one_invariant = true;
     }
 
-  /* If we neither have an address of a decl nor can reuse a previously
-     inserted load, do not hoist anything.  */
-  if (!one_invariant
-      && !type)
-    return false;
-
   /* Find a dereferencing use.  First follow (single use) ssa
      copy chains for ptr.  */
   while (single_imm_use (ptr, &use, &use_stmt)
-- 
GitLab