Alexandre Oliva wrote: > * config/spu/spu.c (spu_flag_var_tracking): Drop. > (TARGET_DELAY_VARTRACK): Define. > (spu_var_tracking): New. > (spu_machine_dependent_reorg): Call it. > (asm_file_start): Don't save and override flag_var_tracking.
This change caused crashes under certain circumstances. The problem is that spu_var_tracking calls df_analyze, which assumes the df framework has been keeping up to date on instructions. In particular, it assumes that df_scan_insn was called for each insn that was generated in the meantime. Normally, this is not a problem, because the emit_insn family itself calls df_scan_insn. However, this works only as long as the assignment of insns to basic blocks is valid. In machine-dependent reorg, this is no longer true. To fix this, the current place in spu_machine_dependent_reorg that used to call df_analyze made sure to re-install the basic-block mappings by calling compute_bb_for_insn before. The new location where your patch has added a call to df_analyze, however, is out of the scope of that existing compute_bb_for_insn call, causing those problems. Fixed by adding another compute_bb_for_insn/free_bb_for_insn pair to cover the new call site as well. Also, asm_file_start now no longer does anything interesting, and can just be removed in favor of the default implementation. Tested on spu-elf, committed to mainline. Bye, Ulrich ChangeLog: * config/spu/spu.c (TARGET_ASM_FILE_START): Do not define. (asm_file_start): Remove. (spu_machine_dependent_reorg): Call compute_bb_for_insn and free_bb_for_insn around code that modifies insns before restarting df analysis. Index: gcc/config/spu/spu.c =================================================================== *** gcc/config/spu/spu.c (revision 176209) --- gcc/config/spu/spu.c (working copy) *************** static enum machine_mode spu_addr_space_ *** 224,230 **** static bool spu_addr_space_subset_p (addr_space_t, addr_space_t); static rtx spu_addr_space_convert (rtx, tree, tree); static int spu_sms_res_mii (struct ddg *g); - static void asm_file_start (void); static unsigned int spu_section_type_flags (tree, const char *, int); static section *spu_select_section (tree, int, unsigned HOST_WIDE_INT); static void spu_unique_section (tree, int); --- 224,229 ---- *************** static void spu_setup_incoming_varargs ( *** 462,470 **** #undef TARGET_SCHED_SMS_RES_MII #define TARGET_SCHED_SMS_RES_MII spu_sms_res_mii - #undef TARGET_ASM_FILE_START - #define TARGET_ASM_FILE_START asm_file_start - #undef TARGET_SECTION_TYPE_FLAGS #define TARGET_SECTION_TYPE_FLAGS spu_section_type_flags --- 461,466 ---- *************** spu_machine_dependent_reorg (void) *** 2703,2711 **** --- 2699,2709 ---- { /* We still do it for unoptimized code because an external function might have hinted a call or return. */ + compute_bb_for_insn (); insert_hbrp (); pad_bb (); spu_var_tracking (); + free_bb_for_insn (); return; } *************** spu_libgcc_shift_count_mode (void) *** 7039,7052 **** return SImode; } - /* An early place to adjust some flags after GCC has finished processing - * them. */ - static void - asm_file_start (void) - { - default_file_start (); - } - /* Implement targetm.section_type_flags. */ static unsigned int spu_section_type_flags (tree decl, const char *name, int reloc) --- 7037,7042 ---- -- Dr. Ulrich Weigand GNU Toolchain for Linux on System z and Cell BE ulrich.weig...@de.ibm.com