118334Speter/* Define per-register tables for data flow info and register allocation. 290075Sobrien Copyright (C) 1987, 1993, 1994, 1995, 1996, 1997, 1998, 3169689Skan 1999, 2000, 2003, 2004 Free Software Foundation, Inc. 418334Speter 590075SobrienThis file is part of GCC. 618334Speter 790075SobrienGCC is free software; you can redistribute it and/or modify it under 890075Sobrienthe terms of the GNU General Public License as published by the Free 990075SobrienSoftware Foundation; either version 2, or (at your option) any later 1090075Sobrienversion. 1118334Speter 1290075SobrienGCC is distributed in the hope that it will be useful, but WITHOUT ANY 1390075SobrienWARRANTY; without even the implied warranty of MERCHANTABILITY or 1490075SobrienFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1590075Sobrienfor more details. 1618334Speter 1718334SpeterYou should have received a copy of the GNU General Public License 1890075Sobrienalong with GCC; see the file COPYING. If not, write to the Free 19169689SkanSoftware Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 20169689Skan02110-1301, USA. */ 2118334Speter 22169689Skan#ifndef GCC_REGS_H 23169689Skan#define GCC_REGS_H 2418334Speter 2550397Sobrien#include "varray.h" 26169689Skan#include "obstack.h" 27117395Skan#include "hard-reg-set.h" 28117395Skan#include "basic-block.h" 2918334Speter 3018334Speter#define REG_BYTES(R) mode_size[(int) GET_MODE (R)] 3118334Speter 3290075Sobrien/* When you only have the mode of a pseudo register before it has a hard 3390075Sobrien register chosen for it, this reports the size of each hard register 3490075Sobrien a pseudo in such a mode would get allocated to. A target may 3590075Sobrien override this. */ 3618334Speter 3790075Sobrien#ifndef REGMODE_NATURAL_SIZE 3890075Sobrien#define REGMODE_NATURAL_SIZE(MODE) UNITS_PER_WORD 3990075Sobrien#endif 4018334Speter 4150397Sobrien#ifndef SMALL_REGISTER_CLASSES 4250397Sobrien#define SMALL_REGISTER_CLASSES 0 4350397Sobrien#endif 4450397Sobrien 4518334Speter/* Maximum register number used in this function, plus one. */ 4618334Speter 4718334Speterextern int max_regno; 4818334Speter 4950397Sobrien/* Register information indexed by register number */ 5090075Sobrientypedef struct reg_info_def 5190075Sobrien{ /* fields set by reg_scan */ 5250397Sobrien int first_uid; /* UID of first insn to use (REG n) */ 5350397Sobrien int last_uid; /* UID of last insn to use (REG n) */ 5450397Sobrien 5590075Sobrien /* fields set by reg_scan & flow_analysis */ 5650397Sobrien int sets; /* # of times (REG n) is set */ 5750397Sobrien 5850397Sobrien /* fields set by flow_analysis */ 5950397Sobrien int refs; /* # of times (REG n) is used or set */ 6090075Sobrien int freq; /* # estimated frequency (REG n) is used or set */ 6150397Sobrien int deaths; /* # of times (REG n) dies */ 6250397Sobrien int live_length; /* # of instructions (REG n) is live */ 6350397Sobrien int calls_crossed; /* # of calls (REG n) is live across */ 64161651Skan int throw_calls_crossed; /* # of calls that may throw (REG n) is live across */ 6550397Sobrien int basic_block; /* # of basic blocks (REG n) is used in */ 6650397Sobrien} reg_info; 6750397Sobrien 68169689Skantypedef reg_info *reg_info_p; 6950397Sobrien 70169689SkanDEF_VEC_P(reg_info_p); 71169689SkanDEF_VEC_ALLOC_P(reg_info_p,heap); 72169689Skan 73169689Skanextern VEC(reg_info_p,heap) *reg_n_info; 74169689Skan 7590075Sobrien/* Indexed by n, gives number of times (REG n) is used or set. */ 7650397Sobrien 77169689Skan#define REG_N_REFS(N) (VEC_index (reg_info_p, reg_n_info, N)->refs) 7818334Speter 7990075Sobrien/* Estimate frequency of references to register N. */ 8090075Sobrien 81169689Skan#define REG_FREQ(N) (VEC_index (reg_info_p, reg_n_info, N)->freq) 8290075Sobrien 83132718Skan/* The weights for each insn varries from 0 to REG_FREQ_BASE. 8490075Sobrien This constant does not need to be high, as in infrequently executed 8590075Sobrien regions we want to count instructions equivalently to optimize for 8690075Sobrien size instead of speed. */ 8790075Sobrien#define REG_FREQ_MAX 1000 8890075Sobrien 8990075Sobrien/* Compute register frequency from the BB frequency. When optimizing for size, 9090075Sobrien or profile driven feedback is available and the function is never executed, 9190075Sobrien frequency is always equivalent. Otherwise rescale the basic block 9290075Sobrien frequency. */ 9390075Sobrien#define REG_FREQ_FROM_BB(bb) (optimize_size \ 9490075Sobrien || (flag_branch_probabilities \ 9590075Sobrien && !ENTRY_BLOCK_PTR->count) \ 9690075Sobrien ? REG_FREQ_MAX \ 9790075Sobrien : ((bb)->frequency * REG_FREQ_MAX / BB_FREQ_MAX)\ 9890075Sobrien ? ((bb)->frequency * REG_FREQ_MAX / BB_FREQ_MAX)\ 9990075Sobrien : 1) 10090075Sobrien 10150397Sobrien/* Indexed by n, gives number of times (REG n) is set. 10250397Sobrien ??? both regscan and flow allocate space for this. We should settle 10350397Sobrien on just copy. */ 10418334Speter 105169689Skan#define REG_N_SETS(N) (VEC_index (reg_info_p, reg_n_info, N)->sets) 10618334Speter 10718334Speter/* Indexed by N, gives number of insns in which register N dies. 10818334Speter Note that if register N is live around loops, it can die 10918334Speter in transitions between basic blocks, and that is not counted here. 11018334Speter So this is only a reliable indicator of how many regions of life there are 11118334Speter for registers that are contained in one basic block. */ 11218334Speter 113169689Skan#define REG_N_DEATHS(N) (VEC_index (reg_info_p, reg_n_info, N)->deaths) 11418334Speter 11518334Speter/* Get the number of consecutive words required to hold pseudo-reg N. */ 11618334Speter 11718334Speter#define PSEUDO_REGNO_SIZE(N) \ 11818334Speter ((GET_MODE_SIZE (PSEUDO_REGNO_MODE (N)) + UNITS_PER_WORD - 1) \ 11918334Speter / UNITS_PER_WORD) 12018334Speter 12118334Speter/* Get the number of bytes required to hold pseudo-reg N. */ 12218334Speter 12318334Speter#define PSEUDO_REGNO_BYTES(N) \ 12418334Speter GET_MODE_SIZE (PSEUDO_REGNO_MODE (N)) 12518334Speter 12618334Speter/* Get the machine mode of pseudo-reg N. */ 12718334Speter 12818334Speter#define PSEUDO_REGNO_MODE(N) GET_MODE (regno_reg_rtx[N]) 12918334Speter 13018334Speter/* Indexed by N, gives number of CALL_INSNS across which (REG n) is live. */ 13118334Speter 132169689Skan#define REG_N_CALLS_CROSSED(N) \ 133169689Skan (VEC_index (reg_info_p, reg_n_info, N)->calls_crossed) 13418334Speter 135161651Skan/* Indexed by N, gives number of CALL_INSNS that may throw, across which 136161651Skan (REG n) is live. */ 137161651Skan 138161651Skan#define REG_N_THROWING_CALLS_CROSSED(N) \ 139169689Skan (VEC_index (reg_info_p, reg_n_info, N)->throw_calls_crossed) 140161651Skan 14118334Speter/* Total number of instructions at which (REG n) is live. 14218334Speter The larger this is, the less priority (REG n) gets for 14318334Speter allocation in a hard register (in global-alloc). 14418334Speter This is set in flow.c and remains valid for the rest of the compilation 14518334Speter of the function; it is used to control register allocation. 14618334Speter 14718334Speter local-alloc.c may alter this number to change the priority. 14818334Speter 14918334Speter Negative values are special. 15018334Speter -1 is used to mark a pseudo reg which has a constant or memory equivalent 15118334Speter and is used infrequently enough that it should not get a hard register. 15218334Speter -2 is used to mark a pseudo reg for a parameter, when a frame pointer 15318334Speter is not required. global.c makes an allocno for this but does 15418334Speter not try to assign a hard register to it. */ 15518334Speter 156169689Skan#define REG_LIVE_LENGTH(N) \ 157169689Skan (VEC_index (reg_info_p, reg_n_info, N)->live_length) 15818334Speter 15918334Speter/* Vector of substitutions of register numbers, 16050397Sobrien used to map pseudo regs into hardware regs. 16118334Speter 16250397Sobrien This can't be folded into reg_n_info without changing all of the 16350397Sobrien machine dependent directories, since the reload functions 16450397Sobrien in the machine dependent files access it. */ 16550397Sobrien 16618334Speterextern short *reg_renumber; 16718334Speter 168132718Skan/* Vector indexed by hardware reg saying whether that reg is ever used. */ 16918334Speter 17018334Speterextern char regs_ever_live[FIRST_PSEUDO_REGISTER]; 17118334Speter 172132718Skan/* Like regs_ever_live, but saying whether reg is set by asm statements. */ 17318334Speter 174132718Skanextern char regs_asm_clobbered[FIRST_PSEUDO_REGISTER]; 17518334Speter 176169689Skan/* Vector indexed by machine mode saying whether there are regs of that mode. */ 177169689Skan 178169689Skanextern bool have_regs_of_mode [MAX_MACHINE_MODE]; 179169689Skan 18018334Speter/* For each hard register, the widest mode object that it can contain. 18118334Speter This will be a MODE_INT mode if the register can hold integers. Otherwise 18218334Speter it will be a MODE_FLOAT or a MODE_CC mode, whichever is valid for the 18318334Speter register. */ 18418334Speter 18518334Speterextern enum machine_mode reg_raw_mode[FIRST_PSEUDO_REGISTER]; 18618334Speter 18718334Speter/* Vector indexed by regno; gives uid of first insn using that reg. 18818334Speter This is computed by reg_scan for use by cse and loop. 18918334Speter It is sometimes adjusted for subsequent changes during loop, 19018334Speter but not adjusted by cse even if cse invalidates it. */ 19118334Speter 192169689Skan#define REGNO_FIRST_UID(N) (VEC_index (reg_info_p, reg_n_info, N)->first_uid) 19318334Speter 19418334Speter/* Vector indexed by regno; gives uid of last insn using that reg. 19518334Speter This is computed by reg_scan for use by cse and loop. 19618334Speter It is sometimes adjusted for subsequent changes during loop, 19718334Speter but not adjusted by cse even if cse invalidates it. 19818334Speter This is harmless since cse won't scan through a loop end. */ 19918334Speter 200169689Skan#define REGNO_LAST_UID(N) (VEC_index (reg_info_p, reg_n_info, N)->last_uid) 20118334Speter 20218334Speter/* List made of EXPR_LIST rtx's which gives pairs of pseudo registers 20318334Speter that have to go in the same hard reg. */ 20418334Speterextern rtx regs_may_share; 20518334Speter 20618334Speter/* Flag set by local-alloc or global-alloc if they decide to allocate 20718334Speter something in a call-clobbered register. */ 20818334Speter 20918334Speterextern int caller_save_needed; 21018334Speter 21118334Speter/* Predicate to decide whether to give a hard reg to a pseudo which 21218334Speter is referenced REFS times and would need to be saved and restored 21318334Speter around a call CALLS times. */ 21418334Speter 21518334Speter#ifndef CALLER_SAVE_PROFITABLE 21618334Speter#define CALLER_SAVE_PROFITABLE(REFS, CALLS) (4 * (CALLS) < (REFS)) 21718334Speter#endif 21818334Speter 21950397Sobrien/* On most machines a register class is likely to be spilled if it 22050397Sobrien only has one register. */ 22150397Sobrien#ifndef CLASS_LIKELY_SPILLED_P 22250397Sobrien#define CLASS_LIKELY_SPILLED_P(CLASS) (reg_class_size[(int) (CLASS)] == 1) 22350397Sobrien#endif 22450397Sobrien 22552284Sobrien/* Select a register mode required for caller save of hard regno REGNO. */ 22652284Sobrien#ifndef HARD_REGNO_CALLER_SAVE_MODE 22790075Sobrien#define HARD_REGNO_CALLER_SAVE_MODE(REGNO, NREGS, MODE) \ 228132718Skan choose_hard_reg_mode (REGNO, NREGS, false) 22952284Sobrien#endif 23018334Speter 231132718Skan/* Registers that get partially clobbered by a call in a given mode. 23252284Sobrien These must not be call used registers. */ 23352284Sobrien#ifndef HARD_REGNO_CALL_PART_CLOBBERED 23452284Sobrien#define HARD_REGNO_CALL_PART_CLOBBERED(REGNO, MODE) 0 23552284Sobrien#endif 23650397Sobrien 23750397Sobrien/* Allocate reg_n_info tables */ 238132718Skanextern void allocate_reg_info (size_t, int, int); 239169689Skan 240169689Skan/* Specify number of hard registers given machine mode occupy. */ 241169689Skanextern unsigned char hard_regno_nregs[FIRST_PSEUDO_REGISTER][MAX_MACHINE_MODE]; 242259268Spfg/* Return an exclusive upper bound on the registers occupied by hard 243259268Spfg register (reg:MODE REGNO). */ 244169689Skan 245259268Spfgstatic inline unsigned int 246259268Spfgend_hard_regno (enum machine_mode mode, unsigned int regno) 247259268Spfg{ 248259268Spfg return regno + hard_regno_nregs[regno][(int) mode]; 249259268Spfg} 250259268Spfg 251259268Spfg/* Likewise for hard register X. */ 252259268Spfg 253259268Spfg#define END_HARD_REGNO(X) end_hard_regno (GET_MODE (X), REGNO (X)) 254259268Spfg 255259268Spfg/* Likewise for hard or pseudo register X. */ 256259268Spfg 257259268Spfg#define END_REGNO(X) (HARD_REGISTER_P (X) ? END_HARD_REGNO (X) : REGNO (X) + 1) 258259268Spfg 259259268Spfg 260259268Spfg/* Return true if (reg:MODE REGNO) includes an element of REGS. */ 261259268Spfg 262259268Spfgstatic inline bool 263259268Spfgoverlaps_hard_reg_set_p (const HARD_REG_SET regs, enum machine_mode mode, 264259268Spfg unsigned int regno) 265259268Spfg{ 266259268Spfg unsigned int end_regno; 267259268Spfg 268259268Spfg if (TEST_HARD_REG_BIT (regs, regno)) 269259268Spfg return true; 270259268Spfg 271259268Spfg end_regno = end_hard_regno (mode, regno); 272259268Spfg while (++regno < end_regno) 273259268Spfg if (TEST_HARD_REG_BIT (regs, regno)) 274259268Spfg return true; 275259268Spfg 276259268Spfg return false; 277259268Spfg} 278259268Spfg 279169689Skan#endif /* GCC_REGS_H */ 280