re PR middle-end/55321 (Ada bootstrap failure on armv5tel-linux-gnueabi)
PR middle-end/55321 * calls.c (emit_library_call_value_1): Mark as no-nonlocal if no-throw. From-SVN: r193973
This commit is contained in:
parent
74df1ad0fe
commit
85da11a61f
6 changed files with 72 additions and 2 deletions
|
@ -1,3 +1,8 @@
|
|||
2012-11-29 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
PR middle-end/55321
|
||||
* calls.c (emit_library_call_value_1): Mark as no-nonlocal if no-throw.
|
||||
|
||||
2012-11-29 Vladimir Makarov <vmakarov@redhat.com>
|
||||
|
||||
PR middle-end/55456
|
||||
|
|
17
gcc/calls.c
17
gcc/calls.c
|
@ -4196,13 +4196,11 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
|
|||
that it should complain if nonvolatile values are live. For
|
||||
functions that cannot return, inform flow that control does not
|
||||
fall through. */
|
||||
|
||||
if (flags & ECF_NORETURN)
|
||||
{
|
||||
/* The barrier note must be emitted
|
||||
immediately after the CALL_INSN. Some ports emit more than
|
||||
just a CALL_INSN above, so we must search for it here. */
|
||||
|
||||
rtx last = get_last_insn ();
|
||||
while (!CALL_P (last))
|
||||
{
|
||||
|
@ -4214,6 +4212,21 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
|
|||
emit_barrier_after (last);
|
||||
}
|
||||
|
||||
/* Consider that "regular" libcalls, i.e. all of them except for LCT_THROW
|
||||
and LCT_RETURNS_TWICE, cannot perform non-local gotos. */
|
||||
if (flags & ECF_NOTHROW)
|
||||
{
|
||||
rtx last = get_last_insn ();
|
||||
while (!CALL_P (last))
|
||||
{
|
||||
last = PREV_INSN (last);
|
||||
/* There was no CALL_INSN? */
|
||||
gcc_assert (last != before_call);
|
||||
}
|
||||
|
||||
make_reg_eh_region_note_nothrow_nononlocal (last);
|
||||
}
|
||||
|
||||
/* Now restore inhibit_defer_pop to its actual original value. */
|
||||
OK_DEFER_POP;
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2012-11-29 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* loop_optimization14.ad[sb]: New test.
|
||||
* loop_optimization14_pkg.ads: New helper.
|
||||
|
||||
2012-11-29 Richard Earnshaw <rearnsha@arm.com>
|
||||
|
||||
PR target/55073
|
||||
|
|
29
gcc/testsuite/gnat.dg/loop_optimization14.adb
Normal file
29
gcc/testsuite/gnat.dg/loop_optimization14.adb
Normal file
|
@ -0,0 +1,29 @@
|
|||
-- PR middle-end/55321
|
||||
-- { dg-do compile }
|
||||
-- { dg-options "-O" }
|
||||
|
||||
with Loop_Optimization14_Pkg; use Loop_Optimization14_Pkg;
|
||||
|
||||
package body Loop_Optimization14 is
|
||||
|
||||
procedure Finalize_Pool (Pool : in out Rec) is
|
||||
Raised : Boolean := False;
|
||||
begin
|
||||
Pool.A := True;
|
||||
|
||||
while not Pool.B loop
|
||||
|
||||
begin
|
||||
Proc (Pool.B);
|
||||
|
||||
exception
|
||||
when others =>
|
||||
if not Raised then
|
||||
Raised := True;
|
||||
end if;
|
||||
end;
|
||||
end loop;
|
||||
|
||||
end;
|
||||
|
||||
end Loop_Optimization14;
|
13
gcc/testsuite/gnat.dg/loop_optimization14.ads
Normal file
13
gcc/testsuite/gnat.dg/loop_optimization14.ads
Normal file
|
@ -0,0 +1,13 @@
|
|||
package Loop_Optimization14 is
|
||||
|
||||
type Rec is record
|
||||
A : Boolean;
|
||||
pragma Atomic (A);
|
||||
|
||||
B : Boolean;
|
||||
|
||||
end record;
|
||||
|
||||
procedure Finalize_Pool (Pool : in out Rec);
|
||||
|
||||
end Loop_Optimization14;
|
5
gcc/testsuite/gnat.dg/loop_optimization14_pkg.ads
Normal file
5
gcc/testsuite/gnat.dg/loop_optimization14_pkg.ads
Normal file
|
@ -0,0 +1,5 @@
|
|||
package Loop_Optimization14_Pkg is
|
||||
|
||||
procedure Proc (B : in out Boolean);
|
||||
|
||||
end Loop_Optimization14_Pkg;
|
Loading…
Add table
Reference in a new issue