From c0fc376bcfaaf42823c07e5cd8420343fd56b370 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Tue, 24 Oct 2000 16:01:11 -0700 Subject: [PATCH] rtlanal.c (rtx_unstable_p, [...]): Don't consider pic register stable if PIC_OFFSET_TABLE_REG_CALL_CLOBBERED. * rtlanal.c (rtx_unstable_p, rtx_varies_p): Don't consider pic register stable if PIC_OFFSET_TABLE_REG_CALL_CLOBBERED. From-SVN: r37040 --- gcc/ChangeLog | 5 +++++ gcc/rtlanal.c | 27 ++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9ab283a5966..e4c278bf412 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2000-10-24 Richard Henderson + + * rtlanal.c (rtx_unstable_p, rtx_varies_p): Don't consider pic + register stable if PIC_OFFSET_TABLE_REG_CALL_CLOBBERED. + 2000-10-24 Aldy Hernandez * gcse.c (cprop_insn): do not propagate constants into jump_insn diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 52a430b12ff..88b49fe649e 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -70,9 +70,17 @@ rtx_unstable_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 == arg_pointer_rtx || x == pic_offset_table_rtx - || RTX_UNCHANGING_P (x)); + if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx + || x == arg_pointer_rtx || RTX_UNCHANGING_P (x)) + return 0; +#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED + /* ??? When call-clobbered, the value is stable modulo the restore + that must happen after a call. This currently screws up local-alloc + into believing that the restore is not needed. */ + if (x == pic_offset_table_rtx) + return 0; +#endif + return 1; case ASM_OPERANDS: if (MEM_VOLATILE_P (x)) @@ -135,8 +143,17 @@ rtx_varies_p (x) and arg pointers and not just the register number in case we have eliminated the frame and/or arg pointer and are using it for pseudos. */ - return ! (x == frame_pointer_rtx || x == hard_frame_pointer_rtx - || x == arg_pointer_rtx || x == pic_offset_table_rtx); + if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx + || x == arg_pointer_rtx) + return 0; +#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED + /* ??? When call-clobbered, the value is stable modulo the restore + that must happen after a call. This currently screws up local-alloc + into believing that the restore is not needed. */ + if (x == pic_offset_table_rtx) + return 0; +#endif + return 1; case LO_SUM: /* The operand 0 of a LO_SUM is considered constant -- 2.30.2