From 9caad63ac4e23bcf3368a2c72533624f6e5af79f Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 11 Mar 2004 15:19:51 -0800 Subject: [PATCH] except.c (remove_unreachable_regions): Look thru CALL_PLACEHOLDER. * except.c (remove_unreachable_regions): Look thru CALL_PLACEHOLDER. * g++.dg/opt/eh1.C: New. From-SVN: r79350 --- gcc/ChangeLog | 5 +++++ gcc/except.c | 13 ++++++++++++- gcc/testsuite/g++.dg/opt/eh1.C | 21 +++++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/opt/eh1.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 66813dd26c1..7e39ad6f4c9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-03-11 Richard Henderson + + PR middle-end/14477 + * except.c (remove_unreachable_regions): Look thru CALL_PLACEHOLDER. + 2004-03-11 Ulrich Weigand PR target/14262 diff --git a/gcc/except.c b/gcc/except.c index 60edf8227b9..809f6536c78 100644 --- a/gcc/except.c +++ b/gcc/except.c @@ -1048,7 +1048,18 @@ remove_unreachable_regions (rtx insns) } for (insn = insns; insn; insn = NEXT_INSN (insn)) - reachable[uid_region_num[INSN_UID (insn)]] = true; + { + reachable[uid_region_num[INSN_UID (insn)]] = true; + + if (GET_CODE (insn) == CALL_INSN + && GET_CODE (PATTERN (insn)) == CALL_PLACEHOLDER) + for (i = 0; i < 3; i++) + { + rtx sub = XEXP (PATTERN (insn), i); + for (; sub ; sub = NEXT_INSN (sub)) + reachable[uid_region_num[INSN_UID (sub)]] = true; + } + } for (i = cfun->eh->last_region_number; i > 0; --i) { diff --git a/gcc/testsuite/g++.dg/opt/eh1.C b/gcc/testsuite/g++.dg/opt/eh1.C new file mode 100644 index 00000000000..63a4d2ef35f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/eh1.C @@ -0,0 +1,21 @@ +// PR middle-end/14477 +// { dg-do compile } +// { dg-options "-O2 -fno-default-inline" } + +struct A +{ + A(); +}; + +struct B +{ + B(const A*); +}; + +struct C +{ + B b; + C(int) : b(new A) {} +}; + +C c(0); -- 2.30.2