diff options
author | Martin Jambor <mjambor@suse.cz> | 2010-11-10 13:52:27 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2010-11-10 13:52:27 +0100 |
commit | f5a7af7d1740aa9ab00bc3ce07099b0627485859 (patch) | |
tree | 6a13859190b80983b87e28b30fb5d6a3348396f1 /gcc | |
parent | 2be55a2540b291312898ad5500d20b7b64ba012c (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt10.adb | 26 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt10_pkg.ads | 14 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt11.adb | 12 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/opt11.ads | 17 | ||||
-rw-r--r-- | gcc/tree-sra.c | 3 |
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) |