This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]