Annotation of GNUtools/cc/loop.h, revision 1.1

1.1     ! root        1: /* Loop optimization definitions for GNU C-Compiler
        !             2:    Copyright (C) 1991 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU CC.
        !             5: 
        !             6: GNU CC is free software; you can redistribute it and/or modify
        !             7: it under the terms of the GNU General Public License as published by
        !             8: the Free Software Foundation; either version 2, or (at your option)
        !             9: any later version.
        !            10: 
        !            11: GNU CC is distributed in the hope that it will be useful,
        !            12: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: GNU General Public License for more details.
        !            15: 
        !            16: You should have received a copy of the GNU General Public License
        !            17: along with GNU CC; see the file COPYING.  If not, write to
        !            18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            19: 
        !            20: /* Get the luid of an insn.  Catch the error of trying to reference the LUID
        !            21:    of an insn added during loop, since these don't have LUIDs.  */
        !            22: 
        !            23: #define INSN_LUID(INSN)                        \
        !            24:   (INSN_UID (INSN) < max_uid_for_loop ? uid_luid[INSN_UID (INSN)] \
        !            25:    : (abort (), -1))
        !            26: 
        !            27: /* A "basic induction variable" or biv is a pseudo reg that is set
        !            28:    (within this loop) only by incrementing or decrementing it.  */
        !            29: /* A "general induction variable" or giv is a pseudo reg whose
        !            30:    value is a linear function of a biv.  */
        !            31: 
        !            32: /* Bivs are recognized by `basic_induction_var';
        !            33:    Givs by `general_induct_var'.  */
        !            34: 
        !            35: /* An enum for the two different types of givs, those that are used
        !            36:    as memory addresses and those that are calculated into registers.  */
        !            37: enum g_types { DEST_ADDR, DEST_REG };
        !            38: 
        !            39: /* A `struct induction' is created for every instruction that sets
        !            40:    an induction variable (either a biv or a giv).  */
        !            41: 
        !            42: struct induction
        !            43: {
        !            44:   rtx insn;                    /* The insn that sets a biv or giv */
        !            45:   rtx new_reg;                 /* New register, containing strength reduced
        !            46:                                   version of this giv.  */
        !            47:   rtx src_reg;                 /* Biv from which this giv is computed.
        !            48:                                   (If this is a biv, then this is the biv.) */
        !            49:   enum g_types giv_type;       /* Indicate whether DEST_ADDR or DEST_REG */
        !            50:   rtx dest_reg;                        /* Destination register for insn: this is the
        !            51:                                   register which was the biv or giv.
        !            52:                                   For a biv, this equals src_reg.
        !            53:                                   For a DEST_ADDR type giv, this is 0.  */
        !            54:   rtx *location;               /* Place in the insn where this giv occurs.
        !            55:                                   If GIV_TYPE is DEST_REG, this is 0.  */
        !            56:   enum machine_mode mode;      /* The mode of this biv or giv */
        !            57:   enum machine_mode mem_mode;  /* For DEST_ADDR, mode of the memory object. */
        !            58:   rtx mult_val;                        /* Multiplicative factor for src_reg.  */
        !            59:   rtx add_val;                 /* Additive constant for that product.  */
        !            60:   int benefit;                 /* Gain from eliminating this insn.  */
        !            61:   rtx final_value;             /* If the giv is used outside the loop, and its
        !            62:                                   final value could be calculated, it is put
        !            63:                                   here, and the giv is made replaceable.  Set
        !            64:                                   the giv to this value before the loop.  */
        !            65:   unsigned replaceable : 1;    /* 1 if we can substitute the strength-reduced
        !            66:                                   variable for the original variable.
        !            67:                                   0 means they must be kept separate and the
        !            68:                                   new one must be copied into the old pseudo
        !            69:                                   reg each time the old one is set.  */
        !            70:   unsigned not_replaceable : 1;        /* Used to prevent duplicating work.  This is
        !            71:                                   1 if we know that the giv definitely can
        !            72:                                   not be made replaceable, in which case we
        !            73:                                   don't bother checking the variable again
        !            74:                                   even if further info is available.
        !            75:                                   Both this and the above can be zero.  */
        !            76:   unsigned ignore : 1;         /* 1 prohibits further processing of giv */
        !            77:   unsigned always_computable : 1;/* 1 if this set occurs each iteration */
        !            78:   unsigned maybe_multiple : 1; /* Only used for a biv and  1 if this biv
        !            79:                                   update may be done multiple times per
        !            80:                                   iteration. */
        !            81:   unsigned cant_derive : 1;    /* For giv's, 1 if this giv cannot derive
        !            82:                                   another giv.  This occurs in many cases
        !            83:                                   where a giv's lifetime spans an update to
        !            84:                                   a biv. */
        !            85:   unsigned combined_with : 1;  /* 1 if this giv has been combined with.  It
        !            86:                                   then cannot combine with any other giv.  */
        !            87:   unsigned maybe_dead : 1;     /* 1 if this giv might be dead.  In that case,
        !            88:                                   we won't use it to eliminate a biv, it
        !            89:                                   would probably lose. */
        !            90:   int lifetime;                        /* Length of life of this giv */
        !            91:   int times_used;              /* # times this giv is used. */
        !            92:   rtx derive_adjustment;       /* If nonzero, is an adjustment to be
        !            93:                                   subtracted from add_val when this giv
        !            94:                                   derives another.  This occurs when the
        !            95:                                   giv spans a biv update by incrementation. */
        !            96:   struct induction *next_iv;   /* For givs, links together all givs that are
        !            97:                                   based on the same biv.  For bivs, links
        !            98:                                   together all biv entries that refer to the
        !            99:                                   same biv register.  */
        !           100:   struct induction *same;      /* If this giv has been combined with another
        !           101:                                   giv, this points to the base giv.  The base
        !           102:                                   giv will have COMBINED_WITH non-zero.  */
        !           103:   HOST_WIDE_INT const_adjust;  /* Used by loop unrolling, when an address giv
        !           104:                                   is split, and a constant is eliminated from
        !           105:                                   the address, the -constant is stored here
        !           106:                                   for later use. */
        !           107: };
        !           108: 
        !           109: /* A `struct iv_class' is created for each biv.  */
        !           110: 
        !           111: struct iv_class {
        !           112:   int regno;                   /* Pseudo reg which is the biv.  */
        !           113:   int biv_count;               /* Number of insns setting this reg.  */
        !           114:   struct induction *biv;       /* List of all insns that set this reg.  */
        !           115:   int giv_count;               /* Number of DEST_REG givs computed from this
        !           116:                                   biv.  The resulting count is only used in
        !           117:                                   check_dbra_loop.  */
        !           118:   struct induction *giv;       /* List of all insns that compute a giv
        !           119:                                   from this reg.  */
        !           120:   int total_benefit;           /* Sum of BENEFITs of all those givs */
        !           121:   rtx initial_value;           /* Value of reg at loop start */
        !           122:   rtx initial_test;            /* Test performed on BIV before loop */
        !           123:   struct iv_class *next;       /* Links all class structures together */
        !           124:   rtx init_insn;               /* insn which initializes biv, 0 if none. */
        !           125:   rtx init_set;                        /* SET of INIT_INSN, if any. */
        !           126:   unsigned incremented : 1;    /* 1 if somewhere incremented/decremented */
        !           127:   unsigned eliminable : 1;     /* 1 if plausible candidate for elimination. */
        !           128:   unsigned nonneg : 1;         /* 1 if we added a REG_NONNEG note for this. */
        !           129:   unsigned reversed : 1;       /* 1 if we reversed the loop that this
        !           130:                                   biv controls. */
        !           131: };
        !           132: 
        !           133: /* Definitions used by the basic induction variable discovery code.  */
        !           134: enum iv_mode { UNKNOWN_INDUCT, BASIC_INDUCT, NOT_BASIC_INDUCT,
        !           135:                 GENERAL_INDUCT };
        !           136: 
        !           137: /* Variables declared in loop.c, but also needed in unroll.c.  */
        !           138: 
        !           139: extern int *uid_luid;
        !           140: extern int max_uid_for_loop;
        !           141: extern int *uid_loop_num;
        !           142: extern int *loop_outer_loop;
        !           143: extern rtx *loop_number_exit_labels;
        !           144: extern unsigned HOST_WIDE_INT loop_n_iterations;
        !           145: extern int max_reg_before_loop;
        !           146: 
        !           147: extern FILE *loop_dump_stream;
        !           148: 
        !           149: extern enum iv_mode *reg_iv_type;
        !           150: extern struct induction **reg_iv_info;
        !           151: extern struct iv_class **reg_biv_class;
        !           152: extern struct iv_class *loop_iv_list;
        !           153: 
        !           154: /* Forward declarations for non-static functions declared in loop.c and
        !           155:    unroll.c.  */
        !           156: int invariant_p PROTO((rtx));
        !           157: rtx get_condition_for_loop PROTO((rtx));
        !           158: void emit_iv_add_mult PROTO((rtx, rtx, rtx, rtx, rtx));
        !           159: 
        !           160: /* Forward declarations for non-static functions declared in stmt.c.  */
        !           161: void find_loop_tree_blocks PROTO((void));
        !           162: void unroll_block_trees PROTO((void));
        !           163: 
        !           164: void unroll_loop PROTO((rtx, int, rtx, rtx, int));
        !           165: rtx biv_total_increment PROTO((struct iv_class *, rtx, rtx));
        !           166: unsigned HOST_WIDE_INT loop_iterations PROTO((rtx, rtx));
        !           167: rtx final_biv_value PROTO((struct iv_class *, rtx, rtx));
        !           168: rtx final_giv_value PROTO((struct induction *, rtx, rtx));
        !           169: void emit_unrolled_add PROTO((rtx, rtx, rtx));

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.