Commit 4b2c06f4 by Kyrylo Tkachov Committed by Kyrylo Tkachov

PR tree-optimization/78170: Truncate sign-extended padding when encoding bitfields

	PR tree-optimization/78170
	* gimple-ssa-store-merging.c (encode_tree_to_bitpos): Truncate padding
	introduced by native_encode_expr on little-endian as well.

	* gcc.c-torture/execute/pr78170.c: New test.

From-SVN: r241779
parent 63e523d6
2016-11-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2016-11-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR tree-optimization/78170
* gimple-ssa-store-merging.c (encode_tree_to_bitpos): Truncate padding
introduced by native_encode_expr on little-endian as well.
2016-11-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR tree-optimization/78162 PR tree-optimization/78162
* gimple-ssa-store-merging.c (execute): Mark stores with bitpos < 0 * gimple-ssa-store-merging.c (execute): Mark stores with bitpos < 0
as invalid. as invalid.
...@@ -432,13 +432,23 @@ encode_tree_to_bitpos (tree expr, unsigned char *ptr, int bitlen, int bitpos, ...@@ -432,13 +432,23 @@ encode_tree_to_bitpos (tree expr, unsigned char *ptr, int bitlen, int bitpos,
contain a sign bit due to sign-extension). */ contain a sign bit due to sign-extension). */
unsigned int padding unsigned int padding
= byte_size - ROUND_UP (bitlen, BITS_PER_UNIT) / BITS_PER_UNIT - 1; = byte_size - ROUND_UP (bitlen, BITS_PER_UNIT) / BITS_PER_UNIT - 1;
if (BYTES_BIG_ENDIAN) if (padding != 0)
{ {
tmpbuf += padding; /* On big-endian the padding is at the 'front' so just skip the initial
bytes. */
if (BYTES_BIG_ENDIAN)
tmpbuf += padding;
byte_size -= padding; byte_size -= padding;
if (bitlen % BITS_PER_UNIT != 0) if (bitlen % BITS_PER_UNIT != 0)
clear_bit_region_be (tmpbuf, BITS_PER_UNIT - 1, {
BITS_PER_UNIT - (bitlen % BITS_PER_UNIT)); if (BYTES_BIG_ENDIAN)
clear_bit_region_be (tmpbuf, BITS_PER_UNIT - 1,
BITS_PER_UNIT - (bitlen % BITS_PER_UNIT));
else
clear_bit_region (tmpbuf, bitlen,
byte_size * BITS_PER_UNIT - bitlen);
}
} }
/* Clear the bit region in PTR where the bits from TMPBUF will be /* Clear the bit region in PTR where the bits from TMPBUF will be
......
2016-11-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2016-11-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR tree-optimization/78170
* gcc.c-torture/execute/pr78170.c: New test.
2016-11-02 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
PR tree-optimization/78162 PR tree-optimization/78162
* gcc.c-torture/compile/pr78162.c: New test. * gcc.c-torture/compile/pr78162.c: New test.
......
/* PR tree-optimization/78170.
Check that sign-extended store to a bitfield
doesn't overwrite other fields. */
int a, b, d;
struct S0
{
int f0;
int f1;
int f2;
int f3;
int f4;
int f5:15;
int f6:17;
int f7:2;
int f8:30;
} c;
void fn1 ()
{
d = b = 1;
for (; b; b = a)
{
struct S0 e = { 0, 0, 0, 0, 0, 0, 1, 0, 1 };
c = e;
c.f6 = -1;
}
}
int main ()
{
fn1 ();
if (c.f7 != 0)
__builtin_abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment