re PR middle-end/62103 (Incorrect folding of bitfield in a union on big endian targets)
authorThomas Preud'homme <thomas.preudhomme@arm.com>
Wed, 4 Feb 2015 08:22:45 +0000 (08:22 +0000)
committerThomas Preud'homme <thopre01@gcc.gnu.org>
Wed, 4 Feb 2015 08:22:45 +0000 (08:22 +0000)
2015-02-04  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/bitfld-7.c [new file with mode: 0644]
gcc/tree-ssa-sccvn.c

index fdea07e8a775eddb4f2a3558669294864eab03df..44aa27f6cfdb8cca15abbcbfd83156a62725fcd5 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-04  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       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  <jakub@redhat.com>
 
        PR rtl-optimization/64756
index ad2633b46fa2822e83d104f6bdba5e0c0d127f78..03585db3754638b37428a394ddeecd5bc04b9315 100644 (file)
@@ -1,3 +1,9 @@
+2015-02-04  Thomas Preud'homme  <thomas.preudhomme@arm.com>
+
+       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  <thomas.preudhomme@arm.com>
 
        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 (file)
index 0000000..e9a61df
--- /dev/null
@@ -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;
+}
index 25c67d01a7a16d6331d23313ff3c0744d6840b52..0f1299affb897fe92dfa083dd76537312e53ea5e 100644 (file)
@@ -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;