[lra] patch rewriting inheritance and speeding LRA up

Vladimir Makarov vmakarov@redhat.com
Mon Nov 7 21:35:00 GMT 2011


The following patch contains a major rewriting inheritance code to 
permit inheritance from non-reload insns.  That is important for targets 
(like x86-64) permitting memory in general insns and as a result 
considerably decreasing code size.  Now LRA can do the following 
transformations:

      p <- ...             i <- ...
      ...                  p <- i    (new insn)
      ...             =>
<- ... p ... <- ... i ...
    or
      ...                  i <- p    (new insn)
<- ... p ... <- ... i ...
      ...             =>
<- ... p ... <- ... i ...

where p is spilled original pseudo and i is a new inheritance pseudo.

The patch fixes inheritance code to update debug info and liveness info 
correctly.

The patch also speeds LRA up by doing mem-mem coalescing and creating 
live ranges less frequently only when it is really needed.

And finally the patch fixes some ppc regressions for altivec and vmx.   
It required to modify address transformations and generations of reloads 
involving the secondary memory.  The problem imho is in a bad practice 
in rs6000 machine descriptions when there are contradictory requirements 
of predicate and constraints.  For example,

(define_insn "*altivec_mov<mode>"
   [(set (match_operand:VM2 0 "nonimmediate_operand" "=Z,v,v,*o,*r,*r,v,v")
         (match_operand:VM2 1 "input_operand" "v,Z,v,r,o,r,j,W"))]
   "VECTOR_MEM_ALTIVEC_P (<MODE>mode)
&& (register_operand (operands[0], <MODE>mode)
        || register_operand (operands[1], <MODE>mode))"

Predicates requires only base or base+index addressing and constraints 
'o' permits offsetable addressing.

The patch was successfully bootstrapped on x86/x86-64 and power7 and was 
committed as r181117.

2011-11-07  Vladimir Makarov <vmakarov@redhat.com>

     * lra-int.h (lra_coalesce, lra_spill): Change the prototype.
     (lra_need_for_spills_p): New prototype.

     * lra.c (lra): Move coalesce after assignment.  Call
     lra_need_for_spills_p before lra_create_live_ranges.  Don't check
     return value of lra_spill.

     * lra-spills.c (spill_pseudos, lra_spill): Don't return value.
     (lra_need_for_spills_p): New function.
     (lra_hard_reg_substitution): Use max_reg_num instead of regs_num.

     * lra-coalesce.c (lra_coalesce): Move side_effects call lower.
     Check restore_regno.  Process only insns containing coalesced
     pseudos for pseudo substitution.  Return flag that some moves were
     coalesced.

     * lra-constraints.c (get_final_hard_regno): Move up.
     (get_op_class, emit_secondary_memory_move): New functions.
     (check_and_process_move): Add code for quick validity check base
     on move cost.  Use emit_secondary_memory_move.
     (process_address): Don't use transformation base + disp => base +
     new index.
     (curr_reload_insn_check, reload_insn_check, reload_insn): Rename
     correspondingly to curr_usage_insns_check, usage_insns_check, and
     usage_insns.
     (substitute_pseudo): New function.
     (inherit_reload_reg): Change prototype.  Add code to reject
     generated reload inheritance insns.  Change the generated
     inheritance code for permitting not only move insns in the
     inheritance.  Use substitute_pseudo.
     (live_pseudos): New bitmap.
     (update_ebb_live_info): New function.
     (struct to_inherit): New.
     (to_inherit): New array.
     (to_inherit_num): New static variable.
     (add_to_inherit): New function.
     (inherit_in_ebb): Add code for inheritance in non-reload
     functions.  Process debug insns too.
     (lra_inheritance): Initialize/finalize check_only_pseudos and
     live_pseudos.  Call update_ebb_live_info.
     (remove_inheritance_pseudos): Process debug insns too.  Add
     special cases to undo the inheritance transformations.

-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: inheritance.patch
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20111107/18698034/attachment.ksh>


More information about the Gcc-patches mailing list