This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[3.4] fix middle-end/14477
- From: Richard Henderson <rth at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Cc: mark at codesourcery dot com
- Date: Wed, 10 Mar 2004 16:12:07 -0800
- Subject: [3.4] fix middle-end/14477
The problem here is that we didn't look through CALL_PLACEHOLDER when
trying to delete trivially dead (i.e. never referenced) eh regions.
r~
* except.c (remove_unreachable_regions): Look thru CALL_PLACEHOLDER.
* g++.dg/opt/eh1.C: New.
Index: except.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/except.c,v
retrieving revision 1.256.2.2
diff -c -p -d -r1.256.2.2 except.c
*** except.c 9 Feb 2004 20:40:35 -0000 1.256.2.2
--- except.c 11 Mar 2004 00:06:48 -0000
*************** remove_unreachable_regions (rtx insns)
*** 1046,1052 ****
}
for (insn = insns; insn; insn = NEXT_INSN (insn))
! reachable[uid_region_num[INSN_UID (insn)]] = true;
for (i = cfun->eh->last_region_number; i > 0; --i)
{
--- 1046,1063 ----
}
for (insn = insns; insn; insn = NEXT_INSN (insn))
! {
! 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)
{
Index: testsuite/g++.dg/opt/eh1.C
===================================================================
RCS file: testsuite/g++.dg/opt/eh1.C
diff -N testsuite/g++.dg/opt/eh1.C
*** /dev/null 1 Jan 1970 00:00:00 -0000
--- testsuite/g++.dg/opt/eh1.C 11 Mar 2004 00:06:50 -0000
***************
*** 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);