diff options
author | Olivier Hainque <hainque@act-europe.fr> | 2003-04-14 23:51:07 +0200 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 2003-04-14 17:51:07 -0400 |
commit | 4147232b5c88a1aa647626825cd98516f9ffb0d7 (patch) | |
tree | ac2b435b1226bd9d87e98bbeba76fed3478b54f1 /gcc/global.c | |
parent | 798a3935348d9d9f26b9b42ad1e65a1f52b7890c (diff) | |
download | gcc-4147232b5c88a1aa647626825cd98516f9ffb0d7.zip gcc-4147232b5c88a1aa647626825cd98516f9ffb0d7.tar.gz gcc-4147232b5c88a1aa647626825cd98516f9ffb0d7.tar.bz2 |
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
Diffstat (limited to 'gcc/global.c')
-rw-r--r-- | gcc/global.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/gcc/global.c b/gcc/global.c index b35777e..d563608 100644 --- a/gcc/global.c +++ b/gcc/global.c @@ -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; |