2010-08-05 Jie Zhang Issue #7257 Backport from mainline: gcc/ 2010-08-05 Jie Zhang 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 PR tree-optimization/45144 * gcc.dg/tree-ssa/pr45144.c: New test. 2010-08-04 Mark Mitchell 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;