This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, PR 46351] Do not SRA types with aggregate bit-fields


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?

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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]