[PATCH, PR 46351] Do not SRA types with aggregate bit-fields
Richard Guenther
richard.guenther@gmail.com
Wed Nov 10 10:54:00 GMT 2010
On Tue, Nov 9, 2010 at 6:23 PM, Martin Jambor <mjambor@suse.cz> wrote:
> Hi,
>
> our current way of dealing with bit fields cannot possibly handle
> aggregate ones, so this patch removes variables which contain them
> from the SRA candidates.
>
> Bootstrapped and tested on x86-64-linux. The c94008d acats test
> failed with it so I am going to re-test to figure out whether it is
> one of those spurious acats failures or not. OK if it passes?
Ok.
Thanks,
Richard.
> Thanks,
>
> Martin
>
>
> 2010-11-09 Martin Jambor <mjambor@suse.cz>
>
> PR tree-optimization/46351
> PR tree-optimization/46377
> * tree-sra.c (type_internals_preclude_sra_p): Disqualify types with
> aggregate bit-fields.
>
> * testsuite/gnat.dg/opt10.adb: New file.
> * testsuite/gnat.dg/opt10_pkg.ads: Likewise.
> * testsuite/gnat.dg/opt11.adb: Likewise.
> * testsuite/gnat.dg/opt11.ads: Likewise.
>
>
> Index: mine/gcc/tree-sra.c
> ===================================================================
> --- mine.orig/gcc/tree-sra.c
> +++ mine/gcc/tree-sra.c
> @@ -653,7 +653,8 @@ type_internals_preclude_sra_p (tree type
> if (TREE_THIS_VOLATILE (fld)
> || !DECL_FIELD_OFFSET (fld) || !DECL_SIZE (fld)
> || !host_integerp (DECL_FIELD_OFFSET (fld), 1)
> - || !host_integerp (DECL_SIZE (fld), 1))
> + || !host_integerp (DECL_SIZE (fld), 1)
> + || (DECL_BIT_FIELD (fld) && AGGREGATE_TYPE_P (ft)))
> return true;
>
> if (AGGREGATE_TYPE_P (ft)
> Index: mine/gcc/testsuite/gnat.dg/opt10.adb
> ===================================================================
> --- /dev/null
> +++ mine/gcc/testsuite/gnat.dg/opt10.adb
> @@ -0,0 +1,26 @@
> +-- { dg-do compile }
> +-- { dg-options "-O2 }
> +
> +with Opt10_Pkg; use Opt10_Pkg;
> +
> +procedure Opt10 is
> +
> + procedure Compare_Rep_Data (MA, MB : Rep_Message) is
> + begin
> + if MA.Data /= MB.Data then
> + raise Program_Error;
> + end if;
> + end;
> +
> + procedure Check_Rep_For (Bit : Boolean) is
> + MA, MB : Rep_Message;
> + begin
> + Safe_Assign (MA, Bit);
> + Safe_Assign (MB, Bit);
> + Compare_Rep_Data (MA, MB);
> + end;
> +
> +begin
> + Check_Rep_For (Bit => False);
> +end;
> +
> Index: mine/gcc/testsuite/gnat.dg/opt10_pkg.ads
> ===================================================================
> --- /dev/null
> +++ mine/gcc/testsuite/gnat.dg/opt10_pkg.ads
> @@ -0,0 +1,14 @@
> +package Opt10_Pkg is
> +
> + type Rep_Message is record
> + Bit : Boolean;
> + Data : String (1 .. 4);
> + end record;
> + for Rep_Message use record
> + Bit at 0 range 0 .. 0;
> + Data at 0 range 1 .. 32;
> + end record;
> +
> + procedure Safe_Assign (M : in out Rep_Message; Bit : Boolean);
> +
> +end;
> Index: mine/gcc/testsuite/gnat.dg/opt11.adb
> ===================================================================
> --- /dev/null
> +++ mine/gcc/testsuite/gnat.dg/opt11.adb
> @@ -0,0 +1,12 @@
> +-- { dg-compile }
> +-- { dg-options "-O" }
> +
> +package body Opt11 is
> +
> + procedure Proc is
> + R : Rec;
> + begin
> + R := (others => <>);
> + end;
> +
> +end Opt11;
> Index: mine/gcc/testsuite/gnat.dg/opt11.ads
> ===================================================================
> --- /dev/null
> +++ mine/gcc/testsuite/gnat.dg/opt11.ads
> @@ -0,0 +1,17 @@
> +package Opt11 is
> +
> + type String_Ptr is access constant String;
> +
> + type Form_Type is (Qualified, Unqualified);
> +
> + type Rec is record
> + N1, N2, N3 : Natural;
> + Fixed : String_Ptr;
> + Form : Form_Type;
> + Is_Local : Boolean := True;
> + end record;
> + pragma Pack (Rec);
> +
> + procedure Proc;
> +
> +end Opt11;
>
>
More information about the Gcc-patches
mailing list