aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/tree-vrp.c22
2 files changed, 24 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 15129d9..9baf4bd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2016-11-28 Richard Biener <rguenther@suse.de>
+ * tree-vrp.c (vrp_visit_assignment_or_call): Handle
+ simplifications to SSA names via extract_range_from_ssa_name
+ if allowed.
+
+2016-11-28 Richard Biener <rguenther@suse.de>
+
PR tree-optimization/78542
* tree-ssa-ccp.c (evaluate_stmt): Only valueize simplification
if allowed.
diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index 8bea4db..f3d571d 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -7132,17 +7132,31 @@ vrp_visit_assignment_or_call (gimple *stmt, tree *output_p, value_range *vr)
&& TYPE_MAX_VALUE (TREE_TYPE (lhs)))
|| POINTER_TYPE_P (TREE_TYPE (lhs))))
{
+ *output_p = lhs;
+
/* Try folding the statement to a constant first. */
tree tem = gimple_fold_stmt_to_constant_1 (stmt, vrp_valueize,
vrp_valueize_1);
- if (tem && is_gimple_min_invariant (tem))
- set_value_range_to_value (vr, tem, NULL);
+ if (tem)
+ {
+ if (TREE_CODE (tem) == SSA_NAME
+ && (SSA_NAME_IS_DEFAULT_DEF (tem)
+ || ! prop_simulate_again_p (SSA_NAME_DEF_STMT (tem))))
+ {
+ extract_range_from_ssa_name (vr, tem);
+ return;
+ }
+ else if (is_gimple_min_invariant (tem))
+ {
+ set_value_range_to_value (vr, tem, NULL);
+ return;
+ }
+ }
/* Then dispatch to value-range extracting functions. */
- else if (code == GIMPLE_CALL)
+ if (code == GIMPLE_CALL)
extract_range_basic (vr, stmt);
else
extract_range_from_assignment (vr, as_a <gassign *> (stmt));
- *output_p = lhs;
}
}