This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug middle-end/51994] [4.6/4.7 Regression] git-1.7.8.3 miscompiled due to negative bitpos from get_inner_reference
- From: "ubizjak at gmail dot com" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: Wed, 25 Jan 2012 19:44:03 +0000
- Subject: [Bug middle-end/51994] [4.6/4.7 Regression] git-1.7.8.3 miscompiled due to negative bitpos from get_inner_reference
- Auto-submitted: auto-generated
- References: <bug-51994-4@http.gcc.gnu.org/bugzilla/>
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