From a2b9a662bd8f52d2a131cf369dcbd37c5be6eb7a Mon Sep 17 00:00:00 2001 From: rth Date: Wed, 3 Mar 2004 00:46:06 +0000 Subject: [PATCH] PR middle-end/11767 * coverage.c (coverage_counter_ref): Set MEM_NOTRAP_P. * optabs.c (prepare_cmp_insn): Force trapping memories to registers before the compare, if flag_non_call_exceptions. * g++.dg/other/profile1.C: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@78805 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/coverage.c | 1 + gcc/optabs.c | 10 ++++++++++ 3 files changed, 18 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1a8e333..ebcd2ec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2004-03-02 Richard Henderson + PR middle-end/11767 + * coverage.c (coverage_counter_ref): Set MEM_NOTRAP_P. + * optabs.c (prepare_cmp_insn): Force trapping memories to registers + before the compare, if flag_non_call_exceptions. + +2004-03-02 Richard Henderson + PR middle-end/14327 * stmt.c (expand_computed_goto): Do do_pending_stack_adjust before emitting the label, not after. diff --git a/gcc/coverage.c b/gcc/coverage.c index 6d6f3b8..d045d79 100644 --- a/gcc/coverage.c +++ b/gcc/coverage.c @@ -399,6 +399,7 @@ coverage_counter_ref (unsigned counter, unsigned no) ref = plus_constant (ctr_labels[counter], gcov_size / BITS_PER_UNIT * no); ref = gen_rtx_MEM (mode, ref); set_mem_alias_set (ref, new_alias_set ()); + MEM_NOTRAP_P (ref) = 1; return ref; } diff --git a/gcc/optabs.c b/gcc/optabs.c index cf3099b..0826782 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -3650,6 +3650,16 @@ prepare_cmp_insn (rtx *px, rtx *py, enum rtx_code *pcomparison, rtx size, return; } + /* Don't allow operands to the compare to trap, as that can put the + compare and branch in different basic blocks. */ + if (flag_non_call_exceptions) + { + if (may_trap_p (x)) + x = force_reg (mode, x); + if (may_trap_p (y)) + y = force_reg (mode, y); + } + *px = x; *py = y; if (can_compare_p (*pcomparison, mode, purpose)) -- 2.7.4