+2002-01-29 Richard Henderson <rth@redhat.com>
+
+ * expr.c (force_operand): Ignore flag_pic for detecting pic
+ address loads.
+ * regclass.c (init_reg_sets_1): Test fixed_regs not flag_pic
+ for determining if PIC_OFFSET_TABLE_REGNUM is call-clobbered.
+ * resource.c (mark_target_live_regs): Use regs_invalidated_by_call
+ instead of open-coded loop.
+ * doc/tm.texi (PIC_OFFSET_TABLE_REGNUM): Clarify that it must
+ be fixed when in use.
+
2002-01-29 Richard Henderson <rth@redhat.com>
* sched-int.h (struct deps_reg): Add uses_length, clobbers_length.
is defined, RTL is generated for this register once, as with the stack
pointer and frame pointer registers. If this macro is not defined, it
is up to the machine-dependent files to allocate such a register (if
-necessary).
+necessary). Note that this register must be fixed when in use (e.g.
+when @code{flag_pic} is true).
@findex PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
@item PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
rtx subtarget = get_subtarget (target);
/* Check for a PIC address load. */
- if (flag_pic
- && (GET_CODE (value) == PLUS || GET_CODE (value) == MINUS)
+ if ((GET_CODE (value) == PLUS || GET_CODE (value) == MINUS)
&& XEXP (value, 0) == pic_offset_table_rtx
&& (GET_CODE (XEXP (value, 1)) == SYMBOL_REF
|| GET_CODE (XEXP (value, 1)) == LABEL_REF
;
#endif
#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
- else if (i == PIC_OFFSET_TABLE_REGNUM && flag_pic)
+ else if (i == PIC_OFFSET_TABLE_REGNUM && fixed_regs[i])
;
#endif
else if (0
/* CALL clobbers all call-used regs that aren't fixed except
sp, ap, and fp. Do this before setting the result of the
call live. */
- for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
- if (call_used_regs[i]
- && i != STACK_POINTER_REGNUM && i != FRAME_POINTER_REGNUM
- && i != ARG_POINTER_REGNUM
-#if HARD_FRAME_POINTER_REGNUM != FRAME_POINTER_REGNUM
- && i != HARD_FRAME_POINTER_REGNUM
-#endif
-#if ARG_POINTER_REGNUM != FRAME_POINTER_REGNUM
- && ! (i == ARG_POINTER_REGNUM && fixed_regs[i])
-#endif
-#if !defined (PIC_OFFSET_TABLE_REG_CALL_CLOBBERED)
- && ! (i == PIC_OFFSET_TABLE_REGNUM && flag_pic)
-#endif
- )
- CLEAR_HARD_REG_BIT (current_live_regs, i);
+ AND_COMPL_HARD_REG_SET (current_live_regs,
+ regs_invalidated_by_call);
/* A CALL_INSN sets any global register live, since it may
have been modified by the call. */