This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
1. The major change is to add pseudo live range split transformation to the existing inheritance transformations. The idea is to create a new split pseudo, add save/restore code using the split pseudo in EBB for a pseudo got hard register which intersects a few reload pseudos live ranges with high register pressure, and assign the original pseudo hard register to the split pseudo. The transformation is undone if the split pseudo did not change his hard register or was not spilled in the assignment pass which is between the passes doing and undoing inheritance/split transformations.
This new functionality of LRA (pseudo range splitting) permits to move a separate caller saves pass into inheritance/split transformation pass. This makes LRA smaller and a bit faster.
2. The patch adds the code for correct update of debug insns for inheritance/split transformations. So I believe that now LRA deals with debug info not worse than reload pass.
3. The patch rewrite the way of dealing with the secondary memory moves in constraint pass of LRA. Previously we generated secondary moves if macro SECONDARY_MEMORY_NEEDED says so. Unfortunately, the macro is usually defined inaccurately. Therefore now we emit secondary moves only if insn constraints are not satisfied (in other words we need reloads for given move). This change permitted to solve last degradations on GCC testsuite for x86-64/x86 in comparison when the reload pass is used.
4. The patch also rewrites code for dealing with secondary memory moves in PPC. PPC port is single one allocating explicitly stack slot for secondary memory of given mode through using macro SECONDARY_MEMORY_NEEDED_RTX. The patch rejects this approach for LRA and uses a pseudo for secondary memory and this pseudo gets memory as in standard mechanism for spilling in LRA. This permits reuse the slots allocated for secondary memory for other spilled pseudo decreasing allocated stack slot size in some case. This change will permit to remove SECONDARY_MEMORY_NEEDED_RTX (as many others) if LRA is in GCC finally.
5. There are other small and insignificant changes in the patch mostly to fix some bugs and testsuite degradations.
The patch was successfully bootstrapped on x86/x86-64, ppc64, and itanium. Arm bootstrap is still going.
* config/rs6000/rs6000.h (SECONDARY_MEMORY_NEEDED_MODE): New macro.
* config/rs6000/rs6000-protos.h (rs6000_secondary_memory_needed_mode): New prototype.
* config/rs6000/rs6000.c (rs6000_emit_move): Rewrite the code for LRA for emitting secondary memory moves based on class of the pseudo denoting the secondary memory. (rs6000_secondary_memory_needed_mode): New function. (rs6000_check_sdmode): Do nothing for LRA.
* config/i386/i386.c (inline_secondary_memory_needed): Switch off an assert for LRA.
* lra-assigns.c (lra_setup_reg_renumber): Add code for printing split pseudos. (assign_candidates_bitmap, assign_candidates, assigned_pseudos): Remove. (spill_for): Add code for dealing with the split pseudos. (assign_by_spills): Ditto.
* lra.c (lra_split_pseudos): New bitmap. (lra): Initialize and finalize lra_split_pseudos. Remove call of lra_save_restore. Always do inheritance/split pass on the first iteration when caller_save_needed.
* lra-constraints.c (lra_secondary_memory): Remove. (get_secondary_mem): Ditto. (get_reload_reg): Make value of output reload pseudo unique. (emit_secondary_memory_move): Rename emit_spill_move. Process subregs. (check_and_process_move): Add new argument. Don't emit secondary memory moves, only report them. Make values of scratch and secondary pseudos unique. (curr_insn_transform): Emit secondary memory moves only if insn does not satisfy all constraints. (MAX_RELOAD_INSNS_NUMBER): Increase it to LRA_MAX_INSN_RELOADS. (lra_contraints_init): Remove code initializing lra_secondary_memory. (usage_insns_check): Remove. (reloads_num, calls_num): New. (struct usage_insns): New. (usage_insns): Change the type. (inherit_reload_reg): Improve formatting. Add more asserts. (need_for_call_save_p, need_for_split_p, choose_split_class): New functions. (split_pseudo): New function. (update_ebb_live_info): Process insns even if EBB contains one BB. (get_live_on_other_edges, get_non_debug_insn): New functions. (temp_bitmap): New bitmap. (add_next_usage_insn): New function. (inherit_in_ebb): Change the prototype. Add code for pseudo range splitting. (lra_inheritance): Call update_ebb_live_info if the changes were made in inherit_in_ebb. (get_pseudo_regno): New function. (remove_inheritance_pseudos): Add code for undoing pseudo live range split and dealing with subregs. Update debug info too. (lra_undo_inheritance): Add code for undoing pseudo live range split. Add printing more debug info.
* Makefile.in (OBJS): Remove lra-saves.o (lra-saves.o): Remove the entry.
Attachment:
nov29.patch
Description: Text document
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |