http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51994

--- Comment #14 from Uros Bizjak <ubizjak at gmail dot com> 2012-01-25 19:44:03 
UTC ---
(In reply to comment #13)

> Perhpaps the return of get_inner_reference can be adjusted to return 
> equivalent
> negative offset expression instead of negative bit position?

Like this:

Index: expr.c
===================================================================
--- expr.c      (revision 183524)
+++ expr.c      (working copy)
@@ -6300,6 +6300,22 @@ get_inner_reference (tree exp, HOST_WIDE_INT *pbit
       *poffset = offset;
     }

+  /* Negative bit positions are not allowed.  */
+  if (*pbitpos < 0)
+    {
+      tree cst = build_int_cst (NULL_TREE, *pbitpos / BITS_PER_UNIT);
+
+      if (*poffset)
+       *poffset = fold_convert (sizetype,
+                                fold_build2 (PLUS_EXPR,
+                                             sizetype,
+                                             *poffset, cst));
+      else
+       *poffset = cst;
+
+      *pbitpos = 0;
+    }
+
   /* We can use BLKmode for a byte-aligned BLKmode bitfield.  */
   if (mode == VOIDmode
       && blkmode_bitfield

Reply via email to