diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d8ca149b2df..e807a610d78 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-06-06 Christian Bruel + + PR tree-optimization/43934 + * tree-ssa-loop-im.c (determine_max_movement): Add PHI def constant cost. + 2014-06-06 Richard Sandiford * ira-lives.c (single_reg_class): Add missing break. Explicitly diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8e0fb801342..98a2a053249 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-06-06 Christian Bruel + + PR tree-optimization/43934 + * gcc.dg/tree-ssa/ssa-lim-8.c: New testcase. + 2014-06-05 S. Gilles PR c/53119 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-8.c b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-8.c new file mode 100644 index 00000000000..551b68ff2de --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-lim-8.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-options "-O -fdump-tree-lim1-details" } */ + +void bar (int); +void foo (int n, int m) +{ + unsigned i; + for (i = 0; i < n; ++i) + { + int x; + if (m < 0) + x = 1; + else + x = m; + bar (x); + } +} + +/* { dg-final { scan-tree-dump-times "Moving PHI node" 1 "lim1" } } */ +/* { dg-final { cleanup-tree-dump "lim1" } } */ diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c index 5863127c493..e957f921141 100644 --- a/gcc/tree-ssa-loop-im.c +++ b/gcc/tree-ssa-loop-im.c @@ -719,8 +719,14 @@ determine_max_movement (gimple stmt, bool must_preserve_exec) FOR_EACH_PHI_ARG (use_p, stmt, iter, SSA_OP_USE) { val = USE_FROM_PTR (use_p); + if (TREE_CODE (val) != SSA_NAME) - continue; + { + /* Assign const 1 to constants. */ + min_cost = MIN (min_cost, 1); + total_cost += 1; + continue; + } if (!add_dependency (val, lim_data, loop, false)) return false; def_data = get_lim_data (SSA_NAME_DEF_STMT (val));