This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
ia64 eh, part 13
- To: gcc-patches at gcc dot gnu dot org
- Subject: ia64 eh, part 13
- From: Richard Henderson <rth at redhat dot com>
- Date: Tue, 27 Mar 2001 23:37:33 -0800
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;
}