diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a954245ccb7..e014b3e43a7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +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. + 2010-08-04 Richard Henderson * config/i386/i386.c (struct ix86_frame): Remove padding and diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8f38f78d3c9..6c37a88dd06 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-08-05 Jie Zhang + + PR tree-optimization/45144 + * gcc.dg/tree-ssa/pr45144.c: New test. + 2010-08-04 Janus Weil 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 00000000000..47530ced46e --- /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 372139f5949..d32bbebc0f2 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;