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