Message ID | 20101229000635.GA31120@alvy.suse.cz |
---|---|
State | New |
Headers | show |
On Wed, Dec 29, 2010 at 1:06 AM, Martin Jambor <mjambor@suse.cz> wrote: > Hi, > > PR 46801 tests for an optimization that is not carried out because SRA > currently does not even consider stuff with an aggregate bit-field in > them. However, the screening of candidates can be made a bit more > permissive because problems are caused by aggregate fields that are > not byte-aligned, not by just any aggregate field with the bit-field > flag set. And that is what the patch below does. > > Bootstrapped and tested on x86_64-linux without any problems. OK for > trunk? Ok. Thanks, Richard. > Thanks, > > Martin > > > 2010-12-28 Martin Jambor <mjambor@suse.cz> > > PR tree-optimization/46801 > * tree-sra.c (type_internals_preclude_sra_p): Check whether > aggregate fields start at byte boundary instead of the bit-field flag. > > * testsuite/gnat.dg/pack9.adb: Remove xfail. > > > Index: mine/gcc/testsuite/gnat.dg/pack9.adb > =================================================================== > --- mine.orig/gcc/testsuite/gnat.dg/pack9.adb 2010-12-28 23:35:28.000000000 +0100 > +++ mine/gcc/testsuite/gnat.dg/pack9.adb 2010-12-28 23:35:30.000000000 +0100 > @@ -15,5 +15,5 @@ package body Pack9 is > > end Pack9; > > --- { dg-final { scan-tree-dump-not "gnat_rcheck" "optimized" { xfail *-*-* } } } > +-- { dg-final { scan-tree-dump-not "gnat_rcheck" "optimized" } } > -- { dg-final { cleanup-tree-dump "optimized" } } > Index: mine/gcc/tree-sra.c > =================================================================== > --- mine.orig/gcc/tree-sra.c 2010-12-28 23:29:36.000000000 +0100 > +++ mine/gcc/tree-sra.c 2010-12-28 23:30:56.000000000 +0100 > @@ -653,7 +653,8 @@ type_internals_preclude_sra_p (tree type > || !DECL_FIELD_OFFSET (fld) || !DECL_SIZE (fld) > || !host_integerp (DECL_FIELD_OFFSET (fld), 1) > || !host_integerp (DECL_SIZE (fld), 1) > - || (DECL_BIT_FIELD (fld) && AGGREGATE_TYPE_P (ft))) > + || (AGGREGATE_TYPE_P (ft) > + && int_bit_position (fld) % BITS_PER_UNIT != 0)) > return true; > > if (AGGREGATE_TYPE_P (ft) >
Index: mine/gcc/testsuite/gnat.dg/pack9.adb =================================================================== --- mine.orig/gcc/testsuite/gnat.dg/pack9.adb 2010-12-28 23:35:28.000000000 +0100 +++ mine/gcc/testsuite/gnat.dg/pack9.adb 2010-12-28 23:35:30.000000000 +0100 @@ -15,5 +15,5 @@ package body Pack9 is end Pack9; --- { dg-final { scan-tree-dump-not "gnat_rcheck" "optimized" { xfail *-*-* } } } +-- { dg-final { scan-tree-dump-not "gnat_rcheck" "optimized" } } -- { dg-final { cleanup-tree-dump "optimized" } } Index: mine/gcc/tree-sra.c =================================================================== --- mine.orig/gcc/tree-sra.c 2010-12-28 23:29:36.000000000 +0100 +++ mine/gcc/tree-sra.c 2010-12-28 23:30:56.000000000 +0100 @@ -653,7 +653,8 @@ type_internals_preclude_sra_p (tree type || !DECL_FIELD_OFFSET (fld) || !DECL_SIZE (fld) || !host_integerp (DECL_FIELD_OFFSET (fld), 1) || !host_integerp (DECL_SIZE (fld), 1) - || (DECL_BIT_FIELD (fld) && AGGREGATE_TYPE_P (ft))) + || (AGGREGATE_TYPE_P (ft) + && int_bit_position (fld) % BITS_PER_UNIT != 0)) return true; if (AGGREGATE_TYPE_P (ft)