diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-vrp.c | 22 |
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; } } |