diff options
Diffstat (limited to 'gcc/tree-vrp.c')
-rw-r--r-- | gcc/tree-vrp.c | 22 |
1 files changed, 18 insertions, 4 deletions
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; } } |