Hello, since recent changes to haifa-sched.c, the SPU back-end runs into internal errors due to its use of the sched_emit_insn routine to emit instruction prefetch instructions during final scheduling.
Now that scheduled instructions aren't placed into the instruction stream directly, sched_emit_insn needs to change as well. The patch below emits the instruction before nonscheduled_insns_begin (so that it isn't considered for future scheduling), and adds it to scheduled_insns so that it will be placed into the output instruction stream at the correct location. The patch also adds calls to the add_remove_insn and begin_schedule_ready callbacks to make sure the back-end accounting stays up to date. This patch gets the SPU target back to build its run-time libraries without internal errors. Tested on spu-elf. OK for mainline? Bye, Ulrich ChangeLog: * haifa-sched.c (sched_emit_insn): Emit insn before first non-scheduled insn. Inform back-end about new insn. Add new insn to scheduled_insns list. Index: gcc/haifa-sched.c =================================================================== *** gcc/haifa-sched.c (revision 172953) --- gcc/haifa-sched.c (working copy) *************** sched_create_empty_bb_1 (basic_block aft *** 5654,5662 **** rtx sched_emit_insn (rtx pat) { ! rtx insn = emit_insn_after (pat, last_scheduled_insn); ! last_scheduled_insn = insn; haifa_init_insn (insn); return insn; } --- 5654,5669 ---- rtx sched_emit_insn (rtx pat) { ! rtx insn = emit_insn_before (pat, nonscheduled_insns_begin); haifa_init_insn (insn); + + if (current_sched_info->add_remove_insn) + current_sched_info->add_remove_insn (insn, 0); + + (*current_sched_info->begin_schedule_ready) (insn); + VEC_safe_push (rtx, heap, scheduled_insns, insn); + + last_scheduled_insn = insn; return insn; } -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE ulrich.weig...@de.ibm.com