diff options
author | Richard Biener <rguenther@suse.de> | 2015-07-16 08:28:51 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-07-16 08:28:51 +0000 |
commit | 79d4f7c66e9c8462aee46a3488f589969851bd80 (patch) | |
tree | 808b6ca01568ad4ba625da0b59f16015a8fded59 /gcc/fold-const.c | |
parent | 612b9d1364bbefb708245c6cd5b5bfa2718926e6 (diff) | |
download | gcc-79d4f7c66e9c8462aee46a3488f589969851bd80.zip gcc-79d4f7c66e9c8462aee46a3488f589969851bd80.tar.gz gcc-79d4f7c66e9c8462aee46a3488f589969851bd80.tar.bz2 |
fold-const.c (fold_widened_comparison): Remove.
2015-07-16 Richard Biener <rguenther@suse.de>
* fold-const.c (fold_widened_comparison): Remove.
(fold_sign_changed_comparison): Likewise.
(fold_comparison): Move widened and sign-changed comparison
simplification ...
* match.pd: ... to patterns here.
* generic-match-head.c: Include target.h.
* gimple-match-head.c: Likewise.
* gcc.dg/tree-ssa/pr21031.c: Adjust.
From-SVN: r225861
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 158 |
1 files changed, 0 insertions, 158 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index acccb3c..93dd29d 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -6685,148 +6685,6 @@ tree_swap_operands_p (const_tree arg0, const_tree arg1, bool reorder) return 0; } -/* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where - ARG0 is extended to a wider type. */ - -static tree -fold_widened_comparison (location_t loc, enum tree_code code, - tree type, tree arg0, tree arg1) -{ - tree arg0_unw = get_unwidened (arg0, NULL_TREE); - tree arg1_unw; - tree shorter_type, outer_type; - tree min, max; - bool above, below; - - if (arg0_unw == arg0) - return NULL_TREE; - shorter_type = TREE_TYPE (arg0_unw); - - /* Disable this optimization if we're casting a function pointer - type on targets that require function pointer canonicalization. */ - if (targetm.have_canonicalize_funcptr_for_compare () - && TREE_CODE (shorter_type) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (shorter_type)) == FUNCTION_TYPE) - return NULL_TREE; - - if (TYPE_PRECISION (TREE_TYPE (arg0)) <= TYPE_PRECISION (shorter_type)) - return NULL_TREE; - - arg1_unw = get_unwidened (arg1, NULL_TREE); - - /* If possible, express the comparison in the shorter mode. */ - if ((code == EQ_EXPR || code == NE_EXPR - || TYPE_UNSIGNED (TREE_TYPE (arg0)) == TYPE_UNSIGNED (shorter_type)) - && (TREE_TYPE (arg1_unw) == shorter_type - || ((TYPE_PRECISION (shorter_type) - >= TYPE_PRECISION (TREE_TYPE (arg1_unw))) - && (TYPE_UNSIGNED (shorter_type) - == TYPE_UNSIGNED (TREE_TYPE (arg1_unw)))) - || (TREE_CODE (arg1_unw) == INTEGER_CST - && (TREE_CODE (shorter_type) == INTEGER_TYPE - || TREE_CODE (shorter_type) == BOOLEAN_TYPE) - && int_fits_type_p (arg1_unw, shorter_type)))) - return fold_build2_loc (loc, code, type, arg0_unw, - fold_convert_loc (loc, shorter_type, arg1_unw)); - - if (TREE_CODE (arg1_unw) != INTEGER_CST - || TREE_CODE (shorter_type) != INTEGER_TYPE - || int_fits_type_p (arg1_unw, shorter_type)) - return NULL_TREE; - - /* If we are comparing with the integer that does not fit into the range - of the shorter type, the result is known. */ - outer_type = TREE_TYPE (arg1_unw); - min = lower_bound_in_type (outer_type, shorter_type); - max = upper_bound_in_type (outer_type, shorter_type); - - above = integer_nonzerop (fold_relational_const (LT_EXPR, type, - max, arg1_unw)); - below = integer_nonzerop (fold_relational_const (LT_EXPR, type, - arg1_unw, min)); - - switch (code) - { - case EQ_EXPR: - if (above || below) - return omit_one_operand_loc (loc, type, integer_zero_node, arg0); - break; - - case NE_EXPR: - if (above || below) - return omit_one_operand_loc (loc, type, integer_one_node, arg0); - break; - - case LT_EXPR: - case LE_EXPR: - if (above) - return omit_one_operand_loc (loc, type, integer_one_node, arg0); - else if (below) - return omit_one_operand_loc (loc, type, integer_zero_node, arg0); - - case GT_EXPR: - case GE_EXPR: - if (above) - return omit_one_operand_loc (loc, type, integer_zero_node, arg0); - else if (below) - return omit_one_operand_loc (loc, type, integer_one_node, arg0); - - default: - break; - } - - return NULL_TREE; -} - -/* Fold comparison ARG0 CODE ARG1 (with result in TYPE), where for - ARG0 just the signedness is changed. */ - -static tree -fold_sign_changed_comparison (location_t loc, enum tree_code code, tree type, - tree arg0, tree arg1) -{ - tree arg0_inner; - tree inner_type, outer_type; - - if (!CONVERT_EXPR_P (arg0)) - return NULL_TREE; - - outer_type = TREE_TYPE (arg0); - arg0_inner = TREE_OPERAND (arg0, 0); - inner_type = TREE_TYPE (arg0_inner); - - /* Disable this optimization if we're casting a function pointer - type on targets that require function pointer canonicalization. */ - if (targetm.have_canonicalize_funcptr_for_compare () - && TREE_CODE (inner_type) == POINTER_TYPE - && TREE_CODE (TREE_TYPE (inner_type)) == FUNCTION_TYPE) - return NULL_TREE; - - if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type)) - return NULL_TREE; - - if (TREE_CODE (arg1) != INTEGER_CST - && !(CONVERT_EXPR_P (arg1) - && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type)) - return NULL_TREE; - - if (TYPE_UNSIGNED (inner_type) != TYPE_UNSIGNED (outer_type) - && code != NE_EXPR - && code != EQ_EXPR) - return NULL_TREE; - - if (POINTER_TYPE_P (inner_type) != POINTER_TYPE_P (outer_type)) - return NULL_TREE; - - if (TREE_CODE (arg1) == INTEGER_CST) - arg1 = force_fit_type (inner_type, wi::to_widest (arg1), 0, - TREE_OVERFLOW (arg1)); - else - arg1 = fold_convert_loc (loc, inner_type, arg1); - - return fold_build2_loc (loc, code, type, arg0_inner, arg1); -} - /* Fold A < X && A + 1 > Y to A < X && A >= Y. Normally A + 1 > Y means A >= Y && A != MAX, but in this case we know that @@ -8813,22 +8671,6 @@ fold_comparison (location_t loc, enum tree_code code, tree type, if (tem) return tem; - if (TREE_CODE (TREE_TYPE (arg0)) == INTEGER_TYPE - && CONVERT_EXPR_P (arg0)) - { - /* If we are widening one operand of an integer comparison, - see if the other operand is similarly being widened. Perhaps we - can do the comparison in the narrower type. */ - tem = fold_widened_comparison (loc, code, type, arg0, arg1); - if (tem) - return tem; - - /* Or if we are changing signedness. */ - tem = fold_sign_changed_comparison (loc, code, type, arg0, arg1); - if (tem) - return tem; - } - /* If this is comparing a constant with a MIN_EXPR or a MAX_EXPR of a constant, we can simplify it. */ if (TREE_CODE (arg1) == INTEGER_CST |