From: Thomas Preud'homme Date: Wed, 13 Aug 2014 09:37:41 +0000 (+0000) Subject: backport: re PR middle-end/62103 (Incorrect folding of bitfield in a union on big... X-Git-Tag: releases/gcc-4.8.4~291 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6851753fdc2b2d4f1b3c3e7439714e7bd47f44e1;p=thirdparty%2Fgcc.git backport: re PR middle-end/62103 (Incorrect folding of bitfield in a union on big endian targets) 2014-08-13 Thomas Preud'homme Backport from mainline 2014-08-12 Thomas Preud'homme 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: r213899 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 25ac61f9356a..e7771545c208 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2014-08-13 Thomas Preud'homme + + Backport from mainline + 2014-08-12 Thomas Preud'homme + + 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-12 Michael Meissner Backport patch from mainline diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 5d08169b8b59..80020a99e08a 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -2955,8 +2955,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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d55ac28b2dca..bcb2b66eff97 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2014-08-13 Thomas Preud'homme + + Backport from mainline + 2014-08-12 Thomas Preud'homme + + PR middle-end/62103 + * gcc.c-torture/execute/bitfld-6.c: New test. + 2014-08-10 Thomas Koenig Backport from trunk diff --git a/gcc/testsuite/gcc.c-torture/execute/bitfld-6.c b/gcc/testsuite/gcc.c-torture/execute/bitfld-6.c new file mode 100644 index 000000000000..50927dc1d53a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/bitfld-6.c @@ -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; +}