re PR middle-end/62103 (Incorrect folding of bitfield in a union on big endian targets)

2014-08-12  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    gcc/
    PR middle-end/62103
    * gimple-fold.c (fold_ctor_reference): Don't fold in presence of
    bitfields, that is when size doesn't match the size of type or the
    size of the constructor.

    gcc/testsuite/
    PR middle-end/62103
    * gcc.c-torture/execute/bitfld-6.c: New test.

From-SVN: r213846
This commit is contained in:
Thomas Preud'homme 2014-08-12 02:36:37 +00:00 committed by Thomas Preud'homme
parent 5ea8ce44e9
commit 3d8208ce68
4 changed files with 37 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2014-08-12 Thomas Preud'homme <thomas.preudhomme@arm.com>
PR middle-end/62103
* gimple-fold.c (fold_ctor_reference): Don't fold in presence of
bitfields, that is when size doesn't match the size of type or the
size of the constructor.
2014-08-11 Michael Meissner <meissner@linux.vnet.ibm.com>
* config/rs6000/constraints.md (wh constraint): New constraint,

View File

@ -4355,8 +4355,8 @@ fold_ctor_reference (tree type, tree ctor, unsigned HOST_WIDE_INT offset,
result. */
if (!AGGREGATE_TYPE_P (TREE_TYPE (ctor)) && !offset
/* VIEW_CONVERT_EXPR is defined only for matching sizes. */
&& operand_equal_p (TYPE_SIZE (type),
TYPE_SIZE (TREE_TYPE (ctor)), 0))
&& !compare_tree_int (TYPE_SIZE (type), size)
&& !compare_tree_int (TYPE_SIZE (TREE_TYPE (ctor)), size))
{
ret = canonicalize_constructor_val (unshare_expr (ctor), from_decl);
ret = fold_unary (VIEW_CONVERT_EXPR, type, ret);

View File

@ -1,3 +1,8 @@
2014-08-12 Thomas Preud'homme <thomas.preudhomme@arm.com>
PR middle-end/62103
* gcc.c-torture/execute/bitfld-6.c: New test.
2014-08-11 Janis Johnson <janisjo@codesourcery.com>
* gcc.target/arm/frame-pointer-1.c: Skip if Thumb is not supported.

View File

@ -0,0 +1,23 @@
union U
{
const int a;
unsigned b : 20;
};
static union U u = { 0x12345678 };
/* Constant folding used to fail to account for endianness when folding a
union. */
int
main (void)
{
#ifdef __BYTE_ORDER__
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
return u.b - 0x45678;
#else
return u.b - 0x12345;
#endif
#endif
return 0;
}