Fix handling of negative bitpos in expand_debug_expr
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 9 May 2016 15:30:32 +0000 (15:30 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 9 May 2016 15:30:32 +0000 (15:30 +0000)
expand_debug_expr handled negative bit positions using:

                else if (bitpos < 0)
                  {
                    HOST_WIDE_INT units
                      = (-bitpos + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
                    op0 = adjust_address_nv (op0, mode1, units);
                    bitpos += units * BITS_PER_UNIT;
                  }

Here "units" is the negative of the (negative) byte offset, so I think
we should be offsetting OP0 by -units instead.  E.g. a bitpos of -17
would give units==3, so this code would move OP0 up by 3 bytes and set
bitpos to 7, giving a total bitpos of 31.

Just noticed by inspection.  An assert triggered for:

        gcc.target/i386/mpx/bitfields-1-lbv.c
        gcc.target/i386/mpx/field-addr-7-lbv.c
        gcc.target/i386/mpx/reference-3-lbv.cpp
        gcc.target/i386/mpx/reference-4-lbv.cpp

at -m32 but otherwise this case doesn't seem to trigger during a
bootstrap and regtest.

Tested on x86_64-linux-gnu.

gcc/
* cfgexpand.c (expand_debug_expr): Fix address offset for negative
bitpos.

From-SVN: r236041

gcc/ChangeLog
gcc/cfgexpand.c

index 85f0e6738f68021af4b6e396e1f291a32c2903b0..314f5f6d67ffd19748806ad2436e8d85d805a7f5 100644 (file)
@@ -1,3 +1,8 @@
+2016-05-09  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * cfgexpand.c (expand_debug_expr): Fix address offset for negative
+       bitpos.
+
 2016-05-09  Richard Sandiford  <richard.sandiford@arm.com>
 
        * tree-affine.c (wide_int_constant_multiple_p): Add missing
index 21f21c975026a27f60e441b66a9c45b358d95a5f..77a1964d4c051e30a5b834a87668a61f3f9cd3df 100644 (file)
@@ -4473,7 +4473,7 @@ expand_debug_expr (tree exp)
              {
                HOST_WIDE_INT units
                  = (-bitpos + BITS_PER_UNIT - 1) / BITS_PER_UNIT;
-               op0 = adjust_address_nv (op0, mode1, units);
+               op0 = adjust_address_nv (op0, mode1, -units);
                bitpos += units * BITS_PER_UNIT;
              }
            else if (bitpos == 0 && bitsize == GET_MODE_BITSIZE (mode))