diff mbox

[PR,46801] Allow byte-aligned aggregate bit-fields in SRA

Message ID 20101229000635.GA31120@alvy.suse.cz
State New
Headers show

Commit Message

Martin Jambor Dec. 29, 2010, 12:06 a.m. UTC
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?

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.

Comments

Richard Biener Dec. 29, 2010, 3:51 p.m. UTC | #1
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)
>
diff mbox

Patch

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)