[PATCH] Variable Expansion in unroller + Register Pressure Utility

Revital Eres ERES@il.ibm.com
Sun Sep 12 15:54:00 GMT 2004


Hello,

Following my message (http://gcc.gnu.org/ml/gcc/2004-08/msg01050.html)
regarding variable expansion in the unroller;
I enclose the patch for this optimization which also contains
register pressure utility.

As before; the code includes part of Zdenek Dvorak patch for 
splitting induction variables because it is not in mainline yet.
(http://gcc.gnu.org/ml/gcc-patches/2004-06/msg02425.html)

The heuristics which we adopted to estimate the register pressure
within a set of basic blocks is as follows:
Use the life analysis to record the maximal number of live registers 
needed
in each class and compare it to the number of registers available. 
The mapping from registers to their classes is written by Vladimir N. 
Makarov.

Bootstrapped (with -funroll-all-loops) & regression tests on POWER4. 

Comments are welcome,
Revital


2004-09-12  Zdenek Dvorak <rakdver@atrey.karlin.mff.cuni.cz>
            Vladimir N. Makarov <vmakarov@redhat.com>
               Revital Eres  <eres@il.ibm.com>


        * Makefile.in (loop-unroll.o): Add HASHTAB_H, RECOG_H and
        VARRAY_H dependency.
        * basic-block.h: (PROP_REG_PRESSURE): New definition for the 
purpose
        of the register pressure pass in flow.c.
        (struct reorder_block_def): Add copy_number field.
        * cfgloop.h (biv_p): Declare.
        * cfgloopmanip.c (duplicate_loop_to_header_edge): Set copy_number.
        * common.opt (fsplit-ivs-in-unroller, 
fvariable-expansion-in-unroller):
        New flags.
        * loop-unroll.c: Include hashtab.h, recog.h and varray.h.
        (struct iv_to_split, struct var_to_expand, struct opt_info): New 
types.
        (analyze_insns_in_loop, opt_info_start_duplication,
        apply_opt_in_copies, free_opt_info, analyze_insn_to_expand_var,
        referenced_in_one_insn_in_loop_p, analyze_iv_to_split_insn,
        expand_var_during_unrolling, insert_var_expansion_initialization,
        combine_var_copies_in_loop_exit, release_var_copies,
        calculate_register_pressure): New functions.
        (peel_loop_completely, unroll_loop_constant_iterations,
        unroll_loop_runtime_iterations, peel_loop_simple, 
unroll_loop_stupid):
        Use them.
     * flow.c: (available_class_regs_num, live_regclass, max_pressure):
        New static data-structures to support register pressure 
estimation.
        (GET_REG_CLASS): New definition.
        (update_life_info, init_propagate_block_info, mark_set_1,
        attempt_auto_inc, mark_used_reg, calculate_global_regs_live,
        propagate_one_insn): Use them to update register pressure.
        (set_available_class_regs_num, regno_regclass_change_pressure,
        regno_increase_pressure, regno_decrease_pressure,
        init_reg_pressure_analyze, reset_live_regclass,
        estimate_register_pressure, analyze_register_pressure): New 
functions
        to estimate register pressure.
        * loop-iv.c (biv_p): New function.
        * doc/invoke.texi: (fsplit-ivs-in-unroller,
        fvariable-expansion-in-unroller): Document.
 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: diff_12_9
Type: application/octet-stream
Size: 53079 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20040912/32dca3ef/attachment.obj>


More information about the Gcc-patches mailing list