Commit 85da11a6 by Eric Botcazou Committed by Eric Botcazou

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
parent 74df1ad0
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> 2012-11-29 Vladimir Makarov <vmakarov@redhat.com>
PR middle-end/55456 PR middle-end/55456
...@@ -4196,13 +4196,11 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, ...@@ -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 that it should complain if nonvolatile values are live. For
functions that cannot return, inform flow that control does not functions that cannot return, inform flow that control does not
fall through. */ fall through. */
if (flags & ECF_NORETURN) if (flags & ECF_NORETURN)
{ {
/* The barrier note must be emitted /* The barrier note must be emitted
immediately after the CALL_INSN. Some ports emit more than immediately after the CALL_INSN. Some ports emit more than
just a CALL_INSN above, so we must search for it here. */ just a CALL_INSN above, so we must search for it here. */
rtx last = get_last_insn (); rtx last = get_last_insn ();
while (!CALL_P (last)) while (!CALL_P (last))
{ {
...@@ -4214,6 +4212,21 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, ...@@ -4214,6 +4212,21 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
emit_barrier_after (last); 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. */ /* Now restore inhibit_defer_pop to its actual original value. */
OK_DEFER_POP; OK_DEFER_POP;
......
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> 2012-11-29 Richard Earnshaw <rearnsha@arm.com>
PR target/55073 PR target/55073
......
-- 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;
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;
package Loop_Optimization14_Pkg is
procedure Proc (B : in out Boolean);
end Loop_Optimization14_Pkg;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment