expr.c (store_field): Remove warning.
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Fri, 7 Dec 2001 12:15:33 +0000 (12:15 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Fri, 7 Dec 2001 12:15:33 +0000 (07:15 -0500)
* 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
gcc/expr.c

index 63e71d6c5bf55d914ad16785948b21b1801d8e4c..98f5a402a7e7ec2dc57a3859c816b2b43d906b87 100644 (file)
@@ -1,3 +1,12 @@
+Fri Dec  7 07:06:17 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       * 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  <ghazi@caip.rutgers.edu>
 
        * alpha.c (function_arg): Cast value to HOST_WIDE_INT before
index f2143d74ee34a079b5a3263a38ecb730af1b5f30..26ee720ac42c3d97d650d470566ccac5e8074cfe 100644 (file)
@@ -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);