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