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]

ia64 eh, part 13


When removing NOTE_INSN_EH_REGION_BEG/END notes in the presense of
non-call exceptions, we must identify what instructions can trap in
order to tag them.  This eliminates some false positives.


r~


        * rtlanal.c (rtx_addr_can_trap_p): Virtual registers cannot trap.
        Auto-inc addresses trap only if their base register does.

Index: rtlanal.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/rtlanal.c,v
retrieving revision 1.90
diff -c -p -d -r1.90 rtlanal.c
*** rtlanal.c	2001/03/09 06:28:21	1.90
--- rtlanal.c	2001/03/28 07:32:44
*************** rtx_addr_can_trap_p (x)
*** 216,225 ****
  
      case REG:
        /* As in rtx_varies_p, we have to use the actual rtx, not reg number.  */
!       return ! (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
! 		|| x == stack_pointer_rtx
! 		/* The arg pointer varies if it is not a fixed register.  */
! 		|| (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]));
  
      case CONST:
        return rtx_addr_can_trap_p (XEXP (x, 0));
--- 216,231 ----
  
      case REG:
        /* As in rtx_varies_p, we have to use the actual rtx, not reg number.  */
!       if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
! 	  || x == stack_pointer_rtx
! 	  /* The arg pointer varies if it is not a fixed register.  */
! 	  || (x == arg_pointer_rtx && fixed_regs[ARG_POINTER_REGNUM]))
! 	return 0;
!       /* All of the virtual frame registers are stack references.  */
!       if (REGNO (x) >= FIRST_VIRTUAL_REGISTER
! 	  && REGNO (x) <= LAST_VIRTUAL_REGISTER)
! 	return 0;
!       return 1;
  
      case CONST:
        return rtx_addr_can_trap_p (XEXP (x, 0));
*************** rtx_addr_can_trap_p (x)
*** 234,241 ****
  		    && CONSTANT_P (XEXP (x, 1))));
  
      case LO_SUM:
        return rtx_addr_can_trap_p (XEXP (x, 1));
!       
      default:
        break;
      }
--- 240,255 ----
  		    && CONSTANT_P (XEXP (x, 1))));
  
      case LO_SUM:
+     case PRE_MODIFY:
        return rtx_addr_can_trap_p (XEXP (x, 1));
! 
!     case PRE_DEC:
!     case PRE_INC:
!     case POST_DEC:
!     case POST_INC:
!     case POST_MODIFY:
!       return rtx_addr_can_trap_p (XEXP (x, 0));
! 
      default:
        break;
      }


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