aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2001-03-27 23:34:51 -0800
committerRichard Henderson <rth@gcc.gnu.org>2001-03-27 23:34:51 -0800
commit4f73495e075c5f1cc0f4c762b03b2d5a77099ea4 (patch)
tree6b80be383047fa920dfb19b4071099305663ed08 /gcc
parent54590688b5cd0b11292e08a86e035b408375d4a7 (diff)
downloadgcc-4f73495e075c5f1cc0f4c762b03b2d5a77099ea4.zip
gcc-4f73495e075c5f1cc0f4c762b03b2d5a77099ea4.tar.gz
gcc-4f73495e075c5f1cc0f4c762b03b2d5a77099ea4.tar.bz2
rtlanal.c (rtx_addr_can_trap_p): Virtual registers cannot trap.
* rtlanal.c (rtx_addr_can_trap_p): Virtual registers cannot trap. Auto-inc addresses trap only if their base register does. From-SVN: r40914
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/rtlanal.c24
2 files changed, 22 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d5164f8..0b0379d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
2001-03-27 Richard Henderson <rth@redhat.com>
+ * rtlanal.c (rtx_addr_can_trap_p): Virtual registers cannot trap.
+ Auto-inc addresses trap only if their base register does.
+
* except.c (can_throw_internal): Rename from can_throw.
* except.h, resource.c: Update references.
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index be9374e..db8e696 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -216,10 +216,16 @@ rtx_addr_can_trap_p (x)
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]));
+ 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));
@@ -234,8 +240,16 @@ rtx_addr_can_trap_p (x)
&& 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;
}