aboutsummaryrefslogtreecommitdiff
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-12-09 09:36:11 +0100
committerJakub Jelinek <jakub@redhat.com>2020-12-09 09:36:11 +0100
commit0673fc691175bfdb72d70c2fbbfcad238a3a9942 (patch)
tree037d0bb87c2ab00fa0f23bed6c002213c534cbd5 /gcc/fold-const.c
parent4164e58bfd5d57e7399f91c7c27ae6ccebc7dcb0 (diff)
downloadgcc-0673fc691175bfdb72d70c2fbbfcad238a3a9942.zip
gcc-0673fc691175bfdb72d70c2fbbfcad238a3a9942.tar.gz
gcc-0673fc691175bfdb72d70c2fbbfcad238a3a9942.tar.bz2
fold-const: Fix native_encode_initializer bitfield handling [PR98199]
With the bit_cast changes, I have added support for bitfields which don't have scalar representatives. For bit_cast it works fine, as when mask is non-NULL, off is asserted to be 0. But when native_encode_initializer is called e.g. from sccvn with off > 0 (i.e. we are interested in encoding just a few bytes out of it somewhere from the middle or at the end), the following computations are incorrect. pos is a byte position from the start of the constructor, repr_size is the size in bytes of the bit-field representative and len is the length of the buffer. If the buffer is offsetted by positive off, those numbers are uncomparable though, we need to add off to len to make both count bytes from the start of the constructor, and o is a utility temporary set to off != -1 ? off : 0 (because off -1 also means start at offset 0 and just force special behavior). 2020-12-09 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/98199 * fold-const.c (native_encode_initializer): Fix handling bit-fields when off > 0. * gcc.c-torture/compile/pr98199.c: New test.
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 81467f1..b78f3ab 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -8320,11 +8320,11 @@ native_encode_initializer (tree init, unsigned char *ptr, int len,
return 0;
HOST_WIDE_INT repr_size = int_size_in_bytes (repr_type);
gcc_assert (repr_size > 0 && repr_size <= len);
- if (pos + repr_size <= len)
+ if (pos + repr_size <= o + len)
rpos = pos;
else
{
- rpos = len - repr_size;
+ rpos = o + len - repr_size;
gcc_assert (rpos <= pos);
}
}