+ ira_object_t obj = ALLOCNO_OBJECT (a, i);
+ machine_mode obj_mode = obj->allocno->mode;
+ rtx allocno_reg = regno_reg_rtx [ALLOCNO_REGNO (a)];
+
+ if ((! flag_caller_saves && ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
+ /* For debugging purposes don't put user defined variables in
+ callee-clobbered registers. However, do allow parameters
+ in callee-clobbered registers to improve debugging. This
+ is a bit of a fragile hack. */
+ || (optimize == 0
+ && REG_USERVAR_P (allocno_reg)
+ && ! reg_is_parm_p (allocno_reg)))
+ {
+ IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
+ call_used_reg_set);
+ IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
+ call_used_reg_set);
+ }
+ else if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
+ {
+ IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
+ no_caller_save_reg_set);
+ IOR_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
+ temp_hard_reg_set);
+ IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
+ no_caller_save_reg_set);
+ IOR_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj),
+ temp_hard_reg_set);
+ }
+
+ /* Now we deal with paradoxical subreg cases where certain registers
+ cannot be accessed in the widest mode. */
+ machine_mode outer_mode = ALLOCNO_WMODE (a);
+ machine_mode inner_mode = ALLOCNO_MODE (a);
+ if (paradoxical_subreg_p (outer_mode, inner_mode))
+ {
+ enum reg_class aclass = ALLOCNO_CLASS (a);
+ for (int j = ira_class_hard_regs_num[aclass] - 1; j >= 0; --j)
+ {
+ int inner_regno = ira_class_hard_regs[aclass][j];
+ int outer_regno = simplify_subreg_regno (inner_regno,
+ inner_mode, 0,
+ outer_mode);
+ if (outer_regno < 0
+ || !in_hard_reg_set_p (reg_class_contents[aclass],
+ outer_mode, outer_regno))
+ {
+ SET_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
+ inner_regno);
+ SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj),
+ inner_regno);
+ }
+ }
+ }
+
+ if (ALLOCNO_CALLS_CROSSED_NUM (a) != 0)
+ {
+ int regno;
+
+ /* Allocnos bigger than the saved part of call saved
+ regs must conflict with them. */
+ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
+ if (!TEST_HARD_REG_BIT (call_used_reg_set, regno)
+ && targetm.hard_regno_call_part_clobbered (NULL, regno,
+ obj_mode))
+ {
+ SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), regno);
+ SET_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj),
+ regno);
+ }
+ }