------- Comment #2 from jakub at gcc dot gnu dot org 2007-07-18 14:14 ------- The thing that changed is that new dataflow now allows moving around the (set (r12) (something)) frame related instructions within EBBs during scheduling more easily. These are generated for the sibcall epilogues before sibling calls and also for epilogue before br.ret. ia64.c unwind generation code assumes that the frame related r12 setting insns say in the same BB (while scheduling works with EBBs) and emits .body and .copy_state at the start of next BB after .label_state, but in this case we want it another BB later.
I'll attach 3 possible fixes, one is to add blockage like we do for current_frame_info.total_size != 0 or cfun->machine->ia64_eh_epilogue_sp functions when we need frame pointer (and thus emit the r12 = something frame related insn), the other is the same but only emit the blockage in sibcall epilogues. The last one I'm ATM bootstrapping/regtesting doesn't limit the scheduling in anyway, instead adds a little state machine to control the addition of .label_state/.restore sp, .prologue, .body and .copy_state. If that works, it would e.g. also fix unnecessary .body directives when already in .body region. -- jakub at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |wilson at gcc dot gnu dot | |org AssignedTo|unassigned at gcc dot gnu |jakub at gcc dot gnu dot org |dot org | Status|UNCONFIRMED |ASSIGNED Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2007-07-18 14:14:14 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32338