Annotation of gcc/regclass.c, revision 1.1

1.1     ! root        1: /* Compute register class preferences for pseudo-registers.
        !             2:    Copyright (C) 1987, 1988, 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: 
        !            21: /* This file contains two passes of the compiler: reg_scan and reg_class.
        !            22:    It also defines some tables of information about the hardware registers
        !            23:    and a function init_reg_sets to initialize the tables.  */
        !            24: 
        !            25: #include "config.h"
        !            26: #include "rtl.h"
        !            27: #include "hard-reg-set.h"
        !            28: #include "flags.h"
        !            29: #include "basic-block.h"
        !            30: #include "regs.h"
        !            31: #include "insn-config.h"
        !            32: #include "recog.h"
        !            33: 
        !            34: #ifndef REGISTER_MOVE_COST
        !            35: #define REGISTER_MOVE_COST(x, y) 2
        !            36: #endif
        !            37: 
        !            38: #ifndef MEMORY_MOVE_COST
        !            39: #define MEMORY_MOVE_COST(x) 2
        !            40: #endif
        !            41: 
        !            42: /* Register tables used by many passes.  */
        !            43: 
        !            44: /* Indexed by hard register number, contains 1 for registers
        !            45:    that are fixed use (stack pointer, pc, frame pointer, etc.).
        !            46:    These are the registers that cannot be used to allocate
        !            47:    a pseudo reg whose life does not cross calls.  */
        !            48: 
        !            49: char fixed_regs[FIRST_PSEUDO_REGISTER];
        !            50: 
        !            51: /* Same info as a HARD_REG_SET.  */
        !            52: 
        !            53: HARD_REG_SET fixed_reg_set;
        !            54: 
        !            55: /* Data for initializing the above.  */
        !            56: 
        !            57: static char initial_fixed_regs[] = FIXED_REGISTERS;
        !            58: 
        !            59: /* Indexed by hard register number, contains 1 for registers
        !            60:    that are fixed use or are clobbered by function calls.
        !            61:    These are the registers that cannot be used to allocate
        !            62:    a pseudo reg whose life crosses calls.  */
        !            63: 
        !            64: char call_used_regs[FIRST_PSEUDO_REGISTER];
        !            65: 
        !            66: /* Same info as a HARD_REG_SET.  */
        !            67: 
        !            68: HARD_REG_SET call_used_reg_set;
        !            69: 
        !            70: /* Data for initializing the above.  */
        !            71: 
        !            72: static char initial_call_used_regs[] = CALL_USED_REGISTERS;
        !            73:   
        !            74: /* Indexed by hard register number, contains 1 for registers that are
        !            75:    fixed use -- i.e. in fixed_regs -- or a function value return register
        !            76:    or STRUCT_VALUE_REGNUM or STATIC_CHAIN_REGNUM.  These are the
        !            77:    registers that cannot hold quantities across calls even if we are
        !            78:    willing to save and restore them.  */
        !            79: 
        !            80: char call_fixed_regs[FIRST_PSEUDO_REGISTER];
        !            81: 
        !            82: /* The same info as a HARD_REG_SET.  */
        !            83: 
        !            84: HARD_REG_SET call_fixed_reg_set;
        !            85: 
        !            86: /* Number of non-fixed registers.  */
        !            87: 
        !            88: int n_non_fixed_regs;
        !            89: 
        !            90: /* Indexed by hard register number, contains 1 for registers
        !            91:    that are being used for global register decls.
        !            92:    These must be exempt from ordinary flow analysis
        !            93:    and are also considered fixed.  */
        !            94: 
        !            95: char global_regs[FIRST_PSEUDO_REGISTER];
        !            96:   
        !            97: /* Table of register numbers in the order in which to try to use them.  */
        !            98: #ifdef REG_ALLOC_ORDER
        !            99: int reg_alloc_order[FIRST_PSEUDO_REGISTER] = REG_ALLOC_ORDER;
        !           100: #endif
        !           101: 
        !           102: /* For each reg class, a HARD_REG_SET saying which registers are in it.  */
        !           103: 
        !           104: HARD_REG_SET reg_class_contents[] = REG_CLASS_CONTENTS;
        !           105: 
        !           106: /* For each reg class, number of regs it contains.  */
        !           107: 
        !           108: int reg_class_size[N_REG_CLASSES];
        !           109: 
        !           110: /* For each reg class, table listing all the containing classes.  */
        !           111: 
        !           112: enum reg_class reg_class_superclasses[N_REG_CLASSES][N_REG_CLASSES];
        !           113: 
        !           114: /* For each reg class, table listing all the classes contained in it.  */
        !           115: 
        !           116: enum reg_class reg_class_subclasses[N_REG_CLASSES][N_REG_CLASSES];
        !           117: 
        !           118: /* For each pair of reg classes,
        !           119:    a largest reg class contained in their union.  */
        !           120: 
        !           121: enum reg_class reg_class_subunion[N_REG_CLASSES][N_REG_CLASSES];
        !           122: 
        !           123: /* For each pair of reg classes,
        !           124:    the smallest reg class containing their union.  */
        !           125: 
        !           126: enum reg_class reg_class_superunion[N_REG_CLASSES][N_REG_CLASSES];
        !           127: 
        !           128: /* Array containing all of the register names */
        !           129: 
        !           130: char *reg_names[] = REGISTER_NAMES;
        !           131: 
        !           132: 
        !           133: /* Indexed by n, gives number of times (REG n) is set or clobbered.
        !           134:    This information remains valid for the rest of the compilation
        !           135:    of the current function; it is used to control register allocation.
        !           136: 
        !           137:    This information applies to both hard registers and pseudo registers,
        !           138:    unlike much of the information above.  */
        !           139: 
        !           140: short *reg_n_sets;
        !           141: 
        !           142: /* Function called only once to initialize the above data on reg usage.
        !           143:    Once this is done, various switches may override.  */
        !           144: 
        !           145: void
        !           146: init_reg_sets ()
        !           147: {
        !           148:   register int i, j;
        !           149: 
        !           150:   bcopy (initial_fixed_regs, fixed_regs, sizeof fixed_regs);
        !           151:   bcopy (initial_call_used_regs, call_used_regs, sizeof call_used_regs);
        !           152:   bzero (global_regs, sizeof global_regs);
        !           153: 
        !           154:   /* Compute number of hard regs in each class.  */
        !           155: 
        !           156:   bzero (reg_class_size, sizeof reg_class_size);
        !           157:   for (i = 0; i < N_REG_CLASSES; i++)
        !           158:     for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
        !           159:       if (TEST_HARD_REG_BIT (reg_class_contents[i], j))
        !           160:        reg_class_size[i]++;
        !           161: 
        !           162:   /* Initialize the table of subunions.
        !           163:      reg_class_subunion[I][J] gets the largest-numbered reg-class
        !           164:      that is contained in the union of classes I and J.  */
        !           165: 
        !           166:   for (i = 0; i < N_REG_CLASSES; i++)
        !           167:     {
        !           168:       for (j = 0; j < N_REG_CLASSES; j++)
        !           169:        {
        !           170: #ifdef HARD_REG_SET
        !           171:          register              /* Declare it register if it's a scalar.  */
        !           172: #endif
        !           173:            HARD_REG_SET c;
        !           174:          register int k;
        !           175: 
        !           176:          COPY_HARD_REG_SET (c, reg_class_contents[i]);
        !           177:          IOR_HARD_REG_SET (c, reg_class_contents[j]);
        !           178:          for (k = 0; k < N_REG_CLASSES; k++)
        !           179:            {
        !           180:              GO_IF_HARD_REG_SUBSET (reg_class_contents[k], c,
        !           181:                                     subclass1);
        !           182:              continue;
        !           183: 
        !           184:            subclass1:
        !           185:              /* keep the largest subclass */           /* SPEE 900308 */
        !           186:              GO_IF_HARD_REG_SUBSET (reg_class_contents[k],
        !           187:                                     reg_class_contents[(int) reg_class_subunion[i][j]],
        !           188:                                     subclass2);
        !           189:              reg_class_subunion[i][j] = (enum reg_class) k;
        !           190:            subclass2:
        !           191:              ;
        !           192:            }
        !           193:        }
        !           194:     }
        !           195: 
        !           196:   /* Initialize the table of superunions.
        !           197:      reg_class_superunion[I][J] gets the smallest-numbered reg-class
        !           198:      containing the union of classes I and J.  */
        !           199: 
        !           200:   for (i = 0; i < N_REG_CLASSES; i++)
        !           201:     {
        !           202:       for (j = 0; j < N_REG_CLASSES; j++)
        !           203:        {
        !           204: #ifdef HARD_REG_SET
        !           205:          register              /* Declare it register if it's a scalar.  */
        !           206: #endif
        !           207:            HARD_REG_SET c;
        !           208:          register int k;
        !           209: 
        !           210:          COPY_HARD_REG_SET (c, reg_class_contents[i]);
        !           211:          IOR_HARD_REG_SET (c, reg_class_contents[j]);
        !           212:          for (k = 0; k < N_REG_CLASSES; k++)
        !           213:            GO_IF_HARD_REG_SUBSET (c, reg_class_contents[k], superclass);
        !           214: 
        !           215:        superclass:
        !           216:          reg_class_superunion[i][j] = (enum reg_class) k;
        !           217:        }
        !           218:     }
        !           219: 
        !           220:   /* Initialize the tables of subclasses and superclasses of each reg class.
        !           221:      First clear the whole table, then add the elements as they are found.  */
        !           222: 
        !           223:   for (i = 0; i < N_REG_CLASSES; i++)
        !           224:     {
        !           225:       for (j = 0; j < N_REG_CLASSES; j++)
        !           226:        {
        !           227:          reg_class_superclasses[i][j] = LIM_REG_CLASSES;
        !           228:          reg_class_subclasses[i][j] = LIM_REG_CLASSES;
        !           229:        }
        !           230:     }
        !           231: 
        !           232:   for (i = 0; i < N_REG_CLASSES; i++)
        !           233:     {
        !           234:       if (i == (int) NO_REGS)
        !           235:        continue;
        !           236: 
        !           237:       for (j = i + 1; j < N_REG_CLASSES; j++)
        !           238:        {
        !           239:          enum reg_class *p;
        !           240: 
        !           241:          GO_IF_HARD_REG_SUBSET (reg_class_contents[i], reg_class_contents[j],
        !           242:                                 subclass);
        !           243:          continue;
        !           244:        subclass:
        !           245:          /* Reg class I is a subclass of J.
        !           246:             Add J to the table of superclasses of I.  */
        !           247:          p = &reg_class_superclasses[i][0];
        !           248:          while (*p != LIM_REG_CLASSES) p++;
        !           249:          *p = (enum reg_class) j;
        !           250:          /* Add I to the table of superclasses of J.  */
        !           251:          p = &reg_class_subclasses[j][0];
        !           252:          while (*p != LIM_REG_CLASSES) p++;
        !           253:          *p = (enum reg_class) i;
        !           254:        }
        !           255:     }
        !           256: }
        !           257: 
        !           258: /* After switches have been processed, which perhaps alter
        !           259:    `fixed_regs' and `call_used_regs', convert them to HARD_REG_SETs.  */
        !           260: 
        !           261: void
        !           262: init_reg_sets_1 ()
        !           263: {
        !           264:   register int i;
        !           265: 
        !           266:   /* This macro allows the fixed or call-used registers
        !           267:      to depend on target flags.  */
        !           268: 
        !           269: #ifdef CONDITIONAL_REGISTER_USAGE
        !           270:   CONDITIONAL_REGISTER_USAGE;
        !           271: #endif
        !           272: 
        !           273:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !           274:     if (global_regs[i])
        !           275:       {
        !           276:        if (call_used_regs[i] && ! fixed_regs[i])
        !           277:          warning ("call-clobbered register used for global register variable");
        !           278:        fixed_regs[i] = 1;
        !           279:        /* Prevent saving/restoring of this reg.  */
        !           280:        call_used_regs[i] = 1;
        !           281:       }
        !           282: 
        !           283:   /* Initialize "constant" tables.  */
        !           284: 
        !           285:   CLEAR_HARD_REG_SET (fixed_reg_set);
        !           286:   CLEAR_HARD_REG_SET (call_used_reg_set);
        !           287:   CLEAR_HARD_REG_SET (call_fixed_reg_set);
        !           288: 
        !           289:   bcopy (fixed_regs, call_fixed_regs, sizeof call_fixed_regs);
        !           290: #ifdef STRUCT_VALUE_REGNUM
        !           291:   call_fixed_regs[STRUCT_VALUE_REGNUM] = 1;
        !           292: #endif
        !           293: #ifdef STATIC_CHAIN_REGNUM
        !           294:   call_fixed_regs[STATIC_CHAIN_REGNUM] = 1;
        !           295: #endif
        !           296: 
        !           297:   n_non_fixed_regs = 0;
        !           298: 
        !           299:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !           300:     {
        !           301:       if (FUNCTION_VALUE_REGNO_P (i))
        !           302:        call_fixed_regs[i] = 1;
        !           303:       if (fixed_regs[i])
        !           304:        SET_HARD_REG_BIT (fixed_reg_set, i);
        !           305:       else
        !           306:        n_non_fixed_regs++;
        !           307: 
        !           308:       if (call_used_regs[i])
        !           309:        SET_HARD_REG_BIT (call_used_reg_set, i);
        !           310:       if (call_fixed_regs[i])
        !           311:        SET_HARD_REG_BIT (call_fixed_reg_set, i);
        !           312:     }
        !           313: }
        !           314: 
        !           315: /* Specify the usage characteristics of the register named NAME.
        !           316:    It should be a fixed register if FIXED and a
        !           317:    call-used register if CALL_USED.  */
        !           318: 
        !           319: void
        !           320: fix_register (name, fixed, call_used)
        !           321:      char *name;
        !           322:      int fixed, call_used;
        !           323: {
        !           324:   int i;
        !           325: 
        !           326:   /* Decode the name and update the primary form of
        !           327:      the register info.  */
        !           328: 
        !           329:   for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        !           330:     if (reg_names[i][0] && ! strcmp (reg_names[i], name))
        !           331:       {
        !           332:        fixed_regs[i] = fixed;
        !           333:        call_used_regs[i] = call_used;
        !           334:        break;
        !           335:       }
        !           336: 
        !           337:   if (i == FIRST_PSEUDO_REGISTER)
        !           338:     {
        !           339:       warning ("unknown register name: %s", name);
        !           340:       return;
        !           341:     }
        !           342: }
        !           343: 
        !           344: /* Now the data and code for the `regclass' pass, which happens
        !           345:    just before local-alloc.  */
        !           346: 
        !           347: /* savings[R].savings[CL] is twice the amount saved by putting register R
        !           348:    in class CL.  This data is used within `regclass' and freed
        !           349:    when it is finished.  */
        !           350: 
        !           351: struct savings
        !           352: {
        !           353:   short savings[N_REG_CLASSES];
        !           354:   short memcost;
        !           355:   short nrefs;
        !           356: };
        !           357: 
        !           358: static struct savings *savings;
        !           359: 
        !           360: /* (enum reg_class) prefclass[R] is the preferred class for pseudo number R.
        !           361:    This is available after `regclass' is run.  */
        !           362: 
        !           363: static char *prefclass;
        !           364: 
        !           365: /* preferred_or_nothing[R] is nonzero if we should put pseudo number R
        !           366:    in memory if we can't get its perferred class.
        !           367:    This is available after `regclass' is run.  */
        !           368: 
        !           369: static char *preferred_or_nothing;
        !           370: 
        !           371: /* Record the depth of loops that we are in, 1 for no loops.  */
        !           372: 
        !           373: static int loop_depth;
        !           374: 
        !           375: void reg_class_record ();
        !           376: void record_address_regs ();
        !           377: 
        !           378: 
        !           379: /* Return the reg_class in which pseudo reg number REGNO is best allocated.
        !           380:    This function is sometimes called before the info has been computed.
        !           381:    When that happens, just return GENERAL_REGS, which is innocuous.  */
        !           382: 
        !           383: enum reg_class
        !           384: reg_preferred_class (regno)
        !           385:      int regno;
        !           386: {
        !           387:   if (prefclass == 0)
        !           388:     return GENERAL_REGS;
        !           389:   return (enum reg_class) prefclass[regno];
        !           390: }
        !           391: 
        !           392: int
        !           393: reg_preferred_or_nothing (regno)
        !           394: {
        !           395:   if (prefclass == 0)
        !           396:     return 0;
        !           397:   return preferred_or_nothing[regno];
        !           398: }
        !           399: 
        !           400: /* This prevents dump_flow_info from losing if called
        !           401:    before regclass is run.  */
        !           402: 
        !           403: void
        !           404: regclass_init ()
        !           405: {
        !           406:   prefclass = 0;
        !           407: }
        !           408: 
        !           409: /* This is a pass of the compiler that scans all instructions
        !           410:    and calculates the preferred class for each pseudo-register.
        !           411:    This information can be accessed later by calling `reg_preferred_class'.
        !           412:    This pass comes just before local register allocation.  */
        !           413: 
        !           414: void
        !           415: regclass (f, nregs)
        !           416:      rtx f;
        !           417:      int nregs;
        !           418: {
        !           419: #ifdef REGISTER_CONSTRAINTS
        !           420:   register rtx insn;
        !           421:   register int i;
        !           422: 
        !           423:   init_recog ();
        !           424: 
        !           425:   /* Zero out our accumulation of the cost of each class for each reg.  */
        !           426: 
        !           427:   savings = (struct savings *) alloca (nregs * sizeof (struct savings));
        !           428:   bzero (savings, nregs * sizeof (struct savings));
        !           429: 
        !           430:   loop_depth = 1;
        !           431: 
        !           432:   /* Scan the instructions and record each time it would
        !           433:      save code to put a certain register in a certain class.  */
        !           434: 
        !           435:   for (insn = f; insn; insn = NEXT_INSN (insn))
        !           436:     {
        !           437:       if (GET_CODE (insn) == NOTE
        !           438:          && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG)
        !           439:        loop_depth++;
        !           440:       else if (GET_CODE (insn) == NOTE
        !           441:               && NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_END)
        !           442:        loop_depth--;
        !           443:       else if ((GET_CODE (insn) == INSN
        !           444:                && GET_CODE (PATTERN (insn)) != USE
        !           445:                && GET_CODE (PATTERN (insn)) != CLOBBER
        !           446:                && GET_CODE (PATTERN (insn)) != ASM_INPUT)
        !           447:               || (GET_CODE (insn) == JUMP_INSN
        !           448:                   && GET_CODE (PATTERN (insn)) != ADDR_VEC
        !           449:                   && GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
        !           450:               || GET_CODE (insn) == CALL_INSN)
        !           451:        {
        !           452:          if (GET_CODE (insn) == INSN && asm_noperands (PATTERN (insn)) >= 0)
        !           453:            {
        !           454:              int noperands = asm_noperands (PATTERN (insn));
        !           455:              /* We don't use alloca because alloca would not free
        !           456:                 any of the space until this function returns.  */
        !           457:              rtx *operands = (rtx *) oballoc (noperands * sizeof (rtx));
        !           458:              char **constraints
        !           459:                = (char **) oballoc (noperands * sizeof (char *));
        !           460: 
        !           461:              decode_asm_operands (PATTERN (insn), operands, 0, constraints, 0);
        !           462: 
        !           463:              for (i = noperands - 1; i >= 0; i--)
        !           464:                reg_class_record (operands[i], i, constraints);
        !           465: 
        !           466:              obfree (operands);
        !           467:            }
        !           468:          else
        !           469:            {
        !           470:              int insn_code_number = recog_memoized (insn);
        !           471:              rtx set = single_set (insn);
        !           472: 
        !           473:              insn_extract (insn);
        !           474: 
        !           475:              for (i = insn_n_operands[insn_code_number] - 1; i >= 0; i--)
        !           476:                reg_class_record (recog_operand[i], i,
        !           477:                                  insn_operand_constraint[insn_code_number]);
        !           478: 
        !           479:              /* If this insn loads a parameter from its stack slot,
        !           480:                 then it represents a savings, rather than a cost,
        !           481:                 if the parameter is stored in memory.  Record this fact.  */
        !           482:              if (set != 0 && GET_CODE (SET_DEST (set)) == REG
        !           483:                  && GET_CODE (SET_SRC (set)) == MEM)
        !           484:                {
        !           485:                  rtx note = find_reg_note (insn, REG_EQUIV, 0);
        !           486:                  if (note != 0 && GET_CODE (XEXP (note, 0)) == MEM)
        !           487:                    savings[REGNO (SET_DEST (set))].memcost
        !           488:                      -= (MEMORY_MOVE_COST (GET_MODE (SET_DEST (set)))
        !           489:                          * loop_depth);
        !           490:                }
        !           491:              
        !           492:              /* Improve handling of two-address insns such as
        !           493:                 (set X (ashift CONST Y)) where CONST must be made to match X.
        !           494:                 Change it into two insns: (set X CONST)  (set X (ashift X Y)).
        !           495:                 If we left this for reloading, it would probably get three
        !           496:                 insns because X and Y might go in the same place.
        !           497:                 This prevents X and Y from receiving the same hard reg.
        !           498: 
        !           499:                 We can only do this if the modes of operands 0 and 1 (which
        !           500:                 might not be the same) are tieable.  */
        !           501: 
        !           502:              if (optimize
        !           503:                  && insn_n_operands[insn_code_number] >= 3
        !           504:                  && insn_operand_constraint[insn_code_number][1][0] == '0'
        !           505:                  && insn_operand_constraint[insn_code_number][1][1] == 0
        !           506:                  && CONSTANT_P (recog_operand[1])
        !           507:                  && ! rtx_equal_p (recog_operand[0], recog_operand[1])
        !           508:                  && ! rtx_equal_p (recog_operand[0], recog_operand[2])
        !           509:                  && GET_CODE (recog_operand[0]) == REG
        !           510:                  && MODES_TIEABLE_P (GET_MODE (recog_operand[0]),
        !           511:                                      insn_operand_mode[insn_code_number][1]))
        !           512:                {
        !           513:                  rtx previnsn = prev_real_insn (insn);
        !           514:                  rtx dest
        !           515:                    = gen_lowpart (insn_operand_mode[insn_code_number][1],
        !           516:                                   recog_operand[0]);
        !           517:                  rtx newinsn
        !           518:                    = emit_insn_before (gen_move_insn (dest, recog_operand[1]),
        !           519:                                        insn);
        !           520: 
        !           521:                  /* If this insn was the start of a basic block,
        !           522:                     include the new insn in that block.  */
        !           523:                  if (previnsn == 0 || GET_CODE (previnsn) == JUMP_INSN)
        !           524:                    {
        !           525:                      int b;
        !           526:                      for (b = 0; b < n_basic_blocks; b++)
        !           527:                        if (insn == basic_block_head[b])
        !           528:                          basic_block_head[b] = newinsn;
        !           529:                    }
        !           530: 
        !           531:                  /* This makes one more setting of new insns's destination. */
        !           532:                  reg_n_sets[REGNO (recog_operand[0])]++;
        !           533: 
        !           534:                  *recog_operand_loc[1] = recog_operand[0];
        !           535:                  for (i = insn_n_dups[insn_code_number] - 1; i >= 0; i--)
        !           536:                    if (recog_dup_num[i] == 1)
        !           537:                      *recog_dup_loc[i] = recog_operand[0];
        !           538:                }
        !           539:            }
        !           540:        }
        !           541:     }
        !           542: 
        !           543:   /* Now for each register look at how desirable each class is
        !           544:      and find which class is preferred.  Store that in `prefclass[REGNO]'.  */
        !           545:     
        !           546:   prefclass = (char *) oballoc (nregs);
        !           547:     
        !           548:   preferred_or_nothing = (char *) oballoc (nregs);
        !           549: 
        !           550:   for (i = FIRST_PSEUDO_REGISTER; i < nregs; i++)
        !           551:     {
        !           552:       register int best_savings = 0;
        !           553:       enum reg_class best = ALL_REGS;
        !           554: 
        !           555:       /* This is an enum reg_class, but we call it an int
        !           556:         to save lots of casts.  */
        !           557:       register int class;
        !           558:       register struct savings *p = &savings[i];
        !           559: 
        !           560:       for (class = (int) ALL_REGS - 1; class > 0; class--)
        !           561:        {
        !           562:          if (p->savings[class] > best_savings)
        !           563:            {
        !           564:              best_savings = p->savings[class];
        !           565:              best = (enum reg_class) class;
        !           566:            }
        !           567:          else if (p->savings[class] == best_savings)
        !           568:            {
        !           569:              best = reg_class_subunion[(int)best][class];
        !           570:            }
        !           571:        }
        !           572: 
        !           573: #if 0
        !           574:       /* Note that best_savings is twice number of places something
        !           575:         is saved.  */
        !           576:       if ((best_savings - p->savings[(int) GENERAL_REGS]) * 5 < reg_n_refs[i])
        !           577:        prefclass[i] = (int) GENERAL_REGS;
        !           578:       else
        !           579:        prefclass[i] = (int) best;
        !           580: #else
        !           581:       /* We cast to (int) because (char) hits bugs in some compilers.  */
        !           582:       prefclass[i] = (int) best;
        !           583: #endif
        !           584: 
        !           585:       /* reg_n_refs + p->memcost measures the cost of putting in memory.
        !           586:         If a GENERAL_REG is no better, don't even try for one.
        !           587:         Since savings and memcost are 2 * number of refs,
        !           588:         this effectively counts each memory operand not needing reloading
        !           589:         as costing 1/2 of a reload insn.  */
        !           590:       if (reg_n_refs != 0)
        !           591:        preferred_or_nothing[i]
        !           592:          = ((best_savings - p->savings[(int) GENERAL_REGS])
        !           593:             >= p->nrefs + p->memcost);
        !           594:     }
        !           595: #endif /* REGISTER_CONSTRAINTS */
        !           596: }
        !           597: 
        !           598: #ifdef REGISTER_CONSTRAINTS
        !           599: 
        !           600: /* Scan an operand OP for register class preferences.
        !           601:    OPNO is the operand number, and CONSTRAINTS is the constraint
        !           602:    vector for the insn.
        !           603: 
        !           604:    Record the preferred register classes from the constraint for OP
        !           605:    if OP is a register.  If OP is a memory reference, record suitable
        !           606:    preferences for registers used in the address.  */
        !           607: 
        !           608: void
        !           609: reg_class_record (op, opno, constraints)
        !           610:      rtx op;
        !           611:      int opno;
        !           612:      char **constraints;
        !           613: {
        !           614:   char *constraint = constraints[opno];
        !           615:   register char *p;
        !           616:   register enum reg_class class = NO_REGS;
        !           617:   char *next = 0;
        !           618:   int memok = 0;
        !           619:   int double_cost = 0;
        !           620: 
        !           621:   if (op == 0)
        !           622:     return;
        !           623: 
        !           624:   while (1)
        !           625:     {
        !           626:       if (GET_CODE (op) == SUBREG)
        !           627:        op = SUBREG_REG (op);
        !           628:       else break;
        !           629:     }
        !           630: 
        !           631:   /* Memory reference: scan the address.  */
        !           632: 
        !           633:   if (GET_CODE (op) == MEM)
        !           634:     record_address_regs (XEXP (op, 0), 2, 0);
        !           635: 
        !           636:   if (GET_CODE (op) != REG)
        !           637:     {
        !           638:       /* If the constraint says the operand is supposed to BE an address,
        !           639:         scan it as one.  */
        !           640: 
        !           641:       if (constraint != 0 && constraint[0] == 'p')
        !           642:        record_address_regs (op, 2, 0);
        !           643:       return;
        !           644:     }
        !           645: 
        !           646:   /* Operand is a register: examine the constraint for specified classes.  */
        !           647: 
        !           648:   for (p = constraint; *p || next; p++)
        !           649:     {
        !           650:       enum reg_class new_class = NO_REGS;
        !           651: 
        !           652:       if (*p == 0)
        !           653:        {
        !           654:          p = next;
        !           655:          next = 0;
        !           656:        }
        !           657:       switch (*p)
        !           658:        {
        !           659:        case '=':
        !           660:        case '?':
        !           661:        case '#':
        !           662:        case '&':
        !           663:        case '!':
        !           664:        case '%':
        !           665:        case 'E':
        !           666:        case 'F':
        !           667:        case 'G':
        !           668:        case 'H':
        !           669:        case 'i':
        !           670:        case 'n':
        !           671:        case 's':
        !           672:        case 'p':
        !           673:        case ',':
        !           674:        case 'I':
        !           675:        case 'J':
        !           676:        case 'K':
        !           677:        case 'L':
        !           678:        case 'M':
        !           679:        case 'N':
        !           680:        case 'O':
        !           681:        case 'P':
        !           682: #ifdef EXTRA_CONSTRAINT
        !           683:        case 'Q':
        !           684:        case 'R':
        !           685:        case 'S':
        !           686:        case 'T':
        !           687:        case 'U':
        !           688: #endif
        !           689:        case 'V':
        !           690:        case 'X':
        !           691:          break;
        !           692: 
        !           693:        case '+':
        !           694:          /* An input-output operand is twice as costly if it loses.  */
        !           695:          double_cost = 1;
        !           696:          break;
        !           697: 
        !           698:        case 'm':
        !           699:        case 'o':
        !           700:          memok = 1;
        !           701:          break;
        !           702: 
        !           703:          /* * means ignore following letter
        !           704:             when choosing register preferences.  */
        !           705:        case '*':
        !           706:          p++;
        !           707:          break;
        !           708: 
        !           709:        case 'g':
        !           710:        case 'r':
        !           711:          new_class = GENERAL_REGS;
        !           712:          break;
        !           713: 
        !           714:        case '0':
        !           715:        case '1':
        !           716:        case '2':
        !           717:        case '3':
        !           718:        case '4':
        !           719:          /* If constraint says "match another operand",
        !           720:             use that operand's constraint to choose preferences.  */
        !           721:          if (*p - '0' < opno)
        !           722:            {
        !           723:              opno = *p - '0';
        !           724:              next = constraints[opno];
        !           725:            }
        !           726:          break;
        !           727: 
        !           728:        default:
        !           729:          new_class = REG_CLASS_FROM_LETTER (*p);
        !           730:          break;
        !           731:        }
        !           732: 
        !           733:       /* If this object can fit into the class requested, compute the subunion
        !           734:         of the requested class and classes found so far.  */
        !           735:       if (CLASS_MAX_NREGS (new_class, GET_MODE (op))
        !           736:          <= reg_class_size[(int) new_class])
        !           737:        class = reg_class_subunion[(int) class][(int) new_class];
        !           738:     }
        !           739: 
        !           740:   {
        !           741:     register int i;
        !           742:     register struct savings *pp;
        !           743:     register enum reg_class class1;
        !           744:     int cost = 2 * (1 + double_cost) * loop_depth;
        !           745:     pp = &savings[REGNO (op)];
        !           746: 
        !           747:     /* Increment the savings for this reg
        !           748:        for each class contained in the one the constraint asks for.  */
        !           749: 
        !           750:     if (class != NO_REGS && class != ALL_REGS)
        !           751:       {
        !           752:        int extracost;
        !           753: 
        !           754:        pp->savings[(int) class] += cost;
        !           755:        for (i = 0; ; i++)
        !           756:          {
        !           757:            class1 = reg_class_subclasses[(int)class][i];
        !           758:            if (class1 == LIM_REG_CLASSES)
        !           759:              break;
        !           760:            pp->savings[(int) class1] += cost;
        !           761:          }
        !           762:        /* If it's slow to move data between this class and GENERAL_REGS,
        !           763:           record that fact.  */
        !           764:        extracost = (REGISTER_MOVE_COST (class, GENERAL_REGS) - 2) * loop_depth;
        !           765:        if (extracost > 0)
        !           766:          {
        !           767:            /* Check that this class and GENERAL_REGS don't overlap.
        !           768:               REGISTER_MOVE_COST is meaningless if there is overlap.  */
        !           769:            HARD_REG_SET temp;
        !           770:            COMPL_HARD_REG_SET (temp, reg_class_contents[(int) class]);
        !           771:            GO_IF_HARD_REG_SUBSET (reg_class_contents[(int) GENERAL_REGS],
        !           772:                                   temp, label1);
        !           773:            /* Overlap.  */
        !           774:            goto label2;
        !           775: 
        !           776:          label1: /* No overlap.  */
        !           777:            /* Charge this extra cost to GENERAL_REGS
        !           778:               and all its subclasses (none of which overlap this class).  */
        !           779:            extracost = extracost * cost / (2 * loop_depth);
        !           780:            pp->savings[(int) GENERAL_REGS] -= extracost;
        !           781:            for (i = 0; ; i++)
        !           782:              {
        !           783:                class1 = reg_class_subclasses[(int)GENERAL_REGS][i];
        !           784:                if (class1 == LIM_REG_CLASSES)
        !           785:                  break;
        !           786:                pp->savings[(int) class1] -= extracost;
        !           787:              }
        !           788: 
        !           789:          label2: ;
        !           790:          }
        !           791:       }
        !           792: 
        !           793:     if (! memok)
        !           794:       pp->memcost += (MEMORY_MOVE_COST (GET_MODE (op)) * (1 + double_cost)
        !           795:                      - 1) * loop_depth;
        !           796:     pp->nrefs += loop_depth;
        !           797:   }
        !           798: }
        !           799: 
        !           800: /* Record the pseudo registers we must reload into hard registers
        !           801:    in a subexpression of a memory address, X.
        !           802:    BCOST is the cost if X is a register and it fails to be in BASE_REG_CLASS.
        !           803:    ICOST is the cost if it fails to be in INDEX_REG_CLASS. */
        !           804: 
        !           805: void
        !           806: record_address_regs (x, bcost, icost)
        !           807:      rtx x;
        !           808:      int bcost, icost;
        !           809: {
        !           810:   register enum rtx_code code = GET_CODE (x);
        !           811: 
        !           812:   switch (code)
        !           813:     {
        !           814:     case CONST_INT:
        !           815:     case CONST:
        !           816:     case CC0:
        !           817:     case PC:
        !           818:     case SYMBOL_REF:
        !           819:     case LABEL_REF:
        !           820:       return;
        !           821: 
        !           822:     case PLUS:
        !           823:       /* When we have an address that is a sum,
        !           824:         we must determine whether registers are "base" or "index" regs.
        !           825:         If there is a sum of two registers, we must choose one to be
        !           826:         the "base".  Luckily, we can use the REGNO_POINTER_FLAG
        !           827:         to make a good choice most of the time.  */
        !           828:       {
        !           829:        rtx arg0 = XEXP (x, 0);
        !           830:        rtx arg1 = XEXP (x, 1);
        !           831:        register enum rtx_code code0 = GET_CODE (arg0);
        !           832:        register enum rtx_code code1 = GET_CODE (arg1);
        !           833:        int icost0 = 0;
        !           834:        int icost1 = 0;
        !           835:        int suppress1 = 0;
        !           836:        int suppress0 = 0;
        !           837: 
        !           838:        /* Look inside subregs.  */
        !           839:        while (code0 == SUBREG)
        !           840:          arg0 = SUBREG_REG (arg0), code0 = GET_CODE (arg0);
        !           841:        while (code1 == SUBREG)
        !           842:          arg1 = SUBREG_REG (arg1), code1 = GET_CODE (arg1);
        !           843: 
        !           844:        if (code0 == MULT || code1 == MEM)
        !           845:          icost0 = 2;
        !           846:        else if (code1 == MULT || code0 == MEM)
        !           847:          icost1 = 2;
        !           848:        else if (code0 == CONST_INT)
        !           849:          suppress0 = 1;
        !           850:        else if (code1 == CONST_INT)
        !           851:          suppress1 = 1;
        !           852:        else if (code0 == REG && code1 == REG)
        !           853:          {
        !           854:            if (REGNO_POINTER_FLAG (REGNO (arg0)))
        !           855:              icost1 = 2;
        !           856:            else if (REGNO_POINTER_FLAG (REGNO (arg1)))
        !           857:              icost0 = 2;
        !           858:            else
        !           859:              icost0 = icost1 = 1;
        !           860:          }
        !           861:        else if (code0 == REG)
        !           862:          {
        !           863:            if (code1 == PLUS
        !           864:                && ! REGNO_POINTER_FLAG (REGNO (arg0)))
        !           865:              icost0 = 2;
        !           866:            else
        !           867:              REGNO_POINTER_FLAG (REGNO (arg0)) = 1;
        !           868:          }
        !           869:        else if (code1 == REG)
        !           870:          {
        !           871:            if (code0 == PLUS
        !           872:                && ! REGNO_POINTER_FLAG (REGNO (arg1)))
        !           873:              icost1 = 2;
        !           874:            else
        !           875:              REGNO_POINTER_FLAG (REGNO (arg1)) = 1;
        !           876:          }
        !           877: 
        !           878:        /* ICOST0 determines whether we are treating operand 0
        !           879:           as a base register or as an index register.
        !           880:           SUPPRESS0 nonzero means it isn't a register at all.
        !           881:           ICOST1 and SUPPRESS1 are likewise for operand 1.  */
        !           882: 
        !           883:        if (! suppress0)
        !           884:          record_address_regs (arg0, 2 - icost0, icost0);
        !           885:        if (! suppress1)
        !           886:          record_address_regs (arg1, 2 - icost1, icost1);
        !           887:       }
        !           888:       break;
        !           889: 
        !           890:     case POST_INC:
        !           891:     case PRE_INC:
        !           892:     case POST_DEC:
        !           893:     case PRE_DEC:
        !           894:       /* Double the importance of a pseudo register that is incremented
        !           895:         or decremented, since it would take two extra insns
        !           896:         if it ends up in the wrong place.  */
        !           897:       record_address_regs (XEXP (x, 0), 2 * bcost, 2 * icost);
        !           898:       break;
        !           899: 
        !           900:     case REG:
        !           901:       {
        !           902:        register struct savings *pp;
        !           903:        register enum reg_class class, class1;
        !           904:        pp = &savings[REGNO (x)];
        !           905:        pp->nrefs += loop_depth;
        !           906: 
        !           907:        /* We have an address (or part of one) that is just one register.  */
        !           908: 
        !           909:        /* Record BCOST worth of savings for classes contained
        !           910:           in BASE_REG_CLASS.  */
        !           911: 
        !           912:        class = BASE_REG_CLASS;
        !           913:        if (class != NO_REGS && class != ALL_REGS)
        !           914:          {
        !           915:            register int i;
        !           916:            pp->savings[(int) class] += bcost * loop_depth;
        !           917:            for (i = 0; ; i++)
        !           918:              {
        !           919:                class1 = reg_class_subclasses[(int)class][i];
        !           920:                if (class1 == LIM_REG_CLASSES)
        !           921:                  break;
        !           922:                pp->savings[(int) class1] += bcost * loop_depth;
        !           923:              }
        !           924:          }
        !           925: 
        !           926:        /* Record ICOST worth of savings for classes contained
        !           927:           in INDEX_REG_CLASS.  */
        !           928: 
        !           929:        class = INDEX_REG_CLASS;
        !           930:        if (icost != 0 && class != NO_REGS && class != ALL_REGS)
        !           931:          {
        !           932:            register int i;
        !           933:            pp->savings[(int) class] += icost * loop_depth;
        !           934:            for (i = 0; ; i++)
        !           935:              {
        !           936:                class1 = reg_class_subclasses[(int)class][i];
        !           937:                if (class1 == LIM_REG_CLASSES)
        !           938:                  break;
        !           939:                pp->savings[(int) class1] += icost * loop_depth;
        !           940:              }
        !           941:          }
        !           942:       }
        !           943:       break;
        !           944: 
        !           945:     default:
        !           946:       {
        !           947:        register char *fmt = GET_RTX_FORMAT (code);
        !           948:        register int i;
        !           949:        for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
        !           950:          if (fmt[i] == 'e')
        !           951:            record_address_regs (XEXP (x, i), bcost, icost);
        !           952:       }
        !           953:     }
        !           954: }
        !           955: #endif /* REGISTER_CONSTRAINTS */
        !           956: 
        !           957: /* This is the `regscan' pass of the compiler, run just before cse
        !           958:    and again just before loop.
        !           959: 
        !           960:    It finds the first and last use of each pseudo-register
        !           961:    and records them in the vectors regno_first_uid, regno_last_uid
        !           962:    and counts the number of sets in the vector reg_n_sets.
        !           963: 
        !           964:    REPEAT is nonzero the second time this is called.  */
        !           965: 
        !           966: /* Indexed by pseudo register number, gives uid of first insn using the reg
        !           967:    (as of the time reg_scan is called).  */
        !           968: 
        !           969: short *regno_first_uid;
        !           970: 
        !           971: /* Indexed by pseudo register number, gives uid of last insn using the reg
        !           972:    (as of the time reg_scan is called).  */
        !           973: 
        !           974: short *regno_last_uid;
        !           975: 
        !           976: /* Record the number of registers we used when we allocated the above two
        !           977:    tables.  If we are called again with more than this, we must re-allocate
        !           978:    the tables.  */
        !           979: 
        !           980: static int highest_regno_in_uid_map;
        !           981: 
        !           982: /* Maximum number of parallel sets and clobbers in any insn in this fn.
        !           983:    Always at least 3, since the combiner could put that many togetherm
        !           984:    and we want this to remain correct for all the remaining passes.  */
        !           985: 
        !           986: int max_parallel;
        !           987: 
        !           988: void reg_scan_mark_refs ();
        !           989: 
        !           990: void
        !           991: reg_scan (f, nregs, repeat)
        !           992:      rtx f;
        !           993:      int nregs;
        !           994:      int repeat;
        !           995: {
        !           996:   register rtx insn;
        !           997: 
        !           998:   if (!repeat || nregs > highest_regno_in_uid_map)
        !           999:     {
        !          1000:       /* Leave some spare space in case more regs are allocated.  */
        !          1001:       highest_regno_in_uid_map = nregs + nregs / 20;
        !          1002:       regno_first_uid
        !          1003:        = (short *) oballoc (highest_regno_in_uid_map * sizeof (short));
        !          1004:       regno_last_uid
        !          1005:        = (short *) oballoc (highest_regno_in_uid_map * sizeof (short));
        !          1006:       reg_n_sets
        !          1007:        = (short *) oballoc (highest_regno_in_uid_map * sizeof (short));
        !          1008:     }
        !          1009: 
        !          1010:   bzero (regno_first_uid, highest_regno_in_uid_map * sizeof (short));
        !          1011:   bzero (regno_last_uid, highest_regno_in_uid_map * sizeof (short));
        !          1012:   bzero (reg_n_sets, highest_regno_in_uid_map * sizeof (short));
        !          1013: 
        !          1014:   max_parallel = 3;
        !          1015: 
        !          1016:   for (insn = f; insn; insn = NEXT_INSN (insn))
        !          1017:     if (GET_CODE (insn) == INSN
        !          1018:        || GET_CODE (insn) == CALL_INSN
        !          1019:        || GET_CODE (insn) == JUMP_INSN)
        !          1020:       {
        !          1021:        if (GET_CODE (PATTERN (insn)) == PARALLEL
        !          1022:            && XVECLEN (PATTERN (insn), 0) > max_parallel)
        !          1023:          max_parallel = XVECLEN (PATTERN (insn), 0);
        !          1024:        reg_scan_mark_refs (PATTERN (insn), INSN_UID (insn));
        !          1025:       }
        !          1026: }
        !          1027: 
        !          1028: void
        !          1029: reg_scan_mark_refs (x, uid)
        !          1030:      rtx x;
        !          1031:      int uid;
        !          1032: {
        !          1033:   register enum rtx_code code = GET_CODE (x);
        !          1034:   register rtx dest;
        !          1035: 
        !          1036:   switch (code)
        !          1037:     {
        !          1038:     case CONST_INT:
        !          1039:     case CONST:
        !          1040:     case CONST_DOUBLE:
        !          1041:     case CC0:
        !          1042:     case PC:
        !          1043:     case SYMBOL_REF:
        !          1044:     case LABEL_REF:
        !          1045:     case ADDR_VEC:
        !          1046:     case ADDR_DIFF_VEC:
        !          1047:       return;
        !          1048: 
        !          1049:     case REG:
        !          1050:       {
        !          1051:        register int regno = REGNO (x);
        !          1052: 
        !          1053:        regno_last_uid[regno] = uid;
        !          1054:        if (regno_first_uid[regno] == 0)
        !          1055:          regno_first_uid[regno] = uid;
        !          1056:       }
        !          1057:       break;
        !          1058: 
        !          1059:     case SET:
        !          1060:       /* Count a set of the destination if it is a register.  */
        !          1061:       for (dest = SET_DEST (x);
        !          1062:           GET_CODE (dest) == SUBREG || GET_CODE (dest) == STRICT_LOW_PART
        !          1063:           || GET_CODE (dest) == ZERO_EXTEND;
        !          1064:           dest = XEXP (dest, 0))
        !          1065:        ;
        !          1066: 
        !          1067:       if (GET_CODE (dest) == REG)
        !          1068:        reg_n_sets[REGNO (dest)]++;
        !          1069: 
        !          1070:       /* ... fall through ... */
        !          1071: 
        !          1072:     default:
        !          1073:       {
        !          1074:        register char *fmt = GET_RTX_FORMAT (code);
        !          1075:        register int i;
        !          1076:        for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
        !          1077:          {
        !          1078:            if (fmt[i] == 'e')
        !          1079:              reg_scan_mark_refs (XEXP (x, i), uid);
        !          1080:            else if (fmt[i] == 'E' && XVEC (x, i) != 0)
        !          1081:              {
        !          1082:                register int j;
        !          1083:                for (j = XVECLEN (x, i) - 1; j >= 0; j--)
        !          1084:                  reg_scan_mark_refs (XVECEXP (x, i, j), uid);            
        !          1085:              }
        !          1086:          }
        !          1087:       }
        !          1088:     }
        !          1089: }
        !          1090: 
        !          1091: /* Return nonzero if C1 is a subset of C2, i.e., if every register in C1
        !          1092:    is also in C2.  */
        !          1093: 
        !          1094: int
        !          1095: reg_class_subset_p (c1, c2)
        !          1096:      register enum reg_class c1;
        !          1097:      register enum reg_class c2;
        !          1098: {
        !          1099:   if (c1 == c2) return 1;
        !          1100: 
        !          1101:   if (c2 == ALL_REGS)
        !          1102:   win:
        !          1103:     return 1;
        !          1104:   GO_IF_HARD_REG_SUBSET (reg_class_contents[(int)c1],
        !          1105:                         reg_class_contents[(int)c2],
        !          1106:                         win);
        !          1107:   return 0;
        !          1108: }
        !          1109: 
        !          1110: /* Return nonzero if there is a register that is in both C1 and C2.  */
        !          1111: 
        !          1112: int
        !          1113: reg_classes_intersect_p (c1, c2)
        !          1114:      register enum reg_class c1;
        !          1115:      register enum reg_class c2;
        !          1116: {
        !          1117: #ifdef HARD_REG_SET
        !          1118:   register
        !          1119: #endif
        !          1120:     HARD_REG_SET c;
        !          1121: 
        !          1122:   if (c1 == c2) return 1;
        !          1123: 
        !          1124:   if (c1 == ALL_REGS || c2 == ALL_REGS)
        !          1125:     return 1;
        !          1126: 
        !          1127:   COPY_HARD_REG_SET (c, reg_class_contents[(int) c1]);
        !          1128:   AND_HARD_REG_SET (c, reg_class_contents[(int) c2]);
        !          1129: 
        !          1130:   GO_IF_HARD_REG_SUBSET (c, reg_class_contents[(int) NO_REGS], lose);
        !          1131:   return 1;
        !          1132: 
        !          1133:  lose:
        !          1134:   return 0;
        !          1135: }
        !          1136: 

unix.superglobalmegacorp.com

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