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 + + 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 * 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,3 +1,8 @@ +2013-05-23 Richard Biener + + PR tree-optimization/57380 + * g++.dg/tree-ssa/pr57380.C: New testcase. + 2013-05-23 Richard Biener 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 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)