From 3d8208ce68167eb84192ee9f81c5028db5beea43 Mon Sep 17 00:00:00 2001 From: Thomas Preud'homme Date: Tue, 12 Aug 2014 02:36:37 +0000 Subject: re PR middle-end/62103 (Incorrect folding of bitfield in a union on big endian targets) 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: r213846 --- gcc/ChangeLog | 7 +++++++ gcc/gimple-fold.c | 4 ++-- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/execute/bitfld-6.c | 23 +++++++++++++++++++++++ 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/bitfld-6.c (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da93817..6aff6fc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +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-11 Michael Meissner * config/rs6000/constraints.md (wh constraint): New constraint, diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 76a243a..20c7cb0 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3465a58..70d0653 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-08-12 Thomas Preud'homme + + PR middle-end/62103 + * gcc.c-torture/execute/bitfld-6.c: New test. + 2014-08-11 Janis Johnson * gcc.target/arm/frame-pointer-1.c: Skip if Thumb is not supported. 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 0000000..50927dc --- /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; +} -- cgit v1.1