global.c (global_conflicts): Prevent allocation of call clobbered hard regs to pseudos live across abnormal...

* global.c (global_conflicts): Prevent allocation of call clobbered
	hard regs to pseudos live across abnormal edges, as later passes are
	not ready to handle them.

From-SVN: r65597
This commit is contained in:
Olivier Hainque 2003-04-14 23:51:07 +02:00 committed by Richard Kenner
parent 798a393534
commit 4147232b5c
2 changed files with 24 additions and 8 deletions

View File

@ -17,6 +17,10 @@
2003-04-14 Olivier Hainque <hainque@act-europe.fr>
* global.c (global_conflicts): Prevent allocation of call clobbered
hard regs to pseudos live across abnormal edges, as later passes are
not ready to handle them.
* fold-const.c (fold): Reorder tests for conditional expressions.
* expr.c (highest_pow2_factor): Return unsigned.

View File

@ -703,26 +703,38 @@ global_conflicts ()
scan the instruction that makes either X or Y become live. */
record_conflicts (block_start_allocnos, ax);
#ifdef STACK_REGS
/* Pseudos can't go in stack regs at the start of a basic block that
is reached by an abnormal edge. Likewise for call clobbered regs,
because because caller-save, fixup_abnormal_edges, and possibly
the table driven EH machinery are not quite ready to handle such
regs live across such edges. */
{
/* Pseudos can't go in stack regs at the start of a basic block
that is reached by an abnormal edge. */
edge e;
for (e = b->pred; e ; e = e->pred_next)
if (e->flags & EDGE_ABNORMAL)
break;
if (e != NULL)
{
#ifdef STACK_REGS
EXECUTE_IF_SET_IN_ALLOCNO_SET (allocnos_live, ax,
{
allocno[ax].no_stack_reg = 1;
});
{
allocno[ax].no_stack_reg = 1;
});
for (ax = FIRST_STACK_REG; ax <= LAST_STACK_REG; ax++)
record_one_conflict (ax);
#endif
/* No need to record conflicts for call clobbered regs if we have
nonlocal labels around, as we don't ever try to allocate such
regs in this case. */
if (! current_function_has_nonlocal_label)
for (ax = 0; ax < FIRST_PSEUDO_REGISTER; ax++)
if (call_used_regs [ax])
record_one_conflict (ax);
}
}
#endif
}
insn = b->head;