diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2009-05-15 09:11:40 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2009-05-15 09:11:40 +0000 |
commit | 84fb43a1a4480e7a0a106fbe38144d1af50b476a (patch) | |
tree | faaa7bb6c0694f3f9cf8d8dbe54a58161ef0489f /gcc/fold-const.c | |
parent | 331d91868977fe50f5d937a9c195b6418bfda5c3 (diff) | |
download | gcc-84fb43a1a4480e7a0a106fbe38144d1af50b476a.zip gcc-84fb43a1a4480e7a0a106fbe38144d1af50b476a.tar.gz gcc-84fb43a1a4480e7a0a106fbe38144d1af50b476a.tar.bz2 |
dbxout.c (dbxout_range_type): Add LOW and HIGH parameters.
* dbxout.c (dbxout_range_type): Add LOW and HIGH parameters. Use them
for bounds.
(print_int_cst_bounds_in_octal_p): Likewise.
(dbxout_type): Adjust calls to above functions. Be prepared to deal
with subtypes.
* dwarf2out.c (base_type_die): Likewise.
(is_subrange_type): Delete.
(subrange_type_die): Add LOW and HIGH parameters. Use them for bounds.
(modified_type_die): Call subrange_type_for_debug_p on subtypes.
* fold-const.c (fold_truth_not_expr) <CONVERT_EXPR>: Do not strip it if
the destination type is boolean.
(build_range_check): Do not special-case subtypes.
(fold_sign_changed_comparison): Likewise.
(fold_unary): Likewise.
* langhooks-def.h (LANG_HOOKS_GET_SUBRANGE_BOUNDS): Define.
(LANG_HOOKS_FOR_TYPES_INITIALIZER): Add LANG_HOOKS_GET_SUBRANGE_BOUNDS.
* langhooks.h (lang_hooks_for_types): Add get_subrange_bounds.
* tree.c (subrange_type_for_debug_p): New predicate based on the former
is_subrange_type.
* tree.h (subrange_type_for_debug_p): Declare.
* tree-chrec.c (avoid_arithmetics_in_type_p): Delete.
(convert_affine_scev): Remove call to above function.
(chrec_convert_aggressive): Likewise.
* tree-ssa.c (useless_type_conversion_p_1): Do not specifically return
false for conversions involving subtypes.
* tree-vrp.c (vrp_val_max): Do not special-case subtypes.
(vrp_val_min): Likewise.
(needs_overflow_infinity): Likewise.
(extract_range_from_unary_expr): Likewise.
ada/
* gcc-interface/ada-tree.h (TYPE_GCC_MIN_VALUE, TYPE_GCC_MAX_VALUE):
New macros.
(TYPE_RM_VALUES): Likewise.
(TYPE_RM_SIZE): Rewrite in terms of TYPE_RM_VALUES.
(SET_TYPE_RM_SIZE): New macro.
(TYPE_RM_MIN_VALUE, TYPE_RM_MAX_VALUE): Likewise.
(SET_TYPE_RM_SIZE, SET_TYPE_RM_MAX_VALUE): Likewise.
(TYPE_MIN_VALUE, TYPE_MAX_VALUE): Redefine.
* gcc-interface/gigi.h (create_range_type): Declare.
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Modular_Integer_Type>
Use SET_TYPE_RM_MAX_VALUE to set the upper bound on the UMT type.
<E_Signed_Integer_Subtype>: Build a regular integer type first and
then set the RM bounds. Use SET_TYPE_RM_SIZE to set the RM size.
<E_Floating_Point_Subtype>: Build a regular floating-point type first
and then set the RM bounds.
<E_Array_Type>: Use create_range_type instead of build_range_type.
<E_Array_Subtype>: Build a regular integer type first and then set
the RM bounds for the extra subtype.
<E_String_Literal_Subtype>: Use create_range_type instead of
build_range_type.
<all>: Set the RM bounds for enumeration types and the GCC bounds for
floating-point types.
(set_rm_size): Use SET_TYPE_RM_SIZE to set the RM size.
(make_type_from_size) <INTEGER_TYPE>: Use SET_TYPE_RM_{MIN,MAX}_VALUE
to set the bounds. Use SET_TYPE_RM_SIZE to set the RM size.
(substitute_in_type) <INTEGER_TYPE>: Deal with GCC bounds for domain
types and with RM bounds for subtypes.
* gcc-interface/misc.c (LANG_HOOKS_GET_SUBRANGE_BOUNDS): Define.
(gnat_print_type) <REAL_TYPE>: New case.
<ENUMERAL_TYPE>: Fall through to above case.
(gnat_get_subrange_bounds): New function.
* gcc-interface/trans.c (add_decl_expr): Mark the trees rooted as
TYPE_RM_MIN_VALUE and TYPE_RM_MAX_VALUE, if any.
* gcc-interface/utils.c (gnat_init_decl_processing): Use precision 8
for booleans. Adjust and use SET_TYPE_RM_SIZE to set the RM size.
(create_range_type): New function.
(create_param_decl): Build a regular integer type first and then set
the RM bounds for the extra subtype.
(unchecked_convert): Remove kludge for 'Valid.
* gcc-interface/utils2.c (build_binary_op) <ARRAY_RANGE_REF>: Convert
the index to sizetype instead of TYPE_DOMAIN.
From-SVN: r147563
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 54 |
1 files changed, 10 insertions, 44 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index fb59049..32de681 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -3741,7 +3741,7 @@ fold_truth_not_expr (tree arg) case NON_LVALUE_EXPR: return invert_truthvalue (TREE_OPERAND (arg, 0)); - case NOP_EXPR: + CASE_CONVERT: if (TREE_CODE (TREE_TYPE (arg)) == BOOLEAN_TYPE) { t = build1 (TRUTH_NOT_EXPR, type, arg); @@ -3750,7 +3750,6 @@ fold_truth_not_expr (tree arg) /* ... fall through ... */ - case CONVERT_EXPR: case FLOAT_EXPR: t = build1 (TREE_CODE (arg), type, invert_truthvalue (TREE_OPERAND (arg, 0))); @@ -4694,7 +4693,6 @@ static tree build_range_check (tree type, tree exp, int in_p, tree low, tree high) { tree etype = TREE_TYPE (exp), value; - enum tree_code code; #ifdef HAVE_canonicalize_funcptr_for_compare /* Disable this optimization for function pointer expressions @@ -4777,35 +4775,14 @@ build_range_check (tree type, tree exp, int in_p, tree low, tree high) } /* Optimize (c>=low) && (c<=high) into (c-low>=0) && (c-low<=high-low). - This requires wrap-around arithmetics for the type of the expression. */ - code = TREE_CODE (etype); - switch (code) - { - case INTEGER_TYPE: - case ENUMERAL_TYPE: - case BOOLEAN_TYPE: - /* There is no requirement that LOW be within the range of ETYPE - if the latter is a subtype. It must, however, be within the base - type of ETYPE. So be sure we do the subtraction in that type. */ - if (code == INTEGER_TYPE && TREE_TYPE (etype)) - { - etype = TREE_TYPE (etype); - /* But not in an enumeral or boolean type though. */ - code = TREE_CODE (etype); - } + This requires wrap-around arithmetics for the type of the expression. + First make sure that arithmetics in this type is valid, then make sure + that it wraps around. */ + if (TREE_CODE (etype) == ENUMERAL_TYPE || TREE_CODE (etype) == BOOLEAN_TYPE) + etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype), + TYPE_UNSIGNED (etype)); - if (code != INTEGER_TYPE) - etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype), - TYPE_UNSIGNED (etype)); - break; - - default: - break; - } - - /* If we don't have wrap-around arithmetics upfront, try to force it. */ - if (TREE_CODE (etype) == INTEGER_TYPE - && !TYPE_OVERFLOW_WRAPS (etype)) + if (TREE_CODE (etype) == INTEGER_TYPE && !TYPE_OVERFLOW_WRAPS (etype)) { tree utype, minv, maxv; @@ -7229,11 +7206,6 @@ fold_sign_changed_comparison (enum tree_code code, tree type, if (TYPE_PRECISION (inner_type) != TYPE_PRECISION (outer_type)) return NULL_TREE; - /* If the conversion is from an integral subtype to its basetype - leave it alone. */ - if (TREE_TYPE (inner_type) == outer_type) - return NULL_TREE; - if (TREE_CODE (arg1) != INTEGER_CST && !(CONVERT_EXPR_P (arg1) && TREE_TYPE (TREE_OPERAND (arg1, 0)) == inner_type)) @@ -8291,9 +8263,7 @@ fold_unary (enum tree_code code, tree type, tree op0) transformation effectively doesn't preserve non-maximal ranges. */ if (TREE_CODE (type) == INTEGER_TYPE && TREE_CODE (op0) == BIT_AND_EXPR - && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST - /* Not if the conversion is to the sub-type. */ - && TREE_TYPE (type) != TREE_TYPE (op0)) + && TREE_CODE (TREE_OPERAND (op0, 1)) == INTEGER_CST) { tree and = op0; tree and0 = TREE_OPERAND (and, 0), and1 = TREE_OPERAND (and, 1); @@ -8410,11 +8380,7 @@ fold_unary (enum tree_code code, tree type, tree op0) || POINTER_TYPE_P (type)) && (INTEGRAL_TYPE_P (TREE_TYPE (op0)) || POINTER_TYPE_P (TREE_TYPE (op0))) - && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0)) - /* Do not muck with VIEW_CONVERT_EXPRs that convert from - a sub-type to its base type as generated by the Ada FE. */ - && !(INTEGRAL_TYPE_P (TREE_TYPE (op0)) - && TREE_TYPE (TREE_TYPE (op0)))) + && TYPE_PRECISION (type) == TYPE_PRECISION (TREE_TYPE (op0))) return fold_convert (type, op0); /* Strip inner integral conversions that do not change the precision. */ |