diff options
author | Aldy Hernandez <aldyh@redhat.com> | 2020-03-25 10:27:52 +0100 |
---|---|---|
committer | Aldy Hernandez <aldyh@redhat.com> | 2020-03-25 17:27:36 +0100 |
commit | eaee77632d1f9d949c52a0389ddeefcf6c5babcc (patch) | |
tree | 3d422b8255abf57d294b4aaa27ede4cbd96d57a7 /gcc | |
parent | ee70d79e662b1604cea462507bb0cc9dfb348926 (diff) | |
download | gcc-eaee77632d1f9d949c52a0389ddeefcf6c5babcc.zip gcc-eaee77632d1f9d949c52a0389ddeefcf6c5babcc.tar.gz gcc-eaee77632d1f9d949c52a0389ddeefcf6c5babcc.tar.bz2 |
Rewrite simplify_min_or_max_using_ranges using range_ops.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/vr-values.c | 61 |
1 files changed, 32 insertions, 29 deletions
diff --git a/gcc/vr-values.c b/gcc/vr-values.c index 4f9e37a..94f8f22 100644 --- a/gcc/vr-values.c +++ b/gcc/vr-values.c @@ -3380,42 +3380,45 @@ vr_values::simplify_min_or_max_using_ranges (gimple_stmt_iterator *gsi, gimple *stmt) { tree op0 = gimple_assign_rhs1 (stmt); + if (!irange::supports_type_p (TREE_TYPE (op0))) + return false; tree op1 = gimple_assign_rhs2 (stmt); - bool sop = false; - tree val; + value_range vr0, vr1; + if (TREE_CODE (op0) == SSA_NAME) + vr0 = *get_value_range (op0); + else if (TREE_CODE (op0) == INTEGER_CST) + vr0.set (op0); + else + vr0.set_varying (TREE_TYPE (op0)); + if (TREE_CODE (op1) == SSA_NAME) + vr1 = *get_value_range (op1); + else if (TREE_CODE (op1) == INTEGER_CST) + vr1.set (op1); + else + vr1.set_varying (TREE_TYPE (op1)); + + if (vr0.varying_p () || vr1.varying_p ()) + return false; - val = (vrp_evaluate_conditional_warnv_with_ops_using_ranges - (LE_EXPR, op0, op1, &sop)); - if (!val) + value_range tmp (vr0); + tmp.intersect (vr1); + if (!tmp.undefined_p ()) + return false; + + value_range res; + range_operator *handler = range_op_handler (gimple_assign_rhs_code (stmt), + TREE_TYPE (op0)); + handler->fold_range (res, TREE_TYPE (op0), vr0, vr1); + if (res == vr0) { - sop = false; - val = (vrp_evaluate_conditional_warnv_with_ops_using_ranges - (LT_EXPR, op0, op1, &sop)); + gimple_assign_set_rhs_from_tree (gsi, op0); + return true; } - - if (val) + if (res == vr1) { - if (sop && issue_strict_overflow_warning (WARN_STRICT_OVERFLOW_MISC)) - { - location_t location; - - if (!gimple_has_location (stmt)) - location = input_location; - else - location = gimple_location (stmt); - warning_at (location, OPT_Wstrict_overflow, - "assuming signed overflow does not occur when " - "simplifying %<min/max (X,Y)%> to %<X%> or %<Y%>"); - } - - /* VAL == TRUE -> OP0 < or <= op1 - VAL == FALSE -> OP0 > or >= op1. */ - tree res = ((gimple_assign_rhs_code (stmt) == MAX_EXPR) - == integer_zerop (val)) ? op0 : op1; - gimple_assign_set_rhs_from_tree (gsi, res); + gimple_assign_set_rhs_from_tree (gsi, op1); return true; } - return false; } |