aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2010-11-10 13:52:27 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2010-11-10 13:52:27 +0100
commitf5a7af7d1740aa9ab00bc3ce07099b0627485859 (patch)
tree6a13859190b80983b87e28b30fb5d6a3348396f1 /gcc
parent2be55a2540b291312898ad5500d20b7b64ba012c (diff)
downloadgcc-f5a7af7d1740aa9ab00bc3ce07099b0627485859.zip
gcc-f5a7af7d1740aa9ab00bc3ce07099b0627485859.tar.gz
gcc-f5a7af7d1740aa9ab00bc3ce07099b0627485859.tar.bz2
re PR tree-optimization/46351 (incorrect scalarization (2))
2010-11-10 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. From-SVN: r166535
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog9
-rw-r--r--gcc/testsuite/gnat.dg/opt10.adb26
-rw-r--r--gcc/testsuite/gnat.dg/opt10_pkg.ads14
-rw-r--r--gcc/testsuite/gnat.dg/opt11.adb12
-rw-r--r--gcc/testsuite/gnat.dg/opt11.ads17
-rw-r--r--gcc/tree-sra.c3
7 files changed, 87 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 91b407c..c14885e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2010-11-10 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.
+
2010-11-10 Joseph Myers <joseph@codesourcery.com>
* doc/tm.texi.in (TARGET_OPTION_TRANSLATE_TABLE): Remove.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index f3a0b12..0345145 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,12 @@
+2010-11-10 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/46351
+ PR tree-optimization/46377
+ * gnat.dg/opt10.adb: New file.
+ * gnat.dg/opt10_pkg.ads: Likewise.
+ * gnat.dg/opt11.adb: Likewise.
+ * gnat.dg/opt11.ads: Likewise.
+
2010-11-10 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/boolean_conv.adb: New test.
diff --git a/gcc/testsuite/gnat.dg/opt10.adb b/gcc/testsuite/gnat.dg/opt10.adb
new file mode 100644
index 0000000..cb3cb0d
--- /dev/null
+++ b/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;
+
diff --git a/gcc/testsuite/gnat.dg/opt10_pkg.ads b/gcc/testsuite/gnat.dg/opt10_pkg.ads
new file mode 100644
index 0000000..8df6dca
--- /dev/null
+++ b/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;
diff --git a/gcc/testsuite/gnat.dg/opt11.adb b/gcc/testsuite/gnat.dg/opt11.adb
new file mode 100644
index 0000000..dca4804
--- /dev/null
+++ b/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;
diff --git a/gcc/testsuite/gnat.dg/opt11.ads b/gcc/testsuite/gnat.dg/opt11.ads
new file mode 100644
index 0000000..983bf26
--- /dev/null
+++ b/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;
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 4f0d2e5..be1b45e 100644
--- a/gcc/tree-sra.c
+++ b/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)