diff options
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 61 |
1 files changed, 31 insertions, 30 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 0f38f7f1339..b32f65a5948 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -80,7 +80,8 @@ static tree distribute_bit_expr PARAMS ((enum tree_code, tree, tree, tree)); static tree make_bit_field_ref PARAMS ((tree, tree, int, int, int)); static tree optimize_bit_field_compare PARAMS ((enum tree_code, tree, tree, tree)); -static tree decode_field_reference PARAMS ((tree, int *, int *, +static tree decode_field_reference PARAMS ((tree, HOST_WIDE_INT *, + HOST_WIDE_INT *, enum machine_mode *, int *, int *, tree *, tree *)); static int all_ones_mask_p PARAMS ((tree, int)); @@ -1491,18 +1492,15 @@ int_const_binop (code, arg1, arg2, notrunc, forsize) /* It's unclear from the C standard whether shifts can overflow. The following code ignores overflow; perhaps a C standard interpretation ruling is needed. */ - lshift_double (int1l, int1h, int2l, - TYPE_PRECISION (TREE_TYPE (arg1)), - &low, &hi, - !uns); + lshift_double (int1l, int1h, int2l, TYPE_PRECISION (TREE_TYPE (arg1)), + &low, &hi, !uns); no_overflow = 1; break; case RROTATE_EXPR: int2l = - int2l; case LROTATE_EXPR: - lrotate_double (int1l, int1h, int2l, - TYPE_PRECISION (TREE_TYPE (arg1)), + lrotate_double (int1l, int1h, int2l, TYPE_PRECISION (TREE_TYPE (arg1)), &low, &hi); break; @@ -1599,7 +1597,7 @@ int_const_binop (code, arg1, arg2, notrunc, forsize) abort (); } - if (forsize && hi == 0 && low < 1000) + if (forsize && hi == 0 && low < 10000) return size_int_type_wide (low, TREE_TYPE (arg1)); else { @@ -1850,7 +1848,7 @@ size_int_type_wide (number, type) tree type; { /* Type-size nodes already made for small sizes. */ - static tree size_table[2 * HOST_BITS_PER_WIDE_INT + 1]; + static tree size_table[2048 + 1]; static int init_p = 0; tree t; @@ -1864,8 +1862,7 @@ size_int_type_wide (number, type) /* If this is a positive number that fits in the table we use to hold cached entries, see if it is already in the table and put it there if not. */ - if (number >= 0 - && number < (int) (sizeof size_table / sizeof size_table[0]) / 2) + if (number >= 0 && number < (int) (sizeof size_table / sizeof size_table[0])) { if (size_table[number] != 0) for (t = size_table[number]; t != 0; t = TREE_CHAIN (t)) @@ -2021,7 +2018,7 @@ fold_convert (t, arg1) /* If we are trying to make a sizetype for a small integer, use size_int to pick up cached types to reduce duplicate nodes. */ if (TREE_CODE (type) == INTEGER_CST && TYPE_IS_SIZETYPE (type) - && compare_tree_int (arg1, 1000) < 0) + && compare_tree_int (arg1, 10000) < 0) return size_int_type_wide (TREE_INT_CST_LOW (arg1), type); /* Given an integer constant, make new constant with new type, @@ -2432,7 +2429,7 @@ operand_equal_for_comparison_p (arg0, arg1, other) { int unsignedp1, unsignedpo; tree primarg0, primarg1, primother; - unsigned correct_width; + unsigned int correct_width; if (operand_equal_p (arg0, arg1, 0)) return 1; @@ -2909,14 +2906,14 @@ optimize_bit_field_compare (code, compare_type, lhs, rhs) tree compare_type; tree lhs, rhs; { - int lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize; + HOST_WIDE_INT lbitpos, lbitsize, rbitpos, rbitsize, nbitpos, nbitsize; tree type = TREE_TYPE (lhs); tree signed_type, unsigned_type; int const_p = TREE_CODE (rhs) == INTEGER_CST; enum machine_mode lmode, rmode, nmode; int lunsignedp, runsignedp; int lvolatilep = 0, rvolatilep = 0; - int alignment; + unsigned int alignment; tree linner, rinner = NULL_TREE; tree mask; tree offset; @@ -3085,7 +3082,7 @@ static tree decode_field_reference (exp, pbitsize, pbitpos, pmode, punsignedp, pvolatilep, pmask, pand_mask) tree exp; - int *pbitsize, *pbitpos; + HOST_WIDE_INT *pbitsize, *pbitpos; enum machine_mode *pmode; int *punsignedp, *pvolatilep; tree *pmask; @@ -3094,8 +3091,8 @@ decode_field_reference (exp, pbitsize, pbitpos, pmode, punsignedp, tree and_mask = 0; tree mask, inner, offset; tree unsigned_type; - int precision; - int alignment; + unsigned int precision; + unsigned int alignment; /* All the optimizations using this function assume integer fields. There are problems with FP fields since the type_for_size call @@ -3151,7 +3148,7 @@ all_ones_mask_p (mask, size) int size; { tree type = TREE_TYPE (mask); - int precision = TYPE_PRECISION (type); + unsigned int precision = TYPE_PRECISION (type); tree tmask; tmask = build_int_2 (~0, ~0); @@ -3893,10 +3890,10 @@ fold_truthop (code, truth_type, lhs, rhs) enum tree_code lcode, rcode; tree ll_arg, lr_arg, rl_arg, rr_arg; tree ll_inner, lr_inner, rl_inner, rr_inner; - int ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos; - int rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos; - int xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos; - int lnbitsize, lnbitpos, rnbitsize, rnbitpos; + HOST_WIDE_INT ll_bitsize, ll_bitpos, lr_bitsize, lr_bitpos; + HOST_WIDE_INT rl_bitsize, rl_bitpos, rr_bitsize, rr_bitpos; + HOST_WIDE_INT xll_bitpos, xlr_bitpos, xrl_bitpos, xrr_bitpos; + HOST_WIDE_INT lnbitsize, lnbitpos, rnbitsize, rnbitpos; int ll_unsignedp, lr_unsignedp, rl_unsignedp, rr_unsignedp; enum machine_mode ll_mode, lr_mode, rl_mode, rr_mode; enum machine_mode lnmode, rnmode; @@ -5042,17 +5039,17 @@ fold (expr) int inside_int = INTEGRAL_TYPE_P (inside_type); int inside_ptr = POINTER_TYPE_P (inside_type); int inside_float = FLOAT_TYPE_P (inside_type); - int inside_prec = TYPE_PRECISION (inside_type); + unsigned int inside_prec = TYPE_PRECISION (inside_type); int inside_unsignedp = TREE_UNSIGNED (inside_type); int inter_int = INTEGRAL_TYPE_P (inter_type); int inter_ptr = POINTER_TYPE_P (inter_type); int inter_float = FLOAT_TYPE_P (inter_type); - int inter_prec = TYPE_PRECISION (inter_type); + unsigned int inter_prec = TYPE_PRECISION (inter_type); int inter_unsignedp = TREE_UNSIGNED (inter_type); int final_int = INTEGRAL_TYPE_P (final_type); int final_ptr = POINTER_TYPE_P (final_type); int final_float = FLOAT_TYPE_P (final_type); - int final_prec = TYPE_PRECISION (final_type); + unsigned int final_prec = TYPE_PRECISION (final_type); int final_unsignedp = TREE_UNSIGNED (final_type); /* In addition to the cases of two conversions in a row @@ -5690,7 +5687,9 @@ fold (expr) if (TREE_CODE (arg0) == INTEGER_CST && TREE_CODE (arg1) == NOP_EXPR && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg1, 0)))) { - int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0))); + unsigned int prec + = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg1, 0))); + if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT && (~TREE_INT_CST_LOW (arg0) & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0) @@ -5699,7 +5698,9 @@ fold (expr) if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg0) == NOP_EXPR && TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (arg0, 0)))) { - int prec = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0))); + unsigned int prec + = TYPE_PRECISION (TREE_TYPE (TREE_OPERAND (arg0, 0))); + if (prec < BITS_PER_WORD && prec < HOST_BITS_PER_WIDE_INT && (~TREE_INT_CST_LOW (arg1) & (((HOST_WIDE_INT) 1 << prec) - 1)) == 0) @@ -6108,7 +6109,7 @@ fold (expr) (TREE_OPERAND (TREE_OPERAND (varop, 0), 1))); tree mask, unsigned_type; - int precision; + unsigned int precision; tree folded_compare; /* First check whether the comparison would come out @@ -6165,7 +6166,7 @@ fold (expr) (TREE_OPERAND (TREE_OPERAND (varop, 0), 1))); tree mask, unsigned_type; - int precision; + unsigned int precision; tree folded_compare; if (constopnum == 0) |