From: Thomas Preud'homme Date: Wed, 4 Feb 2015 08:22:45 +0000 (+0000) Subject: re PR middle-end/62103 (Incorrect folding of bitfield in a union on big endian targets) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cc9ef6a6419a8c343a5f0d233405411e8c5ca4cc;p=gcc.git re PR middle-end/62103 (Incorrect folding of bitfield in a union on big endian targets) 2015-02-04 Thomas Preud'homme gcc/ PR middle-end/62103 * tree-ssa-sccvn.c (fully_constant_vn_reference_p): Use TYPE_PRECISION to compute size of referenced value in the constant case. gcc/testsuite/ PR middle-end/62103 * gcc.c-torture/execute/bitfld-7.c: New test adapted from bitfld-6.c to use 24 bits for bitfield b. From-SVN: r220390 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fdea07e8a77..44aa27f6cfd 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-02-04 Thomas Preud'homme + + PR middle-end/62103 + * tree-ssa-sccvn.c (fully_constant_vn_reference_p): Use TYPE_PRECISION + to compute size of referenced value in the constant case. + 2015-02-03 Jakub Jelinek PR rtl-optimization/64756 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ad2633b46fa..03585db3754 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2015-02-04 Thomas Preud'homme + + PR middle-end/62103 + * gcc.c-torture/execute/bitfld-7.c: New test adapted from bitfld-6.c + to use 24 bits for bitfield b. + 2015-02-04 Thomas Preud'homme PR testsuite/64796 diff --git a/gcc/testsuite/gcc.c-torture/execute/bitfld-7.c b/gcc/testsuite/gcc.c-torture/execute/bitfld-7.c new file mode 100644 index 00000000000..e9a61df52f3 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/bitfld-7.c @@ -0,0 +1,23 @@ +union U +{ + const int a; + unsigned b : 24; +}; + +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 - 0x345678; +#else + return u.b - 0x123456; +#endif +#endif + return 0; +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 25c67d01a7a..0f1299affb8 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -1352,7 +1352,7 @@ fully_constant_vn_reference_p (vn_reference_t ref) || TYPE_PRECISION (ref->type) % BITS_PER_UNIT == 0)) { HOST_WIDE_INT off = 0; - HOST_WIDE_INT size = tree_to_shwi (TYPE_SIZE (ref->type)); + HOST_WIDE_INT size = TYPE_PRECISION (ref->type); if (size % BITS_PER_UNIT != 0 || size > MAX_BITSIZE_MODE_ANY_MODE) return NULL_TREE;