]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/11210 (optimizer drops conditional with typecast from signed...
authorEric Botcazou <ebotcazou@libertysurf.fr>
Wed, 2 Jul 2003 07:41:07 +0000 (09:41 +0200)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 2 Jul 2003 07:41:07 +0000 (07:41 +0000)
PR optimization/11210
* expr.c (handled_component_p) [NOP_EXPR]: Add ??? note
about the behaviour with regard to bitfields.
* fold-const (decode_field_reference): Record outermost type in
case the expression is a NOP. Strip all NOPs. Set the signedness
to that of the outermost type (if any) when the bitsize is equal
to the size of the type.

From-SVN: r68823

gcc/ChangeLog
gcc/expr.c
gcc/fold-const.c

index 1162a586601950f44693e6ed290caa55ddd19329..edc420bec759b225bd3d02fcb2b460f6f2a9c964 100644 (file)
@@ -1,3 +1,13 @@
+2003-07-02  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR optimization/11210
+       * expr.c (handled_component_p) [NOP_EXPR]: Add ??? note
+       about the behaviour with regard to bitfields.
+       * fold-const (decode_field_reference): Record outermost type in
+       case the expression is a NOP. Strip all NOPs. Set the signedness
+       to that of the outermost type (if any) when the bitsize is equal
+       to the size of the type.
+
 2003-07-02  Richard Sandiford  <rsandifo@redhat.com>
 
        * config/mips/mips.md (addsi3): Remove workaround for adds of -32768.
index a581b1788029c7cea2c9ad46f6a365f9a6e4d8a5..8049020d3d3b7a439014cbc962070cacd2b3cbe7 100644 (file)
@@ -5903,6 +5903,9 @@ handled_component_p (tree t)
     case VIEW_CONVERT_EXPR:
       return 1;
 
+    /* ??? Sure they are handled, but get_inner_reference may return
+       a different PBITSIZE, depending upon whether the expression is
+       wrapped up in a NOP_EXPR or not, e.g. for bitfields.  */
     case NOP_EXPR:
     case CONVERT_EXPR:
       return (TYPE_MODE (TREE_TYPE (t))
index 25069c58f12c10f08ba88b48c19637ca8c2ba6fe..3cc01ea07651d9afc86a957db40a7534b7421deb 100644 (file)
@@ -2625,6 +2625,7 @@ decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize, HOST_WIDE_INT *pbitpo
                        enum machine_mode *pmode, int *punsignedp, int *pvolatilep,
                        tree *pmask, tree *pand_mask)
 {
+  tree outer_type = 0;
   tree and_mask = 0;
   tree mask, inner, offset;
   tree unsigned_type;
@@ -2636,6 +2637,13 @@ decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize, HOST_WIDE_INT *pbitpo
   if (! INTEGRAL_TYPE_P (TREE_TYPE (exp)))
     return 0;
 
+  /* We are interested in the bare arrangement of bits, so strip everything
+     that doesn't affect the machine mode.  However, record the type of the
+     outermost expression if it may matter below.  */
+  if (TREE_CODE (exp) == NOP_EXPR
+      || TREE_CODE (exp) == CONVERT_EXPR
+      || TREE_CODE (exp) == NON_LVALUE_EXPR)
+    outer_type = TREE_TYPE (exp);
   STRIP_NOPS (exp);
 
   if (TREE_CODE (exp) == BIT_AND_EXPR)
@@ -2654,6 +2662,12 @@ decode_field_reference (tree exp, HOST_WIDE_INT *pbitsize, HOST_WIDE_INT *pbitpo
       || TREE_CODE (inner) == PLACEHOLDER_EXPR)
     return 0;
 
+  /* If the number of bits in the reference is the same as the bitsize of
+     the outer type, then the outer type gives the signedness. Otherwise
+     (in case of a small bitfield) the signedness is unchanged.  */
+  if (outer_type && *pbitsize == tree_low_cst (TYPE_SIZE (outer_type), 1))
+    *punsignedp = TREE_UNSIGNED (outer_type);
+
   /* Compute the mask to access the bitfield.  */
   unsigned_type = (*lang_hooks.types.type_for_size) (*pbitsize, 1);
   precision = TYPE_PRECISION (unsigned_type);