From 85da11a61f0e8ce7d30f2ce79508c71ec8914f1b Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 29 Nov 2012 22:58:23 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 ++++ gcc/calls.c | 17 +++++++++-- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gnat.dg/loop_optimization14.adb | 29 +++++++++++++++++++ gcc/testsuite/gnat.dg/loop_optimization14.ads | 13 +++++++++ .../gnat.dg/loop_optimization14_pkg.ads | 5 ++++ 6 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gnat.dg/loop_optimization14.adb create mode 100644 gcc/testsuite/gnat.dg/loop_optimization14.ads create mode 100644 gcc/testsuite/gnat.dg/loop_optimization14_pkg.ads diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 24d73d53b60..903a77cf4af 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-11-29 Eric Botcazou + + PR middle-end/55321 + * calls.c (emit_library_call_value_1): Mark as no-nonlocal if no-throw. + 2012-11-29 Vladimir Makarov PR middle-end/55456 diff --git a/gcc/calls.c b/gcc/calls.c index f4bed747e84..574c247f0e5 100644 --- a/gcc/calls.c +++ b/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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 996347b764f..54692e1d2ef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-11-29 Eric Botcazou + + * loop_optimization14.ad[sb]: New test. + * loop_optimization14_pkg.ads: New helper. + 2012-11-29 Richard Earnshaw PR target/55073 diff --git a/gcc/testsuite/gnat.dg/loop_optimization14.adb b/gcc/testsuite/gnat.dg/loop_optimization14.adb new file mode 100644 index 00000000000..c53c4840a71 --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization14.adb @@ -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; diff --git a/gcc/testsuite/gnat.dg/loop_optimization14.ads b/gcc/testsuite/gnat.dg/loop_optimization14.ads new file mode 100644 index 00000000000..ee99405069e --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization14.ads @@ -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; diff --git a/gcc/testsuite/gnat.dg/loop_optimization14_pkg.ads b/gcc/testsuite/gnat.dg/loop_optimization14_pkg.ads new file mode 100644 index 00000000000..23b61eb5550 --- /dev/null +++ b/gcc/testsuite/gnat.dg/loop_optimization14_pkg.ads @@ -0,0 +1,5 @@ +package Loop_Optimization14_Pkg is + + procedure Proc (B : in out Boolean); + +end Loop_Optimization14_Pkg; -- 2.30.2