aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJie Zhang <jie@codesourcery.com>2010-08-05 03:05:35 +0000
committerJie Zhang <jiez@gcc.gnu.org>2010-08-05 03:05:35 +0000
commit36b86f4a54675e0d707a33e1bc605eb4d7e6139d (patch)
tree9e187d4ca7b2b2e716a05a1076c35b48a73d25c3
parent370f330ff58ff6ec3504fd2886d79e15368f3143 (diff)
downloadgcc-36b86f4a54675e0d707a33e1bc605eb4d7e6139d.zip
gcc-36b86f4a54675e0d707a33e1bc605eb4d7e6139d.tar.gz
gcc-36b86f4a54675e0d707a33e1bc605eb4d7e6139d.tar.bz2
re PR tree-optimization/45144 (SRA optimization issue of bit-field)
PR tree-optimization/45144 * tree-sra.c (type_consists_of_records_p): Return false if the record contains bit-field. testsuite/ PR tree-optimization/45144 * gcc.dg/tree-ssa/pr45144.c: New test. From-SVN: r162897
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/pr45144.c46
-rw-r--r--gcc/tree-sra.c5
4 files changed, 61 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a954245..e014b3e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2010-08-05 Jie Zhang <jie@codesourcery.com>
+
+ PR tree-optimization/45144
+ * tree-sra.c (type_consists_of_records_p): Return false
+ if the record contains bit-field.
+
2010-08-04 Richard Henderson <rth@redhat.com>
* config/i386/i386.c (struct ix86_frame): Remove padding and
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8f38f78..6c37a88 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-08-05 Jie Zhang <jie@codesourcery.com>
+
+ PR tree-optimization/45144
+ * gcc.dg/tree-ssa/pr45144.c: New test.
+
2010-08-04 Janus Weil <janus@gcc.gnu.org>
PR fortran/42207
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr45144.c b/gcc/testsuite/gcc.dg/tree-ssa/pr45144.c
new file mode 100644
index 0000000..47530ce
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr45144.c
@@ -0,0 +1,46 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+void baz (unsigned);
+
+extern unsigned buf[];
+
+struct A
+{
+ unsigned a1:10;
+ unsigned a2:3;
+ unsigned:19;
+};
+
+union TMP
+{
+ struct A a;
+ unsigned int b;
+};
+
+static unsigned
+foo (struct A *p)
+{
+ union TMP t;
+ struct A x;
+
+ x = *p;
+ t.a = x;
+ return t.b;
+}
+
+void
+bar (unsigned orig, unsigned *new)
+{
+ struct A a;
+ union TMP s;
+
+ s.b = orig;
+ a = s.a;
+ if (a.a1)
+ baz (a.a2);
+ *new = foo (&a);
+}
+
+/* { dg-final { scan-tree-dump "x = a;" "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 372139f..d32bbeb 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -811,7 +811,7 @@ create_access (tree expr, gimple stmt, bool write)
/* Return true iff TYPE is a RECORD_TYPE with fields that are either of gimple
register types or (recursively) records with only these two kinds of fields.
It also returns false if any of these records has a zero-size field as its
- last field. */
+ last field or has a bit-field. */
static bool
type_consists_of_records_p (tree type)
@@ -827,6 +827,9 @@ type_consists_of_records_p (tree type)
{
tree ft = TREE_TYPE (fld);
+ if (DECL_BIT_FIELD (fld))
+ return false;
+
if (!is_gimple_reg_type (ft)
&& !type_consists_of_records_p (ft))
return false;