aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/tree-ssa-propagate.c15
-rw-r--r--gcc/tree-ssa-propagate.h2
2 files changed, 12 insertions, 5 deletions
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index 01ee7fd..1e05728 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -1017,11 +1017,13 @@ substitute_and_fold_dom_walker::foreach_new_stmt_in_bb
}
}
-void
+bool
substitute_and_fold_engine::propagate_into_phi_args (basic_block bb)
{
edge e;
edge_iterator ei;
+ bool propagated = false;
+
/* Visit BB successor PHI nodes and replace PHI args. */
FOR_EACH_EDGE (e, ei, bb->succs)
{
@@ -1035,11 +1037,16 @@ substitute_and_fold_engine::propagate_into_phi_args (basic_block bb)
|| virtual_operand_p (arg))
continue;
tree val = get_value (arg, phi);
- if (val && is_gimple_min_invariant (val)
+ if (val
+ && is_gimple_min_invariant (val)
&& may_propagate_copy (arg, val))
- propagate_value (use_p, val);
+ {
+ propagate_value (use_p, val);
+ propagated = true;
+ }
}
}
+ return propagated;
}
edge
@@ -1229,7 +1236,7 @@ substitute_and_fold_dom_walker::before_dom_children (basic_block bb)
}
}
- substitute_and_fold_engine->propagate_into_phi_args (bb);
+ something_changed |= substitute_and_fold_engine->propagate_into_phi_args (bb);
return NULL;
}
diff --git a/gcc/tree-ssa-propagate.h b/gcc/tree-ssa-propagate.h
index 24de43e..9406cdf 100644
--- a/gcc/tree-ssa-propagate.h
+++ b/gcc/tree-ssa-propagate.h
@@ -115,7 +115,7 @@ class substitute_and_fold_engine
virtual void pre_fold_stmt (gimple *) { }
virtual void post_new_stmt (gimple *) { }
- void propagate_into_phi_args (basic_block);
+ bool propagate_into_phi_args (basic_block);
/* Users like VRP can set this when they want to perform
folding for every propagation. */