diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2010-09-25 21:34:45 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2010-09-25 21:34:45 +0000 |
commit | cf1bcf06a155b103c96246d28e2e2e6ce1a180aa (patch) | |
tree | f16c202bbfc408429913becbb1fb0f82f4b96a2e /gcc | |
parent | de5142553aa453b81ef97e6f433f2e9de3c3c660 (diff) | |
download | gcc-cf1bcf06a155b103c96246d28e2e2e6ce1a180aa.zip gcc-cf1bcf06a155b103c96246d28e2e2e6ce1a180aa.tar.gz gcc-cf1bcf06a155b103c96246d28e2e2e6ce1a180aa.tar.bz2 |
tree-inline.c (copy_bb): Use GSI_CONTINUE_LINKING when inserting new statements because of the return...
* tree-inline.c (copy_bb): Use GSI_CONTINUE_LINKING when inserting new
statements because of the return slot optimization.
From-SVN: r164622
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/return2.adb | 33 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/return2.ads | 18 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/return2_pkg.ads | 7 | ||||
-rw-r--r-- | gcc/tree-inline.c | 3 |
6 files changed, 70 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fb424bda..4abab85 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-09-25 Eric Botcazou <ebotcazou@adacore.com> + + * tree-inline.c (copy_bb): Use GSI_CONTINUE_LINKING when inserting new + statements because of the return slot optimization. + 2010-09-25 Anatoly Sokolov <aesok@post.ru> * config/avr/avr.h (CLASS_LIKELY_SPILLED_P): Remove. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6a65c79..d985372 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-09-25 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/return2.ad[sb]: New test. + * gnat.dg/return2_pkg.ads: New helper. + 2010-09-25 Daniel Kraft <d@domob.eu> PR fortran/45776 diff --git a/gcc/testsuite/gnat.dg/return2.adb b/gcc/testsuite/gnat.dg/return2.adb new file mode 100644 index 0000000..65b7bf0 --- /dev/null +++ b/gcc/testsuite/gnat.dg/return2.adb @@ -0,0 +1,33 @@ +-- { dg-do compile } +-- { dg-options "-O" } + +with Return2_Pkg; use Return2_Pkg; + +package body Return2 is + + function Value_Internal (Image : String) return Result_Internal_T is + begin + return (Member => False); + end; + + type Result_T is array (1 .. 2) of Result_Internal_T; + + function Value (Img : String) return T is + My_F : constant String := F; + Result : Result_T; + Value : T; + begin + for I in Result'Range loop + if G (My_F, I) /= "" then + Result (I) := Value_Internal (G (My_F, I)); + if Result (I).Member then + Value (Result (I).Data) := True; + else + raise Program_Error; + end if; + end if; + end loop; + return Value; + end; + +end Return2; diff --git a/gcc/testsuite/gnat.dg/return2.ads b/gcc/testsuite/gnat.dg/return2.ads new file mode 100644 index 0000000..3e29910 --- /dev/null +++ b/gcc/testsuite/gnat.dg/return2.ads @@ -0,0 +1,18 @@ +package Return2 is + + type Kind_T is (One, Two); + + type T is array (Kind_T) of Boolean; + + type Result_Internal_T (Member : Boolean := False) is record + case Member is + when True => + Data : Kind_T := Kind_T'First; + when False => + null; + end case; + end record; + + function Value (Img : String) return T; + +end Return2; diff --git a/gcc/testsuite/gnat.dg/return2_pkg.ads b/gcc/testsuite/gnat.dg/return2_pkg.ads new file mode 100644 index 0000000..f573865 --- /dev/null +++ b/gcc/testsuite/gnat.dg/return2_pkg.ads @@ -0,0 +1,7 @@ +package Return2_Pkg is + + function F return String; + + function G (Line : String; Index : Positive) return String; + +end Return2_Pkg; diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c index 8a53d5e..b0627be 100644 --- a/gcc/tree-inline.c +++ b/gcc/tree-inline.c @@ -1558,7 +1558,8 @@ copy_bb (copy_body_data *id, basic_block bb, int frequency_scale, tree new_rhs; new_rhs = force_gimple_operand_gsi (&seq_gsi, gimple_assign_rhs1 (stmt), - true, NULL, false, GSI_NEW_STMT); + true, NULL, false, + GSI_CONTINUE_LINKING); gimple_assign_set_rhs1 (stmt, new_rhs); id->regimplify = false; } |