From 65a07688cf999ddb07d1deb1dd8842e71602379c Mon Sep 17 00:00:00 2001 From: Richard Kenner Date: Fri, 7 Dec 2001 12:15:33 +0000 Subject: [PATCH] expr.c (store_field): Remove warning. * expr.c (store_field): Remove warning. (expand_expr, case COMPONENT_REF, case VIEW_CONVERT_EXPR): Likewise. (highest_pow2_factor, case MIN_EXPR, case MAX_EXPR): Add cases. (highest_pow2_factor, case *_DIV_EXPR): Only can do something if divisor constant power of 2. (highest_pow2_factor, case COMPOUND_EXPR): Look at operand 1. From-SVN: r47753 --- gcc/ChangeLog | 9 +++++++++ gcc/expr.c | 27 ++++++++++++++++++--------- 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 63e71d6..98f5a40 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +Fri Dec 7 07:06:17 2001 Richard Kenner + + * expr.c (store_field): Remove warning. + (expand_expr, case COMPONENT_REF, case VIEW_CONVERT_EXPR): Likewise. + (highest_pow2_factor, case MIN_EXPR, case MAX_EXPR): Add cases. + (highest_pow2_factor, case *_DIV_EXPR): Only can do something if + divisor constant power of 2. + (highest_pow2_factor, case COMPOUND_EXPR): Look at operand 1. + 2001-12-07 Kaveh R. Ghazi * alpha.c (function_arg): Cast value to HOST_WIDE_INT before diff --git a/gcc/expr.c b/gcc/expr.c index f2143d7..26ee720 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -5043,7 +5043,7 @@ store_field (target, bitsize, bitpos, mode, exp, value_mode, unsignedp, type, low-order bits. However, if EXP's type is a record and this is big-endian machine, we want the upper BITSIZE bits. */ if (BYTES_BIG_ENDIAN && GET_MODE_CLASS (GET_MODE (temp)) == MODE_INT - && bitsize < GET_MODE_BITSIZE (GET_MODE (temp)) + && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (temp)) && TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE) temp = expand_shift (RSHIFT_EXPR, GET_MODE (temp), temp, size_int (GET_MODE_BITSIZE (GET_MODE (temp)) @@ -5790,7 +5790,7 @@ highest_pow2_factor (exp) } break; - case PLUS_EXPR: case MINUS_EXPR: + case PLUS_EXPR: case MINUS_EXPR: case MIN_EXPR: case MAX_EXPR: c0 = highest_pow2_factor (TREE_OPERAND (exp, 0)); c1 = highest_pow2_factor (TREE_OPERAND (exp, 1)); return MIN (c0, c1); @@ -5802,14 +5802,22 @@ highest_pow2_factor (exp) case ROUND_DIV_EXPR: case TRUNC_DIV_EXPR: case FLOOR_DIV_EXPR: case CEIL_DIV_EXPR: - c0 = highest_pow2_factor (TREE_OPERAND (exp, 0)); - c1 = highest_pow2_factor (TREE_OPERAND (exp, 1)); - return MAX (1, c0 / c1); + if (integer_pow2p (TREE_OPERAND (exp, 1)) + && host_integerp (TREE_OPERAND (exp, 1), 1)) + { + c0 = highest_pow2_factor (TREE_OPERAND (exp, 0)); + c1 = tree_low_cst (TREE_OPERAND (exp, 1), 1); + return MAX (1, c0 / c1); + } + break; case NON_LVALUE_EXPR: case NOP_EXPR: case CONVERT_EXPR: - case COMPOUND_EXPR: case SAVE_EXPR: case WITH_RECORD_EXPR: + case SAVE_EXPR: case WITH_RECORD_EXPR: return highest_pow2_factor (TREE_OPERAND (exp, 0)); + case COMPOUND_EXPR: + return highest_pow2_factor (TREE_OPERAND (exp, 1)); + case COND_EXPR: c0 = highest_pow2_factor (TREE_OPERAND (exp, 1)); c1 = highest_pow2_factor (TREE_OPERAND (exp, 2)); @@ -6932,7 +6940,7 @@ expand_expr (exp, target, tmode, modifier) machine, we must put the field into the high-order bits. */ if (TREE_CODE (type) == RECORD_TYPE && BYTES_BIG_ENDIAN && GET_MODE_CLASS (GET_MODE (op0)) == MODE_INT - && bitsize < GET_MODE_BITSIZE (GET_MODE (op0))) + && bitsize < (HOST_WIDE_INT) GET_MODE_BITSIZE (GET_MODE (op0))) op0 = expand_shift (LSHIFT_EXPR, GET_MODE (op0), op0, size_int (GET_MODE_BITSIZE (GET_MODE (op0)) - bitsize), @@ -7305,8 +7313,9 @@ expand_expr (exp, target, tmode, modifier) && MEM_ALIGN (op0) < GET_MODE_ALIGNMENT (TYPE_MODE (type))) { tree inner_type = TREE_TYPE (TREE_OPERAND (exp, 0)); - HOST_WIDE_INT temp_size = MAX (int_size_in_bytes (inner_type), - GET_MODE_SIZE (TYPE_MODE (type))); + HOST_WIDE_INT temp_size + = MAX (int_size_in_bytes (inner_type), + (HOST_WIDE_INT) GET_MODE_SIZE (TYPE_MODE (type))); rtx new = assign_stack_temp_for_type (TYPE_MODE (type), temp_size, 0, type); rtx new_with_op0_mode = copy_rtx (new); -- 2.7.4