2010-08-05  Jie Zhang  <jie@codesourcery.com>

	Issue #7257

	Backport from mainline:

	gcc/
	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.

	gcc/testsuite/
	2010-08-05  Jie Zhang  <jie@codesourcery.com>
	PR tree-optimization/45144
	* gcc.dg/tree-ssa/pr45144.c: New test.

 2010-08-04  Mark Mitchell  <mark@codesourcery.com>
 
 	Backport from mainline:

=== added file 'gcc/testsuite/gcc.dg/tree-ssa/pr45144.c'
--- old/gcc/testsuite/gcc.dg/tree-ssa/pr45144.c	1970-01-01 00:00:00 +0000
+++ new/gcc/testsuite/gcc.dg/tree-ssa/pr45144.c	2010-08-20 16:04:44 +0000
@@ -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" } } */

=== modified file 'gcc/tree-sra.c'
--- old/gcc/tree-sra.c	2010-08-10 13:31:21 +0000
+++ new/gcc/tree-sra.c	2010-08-20 16:04:44 +0000
@@ -805,7 +805,7 @@
 /* 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)
@@ -821,6 +821,9 @@
       {
 	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;

