mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-26 20:50:42 +08:00
gcc/ada/ * gcc-interface/decl.c, gcc-interface/gigi.h, gcc-interface/misc.c, gcc-interface/trans.c, gcc-interface/utils.c, gcc-interface/utils2.c: Remove redundant enum from machine_mode. gcc/c-family/ * c-common.c, c-common.h, c-cppbuiltin.c, c-lex.c: Remove redundant enum from machine_mode. gcc/c/ * c-decl.c, c-tree.h, c-typeck.c: Remove redundant enum from machine_mode. gcc/cp/ * constexpr.c: Remove redundant enum from machine_mode. gcc/fortran/ * trans-types.c, trans-types.h: Remove redundant enum from machine_mode. gcc/go/ * go-lang.c: Remove redundant enum from machine_mode. gcc/java/ * builtins.c, java-tree.h, typeck.c: Remove redundant enum from machine_mode. gcc/lto/ * lto-lang.c: Remove redundant enum from machine_mode. gcc/ * addresses.h, alias.c, asan.c, auto-inc-dec.c, bt-load.c, builtins.c, builtins.h, caller-save.c, calls.c, calls.h, cfgexpand.c, cfgloop.h, cfgrtl.c, combine.c, compare-elim.c, config/aarch64/aarch64-builtins.c, config/aarch64/aarch64-protos.h, config/aarch64/aarch64-simd.md, config/aarch64/aarch64.c, config/aarch64/aarch64.h, config/aarch64/aarch64.md, config/alpha/alpha-protos.h, config/alpha/alpha.c, config/arc/arc-protos.h, config/arc/arc.c, config/arc/arc.h, config/arc/predicates.md, config/arm/aarch-common-protos.h, config/arm/aarch-common.c, config/arm/arm-protos.h, config/arm/arm.c, config/arm/arm.h, config/arm/arm.md, config/arm/neon.md, config/arm/thumb2.md, config/avr/avr-log.c, config/avr/avr-protos.h, config/avr/avr.c, config/avr/avr.md, config/bfin/bfin-protos.h, config/bfin/bfin.c, config/c6x/c6x-protos.h, config/c6x/c6x.c, config/c6x/c6x.md, config/cr16/cr16-protos.h, config/cr16/cr16.c, config/cris/cris-protos.h, config/cris/cris.c, config/cris/cris.md, config/darwin-protos.h, config/darwin.c, config/epiphany/epiphany-protos.h, config/epiphany/epiphany.c, config/epiphany/epiphany.md, config/fr30/fr30.c, config/frv/frv-protos.h, config/frv/frv.c, config/frv/predicates.md, config/h8300/h8300-protos.h, config/h8300/h8300.c, config/i386/i386-builtin-types.awk, config/i386/i386-protos.h, config/i386/i386.c, config/i386/i386.md, config/i386/predicates.md, config/i386/sse.md, config/i386/sync.md, config/ia64/ia64-protos.h, config/ia64/ia64.c, config/iq2000/iq2000-protos.h, config/iq2000/iq2000.c, config/iq2000/iq2000.md, config/lm32/lm32-protos.h, config/lm32/lm32.c, config/m32c/m32c-protos.h, config/m32c/m32c.c, config/m32r/m32r-protos.h, config/m32r/m32r.c, config/m68k/m68k-protos.h, config/m68k/m68k.c, config/mcore/mcore-protos.h, config/mcore/mcore.c, config/mcore/mcore.md, config/mep/mep-protos.h, config/mep/mep.c, config/microblaze/microblaze-protos.h, config/microblaze/microblaze.c, config/mips/mips-protos.h, config/mips/mips.c, config/mmix/mmix-protos.h, config/mmix/mmix.c, config/mn10300/mn10300-protos.h, config/mn10300/mn10300.c, config/moxie/moxie.c, config/msp430/msp430-protos.h, config/msp430/msp430.c, config/nds32/nds32-cost.c, config/nds32/nds32-intrinsic.c, config/nds32/nds32-md-auxiliary.c, config/nds32/nds32-protos.h, config/nds32/nds32.c, config/nios2/nios2-protos.h, config/nios2/nios2.c, config/pa/pa-protos.h, config/pa/pa.c, config/pdp11/pdp11-protos.h, config/pdp11/pdp11.c, config/rl78/rl78-protos.h, config/rl78/rl78.c, config/rs6000/altivec.md, config/rs6000/rs6000-c.c, config/rs6000/rs6000-protos.h, config/rs6000/rs6000.c, config/rs6000/rs6000.h, config/rx/rx-protos.h, config/rx/rx.c, config/s390/predicates.md, config/s390/s390-protos.h, config/s390/s390.c, config/s390/s390.h, config/s390/s390.md, config/sh/predicates.md, config/sh/sh-protos.h, config/sh/sh.c, config/sh/sh.md, config/sparc/predicates.md, config/sparc/sparc-protos.h, config/sparc/sparc.c, config/sparc/sparc.md, config/spu/spu-protos.h, config/spu/spu.c, config/stormy16/stormy16-protos.h, config/stormy16/stormy16.c, config/tilegx/tilegx-protos.h, config/tilegx/tilegx.c, config/tilegx/tilegx.md, config/tilepro/tilepro-protos.h, config/tilepro/tilepro.c, config/v850/v850-protos.h, config/v850/v850.c, config/v850/v850.md, config/vax/vax-protos.h, config/vax/vax.c, config/vms/vms-c.c, config/xtensa/xtensa-protos.h, config/xtensa/xtensa.c, coverage.c, cprop.c, cse.c, cselib.c, cselib.h, dbxout.c, ddg.c, df-problems.c, dfp.c, dfp.h, doc/md.texi, doc/rtl.texi, doc/tm.texi, doc/tm.texi.in, dojump.c, dse.c, dwarf2cfi.c, dwarf2out.c, dwarf2out.h, emit-rtl.c, emit-rtl.h, except.c, explow.c, expmed.c, expmed.h, expr.c, expr.h, final.c, fixed-value.c, fixed-value.h, fold-const.c, function.c, function.h, fwprop.c, gcse.c, gengenrtl.c, genmodes.c, genopinit.c, genoutput.c, genpreds.c, genrecog.c, gensupport.c, gimple-ssa-strength-reduction.c, graphite-clast-to-gimple.c, haifa-sched.c, hooks.c, hooks.h, ifcvt.c, internal-fn.c, ira-build.c, ira-color.c, ira-conflicts.c, ira-costs.c, ira-emit.c, ira-int.h, ira-lives.c, ira.c, ira.h, jump.c, langhooks.h, libfuncs.h, lists.c, loop-doloop.c, loop-invariant.c, loop-iv.c, loop-unroll.c, lower-subreg.c, lower-subreg.h, lra-assigns.c, lra-constraints.c, lra-eliminations.c, lra-int.h, lra-lives.c, lra-spills.c, lra.c, lra.h, machmode.h, omp-low.c, optabs.c, optabs.h, output.h, postreload.c, print-tree.c, read-rtl.c, real.c, real.h, recog.c, recog.h, ree.c, reg-stack.c, regcprop.c, reginfo.c, regrename.c, regs.h, reload.c, reload.h, reload1.c, rtl.c, rtl.h, rtlanal.c, rtlhash.c, rtlhooks-def.h, rtlhooks.c, sched-deps.c, sel-sched-dump.c, sel-sched-ir.c, sel-sched-ir.h, sel-sched.c, simplify-rtx.c, stmt.c, stor-layout.c, stor-layout.h, target.def, targhooks.c, targhooks.h, tree-affine.c, tree-call-cdce.c, tree-complex.c, tree-data-ref.c, tree-dfa.c, tree-if-conv.c, tree-inline.c, tree-outof-ssa.c, tree-scalar-evolution.c, tree-ssa-address.c, tree-ssa-ccp.c, tree-ssa-loop-ivopts.c, tree-ssa-loop-ivopts.h, tree-ssa-loop-manip.c, tree-ssa-loop-prefetch.c, tree-ssa-math-opts.c, tree-ssa-reassoc.c, tree-ssa-sccvn.c, tree-streamer-in.c, tree-switch-conversion.c, tree-vect-data-refs.c, tree-vect-generic.c, tree-vect-loop.c, tree-vect-patterns.c, tree-vect-slp.c, tree-vect-stmts.c, tree-vrp.c, tree.c, tree.h, tsan.c, ubsan.c, valtrack.c, var-tracking.c, varasm.c: Remove redundant enum from machine_mode. gcc/ * gengtype.c (main): Treat machine_mode as a scalar typedef. * genmodes.c (emit_insn_modes_h): Hide inline functions if USED_FOR_TARGET. From-SVN: r216834
203 lines
7.8 KiB
C
203 lines
7.8 KiB
C
/* Communication between the Integrated Register Allocator (IRA) and
|
|
the rest of the compiler.
|
|
Copyright (C) 2006-2014 Free Software Foundation, Inc.
|
|
Contributed by Vladimir Makarov <vmakarov@redhat.com>.
|
|
|
|
This file is part of GCC.
|
|
|
|
GCC is free software; you can redistribute it and/or modify it under
|
|
the terms of the GNU General Public License as published by the Free
|
|
Software Foundation; either version 3, or (at your option) any later
|
|
version.
|
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with GCC; see the file COPYING3. If not see
|
|
<http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef GCC_IRA_H
|
|
#define GCC_IRA_H
|
|
|
|
/* True when we use LRA instead of reload pass for the current
|
|
function. */
|
|
extern bool ira_use_lra_p;
|
|
|
|
/* True if we have allocno conflicts. It is false for non-optimized
|
|
mode or when the conflict table is too big. */
|
|
extern bool ira_conflicts_p;
|
|
|
|
struct target_ira
|
|
{
|
|
/* Map: hard register number -> allocno class it belongs to. If the
|
|
corresponding class is NO_REGS, the hard register is not available
|
|
for allocation. */
|
|
enum reg_class x_ira_hard_regno_allocno_class[FIRST_PSEUDO_REGISTER];
|
|
|
|
/* Number of allocno classes. Allocno classes are register classes
|
|
which can be used for allocations of allocnos. */
|
|
int x_ira_allocno_classes_num;
|
|
|
|
/* The array containing allocno classes. Only first
|
|
IRA_ALLOCNO_CLASSES_NUM elements are used for this. */
|
|
enum reg_class x_ira_allocno_classes[N_REG_CLASSES];
|
|
|
|
/* Map of all register classes to corresponding allocno classes
|
|
containing the given class. If given class is not a subset of an
|
|
allocno class, we translate it into the cheapest allocno class. */
|
|
enum reg_class x_ira_allocno_class_translate[N_REG_CLASSES];
|
|
|
|
/* Number of pressure classes. Pressure classes are register
|
|
classes for which we calculate register pressure. */
|
|
int x_ira_pressure_classes_num;
|
|
|
|
/* The array containing pressure classes. Only first
|
|
IRA_PRESSURE_CLASSES_NUM elements are used for this. */
|
|
enum reg_class x_ira_pressure_classes[N_REG_CLASSES];
|
|
|
|
/* Map of all register classes to corresponding pressure classes
|
|
containing the given class. If given class is not a subset of an
|
|
pressure class, we translate it into the cheapest pressure
|
|
class. */
|
|
enum reg_class x_ira_pressure_class_translate[N_REG_CLASSES];
|
|
|
|
/* Biggest pressure register class containing stack registers.
|
|
NO_REGS if there are no stack registers. */
|
|
enum reg_class x_ira_stack_reg_pressure_class;
|
|
|
|
/* Maps: register class x machine mode -> maximal/minimal number of
|
|
hard registers of given class needed to store value of given
|
|
mode. */
|
|
unsigned char x_ira_reg_class_max_nregs[N_REG_CLASSES][MAX_MACHINE_MODE];
|
|
unsigned char x_ira_reg_class_min_nregs[N_REG_CLASSES][MAX_MACHINE_MODE];
|
|
|
|
/* Array analogous to target hook TARGET_MEMORY_MOVE_COST. */
|
|
short x_ira_memory_move_cost[MAX_MACHINE_MODE][N_REG_CLASSES][2];
|
|
|
|
/* Array of number of hard registers of given class which are
|
|
available for the allocation. The order is defined by the
|
|
allocation order. */
|
|
short x_ira_class_hard_regs[N_REG_CLASSES][FIRST_PSEUDO_REGISTER];
|
|
|
|
/* The number of elements of the above array for given register
|
|
class. */
|
|
int x_ira_class_hard_regs_num[N_REG_CLASSES];
|
|
|
|
/* Register class subset relation: TRUE if the first class is a subset
|
|
of the second one considering only hard registers available for the
|
|
allocation. */
|
|
int x_ira_class_subset_p[N_REG_CLASSES][N_REG_CLASSES];
|
|
|
|
/* The biggest class inside of intersection of the two classes (that
|
|
is calculated taking only hard registers available for allocation
|
|
into account. If the both classes contain no hard registers
|
|
available for allocation, the value is calculated with taking all
|
|
hard-registers including fixed ones into account. */
|
|
enum reg_class x_ira_reg_class_subset[N_REG_CLASSES][N_REG_CLASSES];
|
|
|
|
/* True if the two classes (that is calculated taking only hard
|
|
registers available for allocation into account; are
|
|
intersected. */
|
|
bool x_ira_reg_classes_intersect_p[N_REG_CLASSES][N_REG_CLASSES];
|
|
|
|
/* If class CL has a single allocatable register of mode M,
|
|
index [CL][M] gives the number of that register, otherwise it is -1. */
|
|
short x_ira_class_singleton[N_REG_CLASSES][MAX_MACHINE_MODE];
|
|
|
|
/* Function specific hard registers can not be used for the register
|
|
allocation. */
|
|
HARD_REG_SET x_ira_no_alloc_regs;
|
|
};
|
|
|
|
extern struct target_ira default_target_ira;
|
|
#if SWITCHABLE_TARGET
|
|
extern struct target_ira *this_target_ira;
|
|
#else
|
|
#define this_target_ira (&default_target_ira)
|
|
#endif
|
|
|
|
#define ira_hard_regno_allocno_class \
|
|
(this_target_ira->x_ira_hard_regno_allocno_class)
|
|
#define ira_allocno_classes_num \
|
|
(this_target_ira->x_ira_allocno_classes_num)
|
|
#define ira_allocno_classes \
|
|
(this_target_ira->x_ira_allocno_classes)
|
|
#define ira_allocno_class_translate \
|
|
(this_target_ira->x_ira_allocno_class_translate)
|
|
#define ira_pressure_classes_num \
|
|
(this_target_ira->x_ira_pressure_classes_num)
|
|
#define ira_pressure_classes \
|
|
(this_target_ira->x_ira_pressure_classes)
|
|
#define ira_pressure_class_translate \
|
|
(this_target_ira->x_ira_pressure_class_translate)
|
|
#define ira_stack_reg_pressure_class \
|
|
(this_target_ira->x_ira_stack_reg_pressure_class)
|
|
#define ira_reg_class_max_nregs \
|
|
(this_target_ira->x_ira_reg_class_max_nregs)
|
|
#define ira_reg_class_min_nregs \
|
|
(this_target_ira->x_ira_reg_class_min_nregs)
|
|
#define ira_memory_move_cost \
|
|
(this_target_ira->x_ira_memory_move_cost)
|
|
#define ira_class_hard_regs \
|
|
(this_target_ira->x_ira_class_hard_regs)
|
|
#define ira_class_hard_regs_num \
|
|
(this_target_ira->x_ira_class_hard_regs_num)
|
|
#define ira_class_subset_p \
|
|
(this_target_ira->x_ira_class_subset_p)
|
|
#define ira_reg_class_subset \
|
|
(this_target_ira->x_ira_reg_class_subset)
|
|
#define ira_reg_classes_intersect_p \
|
|
(this_target_ira->x_ira_reg_classes_intersect_p)
|
|
#define ira_class_singleton \
|
|
(this_target_ira->x_ira_class_singleton)
|
|
#define ira_no_alloc_regs \
|
|
(this_target_ira->x_ira_no_alloc_regs)
|
|
|
|
/* Major structure describing equivalence info for a pseudo. */
|
|
struct ira_reg_equiv_s
|
|
{
|
|
/* True if we can use this equivalence. */
|
|
bool defined_p;
|
|
/* True if the usage of the equivalence is profitable. */
|
|
bool profitable_p;
|
|
/* Equiv. memory, constant, invariant, and initializing insns of
|
|
given pseudo-register or NULL_RTX. */
|
|
rtx memory;
|
|
rtx constant;
|
|
rtx invariant;
|
|
/* Always NULL_RTX if defined_p is false. */
|
|
rtx_insn_list *init_insns;
|
|
};
|
|
|
|
/* The length of the following array. */
|
|
extern int ira_reg_equiv_len;
|
|
|
|
/* Info about equiv. info for each register. */
|
|
extern struct ira_reg_equiv_s *ira_reg_equiv;
|
|
|
|
extern void ira_init_once (void);
|
|
extern void ira_init (void);
|
|
extern void ira_setup_eliminable_regset (void);
|
|
extern rtx ira_eliminate_regs (rtx, machine_mode);
|
|
extern void ira_set_pseudo_classes (bool, FILE *);
|
|
extern void ira_implicitly_set_insn_hard_regs (HARD_REG_SET *);
|
|
extern void ira_expand_reg_equiv (void);
|
|
extern void ira_update_equiv_info_by_shuffle_insn (int, int, rtx_insn *);
|
|
|
|
extern void ira_sort_regnos_for_alter_reg (int *, int, unsigned int *);
|
|
extern void ira_mark_allocation_change (int);
|
|
extern void ira_mark_memory_move_deletion (int, int);
|
|
extern bool ira_reassign_pseudos (int *, int, HARD_REG_SET, HARD_REG_SET *,
|
|
HARD_REG_SET *, bitmap);
|
|
extern rtx ira_reuse_stack_slot (int, unsigned int, unsigned int);
|
|
extern void ira_mark_new_stack_slot (rtx, int, unsigned int);
|
|
extern bool ira_better_spill_reload_regno_p (int *, int *, rtx, rtx, rtx);
|
|
extern bool ira_bad_reload_regno (int, rtx, rtx);
|
|
|
|
extern void ira_adjust_equiv_reg_cost (unsigned, int);
|
|
|
|
#endif /* GCC_IRA_H */
|