summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2013-05-23 12:23:59 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2013-05-23 12:23:59 +0000
commit6979886b98fc36ed277a387711e0eedf4eab0cd2 (patch)
tree817c953d76e27cedecd6b9e444751bfe1da13db0 /gcc
parentb776525d87d46c43c6dec2084ee99b0d3370f191 (diff)
downloadgcc-6979886b98fc36ed277a387711e0eedf4eab0cd2.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199246 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/passes.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr57380.C21
-rw-r--r--gcc/tree-ssa-phiprop.c10
5 files changed, 35 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fdfa20c0ddc..0c46d03ee9f 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 0f1d21436be..02f2022cea5 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 db6e9fa4fda..0a22b4a92bc 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
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
* gcc.dg/torture/pr57381.c: New testcase.
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 00000000000..0a2b2ad5f55
--- /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 6555ae344b7..96d7ba6a935 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)