lower-subreg.c: New file.
gcc/: * lower-subreg.c: New file. * rtl.def (CONCATN): Define. * passes.c (init_optimization_passes): Add pass_lower_subreg and pass_lower_subreg2. * emit-rtl.c (update_reg_offset): New static function, broken out of gen_rtx_REG_offset. (gen_rtx_REG_offset): Call update_reg_offset. (gen_reg_rtx_offset): New function. * regclass.c: Revert patch of 2006-03-05, restoring reg_scan_update. (clear_reg_info_regno): New function. * dwarf2out.c (concatn_loc_descriptor): New static function. (loc_descriptor): Handle CONCATN. * common.opt (fsplit_wide_types): New option. * opts.c (decode_options): Set flag_split_wide_types when optimizing. * timevar.def (TV_LOWER_SUBREG): Define. * rtl.h (gen_reg_rtx_offset): Declare. (reg_scan_update): Declare. * regs.h (clear_reg_info_regno): Declare. * tree-pass.h (pass_lower_subreg): Declare. (pass_lower_subreg2): Declare. * doc/invoke.texi (Option Summary): List -fno-split-wide-types. (Optimize Options): Add -fsplit-wide-types to -O1 list. Document -fsplit-wide-types. * doc/rtl.texi (Regs and Memory): Document concat and concatn. * Makefile.in (OBJS-common): Add lower-subreg.o. (lower-subreg.o): New target. gcc/testsuite/: * gcc.dg/lower-subreg-1.c (test): New test. From-SVN: r121453
This commit is contained in:
parent
15c48c45f5
commit
e53a16e75f
18 changed files with 1358 additions and 33 deletions
|
@ -1,3 +1,35 @@
|
|||
2007-01-31 Richard Henderson <rth@redhat.com>
|
||||
Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* lower-subreg.c: New file.
|
||||
* rtl.def (CONCATN): Define.
|
||||
* passes.c (init_optimization_passes): Add pass_lower_subreg and
|
||||
pass_lower_subreg2.
|
||||
* emit-rtl.c (update_reg_offset): New static function, broken out
|
||||
of gen_rtx_REG_offset.
|
||||
(gen_rtx_REG_offset): Call update_reg_offset.
|
||||
(gen_reg_rtx_offset): New function.
|
||||
* regclass.c: Revert patch of 2006-03-05, restoring
|
||||
reg_scan_update.
|
||||
(clear_reg_info_regno): New function.
|
||||
* dwarf2out.c (concatn_loc_descriptor): New static function.
|
||||
(loc_descriptor): Handle CONCATN.
|
||||
* common.opt (fsplit_wide_types): New option.
|
||||
* opts.c (decode_options): Set flag_split_wide_types when
|
||||
optimizing.
|
||||
* timevar.def (TV_LOWER_SUBREG): Define.
|
||||
* rtl.h (gen_reg_rtx_offset): Declare.
|
||||
(reg_scan_update): Declare.
|
||||
* regs.h (clear_reg_info_regno): Declare.
|
||||
* tree-pass.h (pass_lower_subreg): Declare.
|
||||
(pass_lower_subreg2): Declare.
|
||||
* doc/invoke.texi (Option Summary): List -fno-split-wide-types.
|
||||
(Optimize Options): Add -fsplit-wide-types to -O1 list. Document
|
||||
-fsplit-wide-types.
|
||||
* doc/rtl.texi (Regs and Memory): Document concat and concatn.
|
||||
* Makefile.in (OBJS-common): Add lower-subreg.o.
|
||||
(lower-subreg.o): New target.
|
||||
|
||||
2007-01-31 Kazu Hirata <kazu@codesourcery.com>
|
||||
|
||||
* config/sh/sh.h (HAVE_SECONDARY_RELOADS): Remove.
|
||||
|
|
|
@ -1023,6 +1023,7 @@ OBJS-common = \
|
|||
loop-iv.o \
|
||||
loop-unroll.o \
|
||||
loop-unswitch.o \
|
||||
lower-subreg.o \
|
||||
mode-switching.o \
|
||||
modulo-sched.o \
|
||||
omp-low.o \
|
||||
|
@ -2772,6 +2773,10 @@ hooks.o: hooks.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(HOOKS_H)
|
|||
pretty-print.o: $(CONFIG_H) $(SYSTEM_H) coretypes.h intl.h $(PRETTY_PRINT_H) \
|
||||
$(TREE_H)
|
||||
errors.o : errors.c $(CONFIG_H) $(SYSTEM_H) errors.h $(BCONFIG_H)
|
||||
lower-subreg.o : lower-subreg.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
|
||||
$(MACHMODE_H) $(TM_H) $(RTL_H) $(TM_P_H) $(TIMEVAR_H) $(FLAGS_H) \
|
||||
insn-config.h $(BASIC_BLOCK_H) $(RECOG_H) $(OBSTACK_H) bitmap.h \
|
||||
$(EXPR_H) $(REGS_H) tree-pass.h
|
||||
|
||||
$(out_object_file): $(out_file) $(CONFIG_H) coretypes.h $(TM_H) $(TREE_H) \
|
||||
$(RTL_H) $(REGS_H) hard-reg-set.h insn-config.h conditions.h \
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
; Options for the language- and target-independent parts of the compiler.
|
||||
|
||||
; Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
; Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
|
||||
;
|
||||
; This file is part of GCC.
|
||||
;
|
||||
|
@ -861,6 +861,10 @@ fsplit-ivs-in-unroller
|
|||
Common Report Var(flag_split_ivs_in_unroller) Init(1)
|
||||
Split lifetimes of induction variables when loops are unrolled
|
||||
|
||||
fsplit-wide-types
|
||||
Common Report Var(flag_split_wide_types)
|
||||
Split wide types into independent registers
|
||||
|
||||
fvariable-expansion-in-unroller
|
||||
Common Report Var(flag_variable_expansion_in_unroller)
|
||||
Apply variable expansion when loops are unrolled
|
||||
|
|
|
@ -340,7 +340,7 @@ Objective-C and Objective-C++ Dialects}.
|
|||
-fsched2-use-superblocks @gol
|
||||
-fsched2-use-traces -fsee -freschedule-modulo-scheduled-loops @gol
|
||||
-fsection-anchors -fsignaling-nans -fsingle-precision-constant @gol
|
||||
-fstack-protector -fstack-protector-all @gol
|
||||
-fno-split-wide-types -fstack-protector -fstack-protector-all @gol
|
||||
-fstrict-aliasing -fstrict-overflow -ftracer -fthread-jumps @gol
|
||||
-funroll-all-loops -funroll-loops -fpeel-loops @gol
|
||||
-fsplit-ivs-in-unroller -funswitch-loops @gol
|
||||
|
@ -4600,6 +4600,7 @@ compilation time.
|
|||
-fcprop-registers @gol
|
||||
-fif-conversion @gol
|
||||
-fif-conversion2 @gol
|
||||
-fsplit-wide-types @gol
|
||||
-ftree-ccp @gol
|
||||
-ftree-dce @gol
|
||||
-ftree-dominator-opts @gol
|
||||
|
@ -4938,6 +4939,16 @@ the condition is known to be true or false.
|
|||
|
||||
Enabled at levels @option{-O2}, @option{-O3}, @option{-Os}.
|
||||
|
||||
@item -fsplit-wide-types
|
||||
@opindex -fsplit-wide-types
|
||||
When using a type that occupies multiple registers, such as @code{long
|
||||
long} on a 32-bit system, split the registers apart and allocate them
|
||||
independently. This normally generates better code for those types,
|
||||
but may make debugging more difficult.
|
||||
|
||||
Enabled at levels @option{-O}, @option{-O2}, @option{-O3},
|
||||
@option{-Os}.
|
||||
|
||||
@item -fcse-follow-jumps
|
||||
@opindex fcse-follow-jumps
|
||||
In common subexpression elimination, scan through jump instructions
|
||||
|
|
|
@ -1774,6 +1774,19 @@ is always @code{Pmode}. If there are any @code{addressof}
|
|||
expressions left in the function after CSE, @var{reg} is forced into the
|
||||
stack and the @code{addressof} expression is replaced with a @code{plus}
|
||||
expression for the address of its stack slot.
|
||||
|
||||
@findex concat
|
||||
@item (concat@var{m} @var{rtx} @var{rtx})
|
||||
This RTX represents the concatenation of two other RTXs. This is used
|
||||
for complex values. It should only appear in the RTL attached to
|
||||
declarations and during RTL generation. It should not appear in the
|
||||
ordinary insn chain.
|
||||
|
||||
@findex concatn
|
||||
@item (concatn@var{m} [@var{rtx} ...])
|
||||
This RTX represents the concatenation of all the @var{rtx} to make a
|
||||
single value. Like @code{concat}, this should only appear in
|
||||
declarations, and not in the insn chain.
|
||||
@end table
|
||||
|
||||
@node Arithmetic
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Output Dwarf2 format symbol table information from GCC.
|
||||
Copyright (C) 1992, 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
||||
2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
|
||||
Contributed by Gary Funck (gary@intrepid.com).
|
||||
Derived from DWARF 1 implementation of Ron Guilmette (rfg@monkeys.com).
|
||||
Extensively modified by Jason Merrill (jason@cygnus.com).
|
||||
|
@ -9043,6 +9043,32 @@ concat_loc_descriptor (rtx x0, rtx x1)
|
|||
return cc_loc_result;
|
||||
}
|
||||
|
||||
/* Return a descriptor that describes the concatenation of N
|
||||
locations. */
|
||||
|
||||
static dw_loc_descr_ref
|
||||
concatn_loc_descriptor (rtx concatn)
|
||||
{
|
||||
unsigned int i;
|
||||
dw_loc_descr_ref cc_loc_result = NULL;
|
||||
unsigned int n = XVECLEN (concatn, 0);
|
||||
|
||||
for (i = 0; i < n; ++i)
|
||||
{
|
||||
dw_loc_descr_ref ref;
|
||||
rtx x = XVECEXP (concatn, 0, i);
|
||||
|
||||
ref = loc_descriptor (x);
|
||||
if (ref == NULL)
|
||||
return NULL;
|
||||
|
||||
add_loc_descr (&cc_loc_result, ref);
|
||||
add_loc_descr_op_piece (&cc_loc_result, GET_MODE_SIZE (GET_MODE (x)));
|
||||
}
|
||||
|
||||
return cc_loc_result;
|
||||
}
|
||||
|
||||
/* Output a proper Dwarf location descriptor for a variable or parameter
|
||||
which is either allocated in a register or in a memory location. For a
|
||||
register, we just generate an OP_REG and the register number. For a
|
||||
|
@ -9080,6 +9106,10 @@ loc_descriptor (rtx rtl)
|
|||
loc_result = concat_loc_descriptor (XEXP (rtl, 0), XEXP (rtl, 1));
|
||||
break;
|
||||
|
||||
case CONCATN:
|
||||
loc_result = concatn_loc_descriptor (rtl);
|
||||
break;
|
||||
|
||||
case VAR_LOCATION:
|
||||
/* Single part. */
|
||||
if (GET_CODE (XEXP (rtl, 1)) != PARALLEL)
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Emit RTL for the GCC expander.
|
||||
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
||||
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
|
||||
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -812,13 +812,12 @@ gen_reg_rtx (enum machine_mode mode)
|
|||
return val;
|
||||
}
|
||||
|
||||
/* Generate a register with same attributes as REG, but offsetted by OFFSET.
|
||||
/* Update NEW with the same attributes as REG, but offsetted by OFFSET.
|
||||
Do the big endian correction if needed. */
|
||||
|
||||
rtx
|
||||
gen_rtx_REG_offset (rtx reg, enum machine_mode mode, unsigned int regno, int offset)
|
||||
static void
|
||||
update_reg_offset (rtx new, rtx reg, int offset)
|
||||
{
|
||||
rtx new = gen_rtx_REG (mode, regno);
|
||||
tree decl;
|
||||
HOST_WIDE_INT var_size;
|
||||
|
||||
|
@ -860,7 +859,7 @@ gen_rtx_REG_offset (rtx reg, enum machine_mode mode, unsigned int regno, int off
|
|||
if ((BYTES_BIG_ENDIAN || WORDS_BIG_ENDIAN)
|
||||
&& decl != NULL
|
||||
&& offset > 0
|
||||
&& GET_MODE_SIZE (GET_MODE (reg)) > GET_MODE_SIZE (mode)
|
||||
&& GET_MODE_SIZE (GET_MODE (reg)) > GET_MODE_SIZE (GET_MODE (new))
|
||||
&& ((var_size = int_size_in_bytes (TREE_TYPE (decl))) > 0
|
||||
&& var_size < GET_MODE_SIZE (GET_MODE (reg))))
|
||||
{
|
||||
|
@ -904,6 +903,30 @@ gen_rtx_REG_offset (rtx reg, enum machine_mode mode, unsigned int regno, int off
|
|||
|
||||
REG_ATTRS (new) = get_reg_attrs (REG_EXPR (reg),
|
||||
REG_OFFSET (reg) + offset);
|
||||
}
|
||||
|
||||
/* Generate a register with same attributes as REG, but offsetted by
|
||||
OFFSET. */
|
||||
|
||||
rtx
|
||||
gen_rtx_REG_offset (rtx reg, enum machine_mode mode, unsigned int regno,
|
||||
int offset)
|
||||
{
|
||||
rtx new = gen_rtx_REG (mode, regno);
|
||||
|
||||
update_reg_offset (new, reg, offset);
|
||||
return new;
|
||||
}
|
||||
|
||||
/* Generate a new pseudo-register with the same attributes as REG, but
|
||||
offsetted by OFFSET. */
|
||||
|
||||
rtx
|
||||
gen_reg_rtx_offset (rtx reg, enum machine_mode mode, int offset)
|
||||
{
|
||||
rtx new = gen_reg_rtx (mode);
|
||||
|
||||
update_reg_offset (new, reg, offset);
|
||||
return new;
|
||||
}
|
||||
|
||||
|
|
1130
gcc/lower-subreg.c
Normal file
1130
gcc/lower-subreg.c
Normal file
File diff suppressed because it is too large
Load diff
|
@ -445,6 +445,7 @@ decode_options (unsigned int argc, const char **argv)
|
|||
flag_if_conversion2 = 1;
|
||||
flag_ipa_pure_const = 1;
|
||||
flag_ipa_reference = 1;
|
||||
flag_split_wide_types = 1;
|
||||
flag_tree_ccp = 1;
|
||||
flag_tree_dce = 1;
|
||||
flag_tree_dom = 1;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* Top level of GCC compilers (cc1, cc1plus, etc.)
|
||||
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
||||
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -663,6 +664,7 @@ init_optimization_passes (void)
|
|||
NEXT_PASS (pass_unshare_all_rtl);
|
||||
NEXT_PASS (pass_instantiate_virtual_regs);
|
||||
NEXT_PASS (pass_jump2);
|
||||
NEXT_PASS (pass_lower_subreg);
|
||||
NEXT_PASS (pass_cse);
|
||||
NEXT_PASS (pass_rtl_fwprop);
|
||||
NEXT_PASS (pass_gcse);
|
||||
|
@ -682,6 +684,7 @@ init_optimization_passes (void)
|
|||
NEXT_PASS (pass_partition_blocks);
|
||||
NEXT_PASS (pass_regmove);
|
||||
NEXT_PASS (pass_split_all_insns);
|
||||
NEXT_PASS (pass_lower_subreg2);
|
||||
NEXT_PASS (pass_mode_switching);
|
||||
NEXT_PASS (pass_see);
|
||||
NEXT_PASS (pass_recompute_reg_usage);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Compute register class preferences for pseudo-registers.
|
||||
Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
||||
1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -859,7 +859,7 @@ static void record_address_regs (enum machine_mode, rtx, int, enum rtx_code,
|
|||
#ifdef FORBIDDEN_INC_DEC_CLASSES
|
||||
static int auto_inc_dec_reg_p (rtx, enum machine_mode);
|
||||
#endif
|
||||
static void reg_scan_mark_refs (rtx, rtx, int);
|
||||
static void reg_scan_mark_refs (rtx, rtx, int, unsigned int);
|
||||
|
||||
/* Wrapper around REGNO_OK_FOR_INDEX_P, to allow pseudo registers. */
|
||||
|
||||
|
@ -2292,6 +2292,14 @@ free_reg_info (void)
|
|||
regno_allocated = 0;
|
||||
reg_n_max = 0;
|
||||
}
|
||||
|
||||
/* Clear the information stored for REGNO. */
|
||||
void
|
||||
clear_reg_info_regno (unsigned int regno)
|
||||
{
|
||||
if (regno < regno_allocated)
|
||||
memset (VEC_index (reg_info_p, reg_n_info, regno), 0, sizeof (reg_info));
|
||||
}
|
||||
|
||||
/* This is the `regscan' pass of the compiler, run just before cse
|
||||
and again just before loop.
|
||||
|
@ -2333,10 +2341,10 @@ reg_scan (rtx f, unsigned int nregs)
|
|||
if (GET_CODE (pat) == PARALLEL
|
||||
&& XVECLEN (pat, 0) > max_parallel)
|
||||
max_parallel = XVECLEN (pat, 0);
|
||||
reg_scan_mark_refs (pat, insn, 0);
|
||||
reg_scan_mark_refs (pat, insn, 0, 0);
|
||||
|
||||
if (REG_NOTES (insn))
|
||||
reg_scan_mark_refs (REG_NOTES (insn), insn, 1);
|
||||
reg_scan_mark_refs (REG_NOTES (insn), insn, 1, 0);
|
||||
}
|
||||
|
||||
max_parallel += max_set_parallel;
|
||||
|
@ -2344,11 +2352,39 @@ reg_scan (rtx f, unsigned int nregs)
|
|||
timevar_pop (TV_REG_SCAN);
|
||||
}
|
||||
|
||||
/* Update 'regscan' information by looking at the insns
|
||||
from FIRST to LAST. Some new REGs have been created,
|
||||
and any REG with number greater than OLD_MAX_REGNO is
|
||||
such a REG. We only update information for those. */
|
||||
|
||||
void
|
||||
reg_scan_update (rtx first, rtx last, unsigned int old_max_regno)
|
||||
{
|
||||
rtx insn;
|
||||
|
||||
allocate_reg_info (max_reg_num (), FALSE, FALSE);
|
||||
|
||||
for (insn = first; insn != last; insn = NEXT_INSN (insn))
|
||||
if (INSN_P (insn))
|
||||
{
|
||||
rtx pat = PATTERN (insn);
|
||||
if (GET_CODE (pat) == PARALLEL
|
||||
&& XVECLEN (pat, 0) > max_parallel)
|
||||
max_parallel = XVECLEN (pat, 0);
|
||||
reg_scan_mark_refs (pat, insn, 0, old_max_regno);
|
||||
|
||||
if (REG_NOTES (insn))
|
||||
reg_scan_mark_refs (REG_NOTES (insn), insn, 1, old_max_regno);
|
||||
}
|
||||
}
|
||||
|
||||
/* X is the expression to scan. INSN is the insn it appears in.
|
||||
NOTE_FLAG is nonzero if X is from INSN's notes rather than its body. */
|
||||
NOTE_FLAG is nonzero if X is from INSN's notes rather than its body.
|
||||
We should only record information for REGs with numbers
|
||||
greater than or equal to MIN_REGNO. */
|
||||
|
||||
static void
|
||||
reg_scan_mark_refs (rtx x, rtx insn, int note_flag)
|
||||
reg_scan_mark_refs (rtx x, rtx insn, int note_flag, unsigned int min_regno)
|
||||
{
|
||||
enum rtx_code code;
|
||||
rtx dest;
|
||||
|
@ -2375,35 +2411,43 @@ reg_scan_mark_refs (rtx x, rtx insn, int note_flag)
|
|||
{
|
||||
unsigned int regno = REGNO (x);
|
||||
|
||||
if (!note_flag)
|
||||
REGNO_LAST_UID (regno) = INSN_UID (insn);
|
||||
if (REGNO_FIRST_UID (regno) == 0)
|
||||
REGNO_FIRST_UID (regno) = INSN_UID (insn);
|
||||
if (regno >= min_regno)
|
||||
{
|
||||
if (!note_flag)
|
||||
REGNO_LAST_UID (regno) = INSN_UID (insn);
|
||||
if (REGNO_FIRST_UID (regno) == 0)
|
||||
REGNO_FIRST_UID (regno) = INSN_UID (insn);
|
||||
/* If we are called by reg_scan_update() (indicated by min_regno
|
||||
being set), we also need to update the reference count. */
|
||||
if (min_regno)
|
||||
REG_N_REFS (regno)++;
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case EXPR_LIST:
|
||||
if (XEXP (x, 0))
|
||||
reg_scan_mark_refs (XEXP (x, 0), insn, note_flag);
|
||||
reg_scan_mark_refs (XEXP (x, 0), insn, note_flag, min_regno);
|
||||
if (XEXP (x, 1))
|
||||
reg_scan_mark_refs (XEXP (x, 1), insn, note_flag);
|
||||
reg_scan_mark_refs (XEXP (x, 1), insn, note_flag, min_regno);
|
||||
break;
|
||||
|
||||
case INSN_LIST:
|
||||
if (XEXP (x, 1))
|
||||
reg_scan_mark_refs (XEXP (x, 1), insn, note_flag);
|
||||
reg_scan_mark_refs (XEXP (x, 1), insn, note_flag, min_regno);
|
||||
break;
|
||||
|
||||
case CLOBBER:
|
||||
{
|
||||
rtx reg = XEXP (x, 0);
|
||||
if (REG_P (reg))
|
||||
if (REG_P (reg)
|
||||
&& REGNO (reg) >= min_regno)
|
||||
{
|
||||
REG_N_SETS (REGNO (reg))++;
|
||||
REG_N_REFS (REGNO (reg))++;
|
||||
}
|
||||
else if (MEM_P (reg))
|
||||
reg_scan_mark_refs (XEXP (reg, 0), insn, note_flag);
|
||||
reg_scan_mark_refs (XEXP (reg, 0), insn, note_flag, min_regno);
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -2420,7 +2464,8 @@ reg_scan_mark_refs (rtx x, rtx insn, int note_flag)
|
|||
if (GET_CODE (dest) == PARALLEL)
|
||||
max_set_parallel = MAX (max_set_parallel, XVECLEN (dest, 0) - 1);
|
||||
|
||||
if (REG_P (dest))
|
||||
if (REG_P (dest)
|
||||
&& REGNO (dest) >= min_regno)
|
||||
{
|
||||
REG_N_SETS (REGNO (dest))++;
|
||||
REG_N_REFS (REGNO (dest))++;
|
||||
|
@ -2440,6 +2485,7 @@ reg_scan_mark_refs (rtx x, rtx insn, int note_flag)
|
|||
|
||||
if (REG_P (SET_DEST (x))
|
||||
&& REGNO (SET_DEST (x)) >= FIRST_PSEUDO_REGISTER
|
||||
&& REGNO (SET_DEST (x)) >= min_regno
|
||||
/* If the destination pseudo is set more than once, then other
|
||||
sets might not be to a pointer value (consider access to a
|
||||
union in two threads of control in the presence of global
|
||||
|
@ -2500,12 +2546,12 @@ reg_scan_mark_refs (rtx x, rtx insn, int note_flag)
|
|||
for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
|
||||
{
|
||||
if (fmt[i] == 'e')
|
||||
reg_scan_mark_refs (XEXP (x, i), insn, note_flag);
|
||||
reg_scan_mark_refs (XEXP (x, i), insn, note_flag, min_regno);
|
||||
else if (fmt[i] == 'E' && XVEC (x, i) != 0)
|
||||
{
|
||||
int j;
|
||||
for (j = XVECLEN (x, i) - 1; j >= 0; j--)
|
||||
reg_scan_mark_refs (XVECEXP (x, i, j), insn, note_flag);
|
||||
reg_scan_mark_refs (XVECEXP (x, i, j), insn, note_flag, min_regno);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* Define per-register tables for data flow info and register allocation.
|
||||
Copyright (C) 1987, 1993, 1994, 1995, 1996, 1997, 1998,
|
||||
1999, 2000, 2003, 2004 Free Software Foundation, Inc.
|
||||
1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -237,6 +237,9 @@ extern int caller_save_needed;
|
|||
/* Allocate reg_n_info tables */
|
||||
extern void allocate_reg_info (size_t, int, int);
|
||||
|
||||
/* Clear the register information for regno. */
|
||||
extern void clear_reg_info_regno (unsigned int);
|
||||
|
||||
/* Specify number of hard registers given machine mode occupy. */
|
||||
extern unsigned char hard_regno_nregs[FIRST_PSEUDO_REGISTER][MAX_MACHINE_MODE];
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
Register Transfer Expressions (rtx's) that make up the
|
||||
Register Transfer Language (rtl) used in the Back End of the GNU compiler.
|
||||
Copyright (C) 1987, 1988, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2004,
|
||||
2005, 2006
|
||||
2005, 2006, 2007
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -388,6 +388,12 @@ DEF_RTL_EXPR(STRICT_LOW_PART, "strict_low_part", "e", RTX_EXTRA)
|
|||
in DECL_RTLs and during RTL generation, but not in the insn chain. */
|
||||
DEF_RTL_EXPR(CONCAT, "concat", "ee", RTX_OBJ)
|
||||
|
||||
/* (CONCATN [a1 a2 ... an]) represents the virtual concatenation of
|
||||
all An to make a value. This is an extension of CONCAT to larger
|
||||
number of components. Like CONCAT, it should not appear in the
|
||||
insn chain. Every element of the CONCATN is the same size. */
|
||||
DEF_RTL_EXPR(CONCATN, "concatn", "E", RTX_OBJ)
|
||||
|
||||
/* A memory location; operand is the address. The second operand is the
|
||||
alias set to which this MEM belongs. We use `0' instead of `w' for this
|
||||
field so that the field need not be specified in machine descriptions. */
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/* Register Transfer Language (RTL) definitions for GCC
|
||||
Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
|
||||
2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
|
@ -1471,6 +1472,7 @@ extern int rtx_equal_p (rtx, rtx);
|
|||
extern rtvec gen_rtvec_v (int, rtx *);
|
||||
extern rtx gen_reg_rtx (enum machine_mode);
|
||||
extern rtx gen_rtx_REG_offset (rtx, enum machine_mode, unsigned int, int);
|
||||
extern rtx gen_reg_rtx_offset (rtx, enum machine_mode, int);
|
||||
extern rtx gen_label_rtx (void);
|
||||
extern rtx gen_lowpart_common (enum machine_mode, rtx);
|
||||
|
||||
|
@ -2162,6 +2164,7 @@ extern void init_reg_sets (void);
|
|||
extern void regclass_init (void);
|
||||
extern void regclass (rtx, int);
|
||||
extern void reg_scan (rtx, unsigned int);
|
||||
extern void reg_scan_update (rtx, rtx, unsigned int);
|
||||
extern void fix_register (const char *, int, int);
|
||||
extern void init_subregs_of_mode (void);
|
||||
extern void record_subregs_of_mode (rtx);
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2007-01-31 Ian Lance Taylor <iant@google.com>
|
||||
|
||||
* gcc.dg/lower-subreg-1.c (test): New test.
|
||||
|
||||
2007-01-30 Geoffrey Keating <geoffk@apple.com>
|
||||
|
||||
* g++.dg/eh/simd-4.C (main): Also catch SIGSEGV.
|
||||
|
|
8
gcc/testsuite/gcc.dg/lower-subreg-1.c
Normal file
8
gcc/testsuite/gcc.dg/lower-subreg-1.c
Normal file
|
@ -0,0 +1,8 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O -fdump-rtl-subreg" } */
|
||||
/* { dg-require-effective-target ilp32 } */
|
||||
|
||||
long long test (long long a, long long b) { return a | b; }
|
||||
|
||||
/* { dg-final { scan-rtl-dump "Splitting reg" "subreg" } } */
|
||||
/* { dg-final { cleanup-tree-dump "subreg" } } */
|
|
@ -1,6 +1,6 @@
|
|||
/* This file contains the definitions for timing variables used to
|
||||
measure run-time performance of the compiler.
|
||||
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005
|
||||
Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
|
||||
Free Software Foundation, Inc.
|
||||
Contributed by Alex Samuel <samuel@codesourcery.com>
|
||||
|
||||
|
@ -128,6 +128,7 @@ DEFTIMEVAR (TV_OVERLOAD , "overload resolution")
|
|||
DEFTIMEVAR (TV_TEMPLATE_INSTANTIATION, "template instantiation")
|
||||
DEFTIMEVAR (TV_EXPAND , "expand")
|
||||
DEFTIMEVAR (TV_VARCONST , "varconst")
|
||||
DEFTIMEVAR (TV_LOWER_SUBREG , "lower subreg")
|
||||
DEFTIMEVAR (TV_JUMP , "jump")
|
||||
DEFTIMEVAR (TV_FWPROP , "forward prop")
|
||||
DEFTIMEVAR (TV_CSE , "CSE")
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/* Definitions for describing one tree-ssa optimization pass.
|
||||
Copyright (C) 2004, 2005 Free Software Foundation, Inc.
|
||||
Copyright (C) 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
|
||||
Contributed by Richard Henderson <rth@redhat.com>
|
||||
|
||||
This file is part of GCC.
|
||||
|
@ -337,6 +337,7 @@ extern struct tree_opt_pass pass_instantiate_virtual_regs;
|
|||
extern struct tree_opt_pass pass_rtl_fwprop;
|
||||
extern struct tree_opt_pass pass_rtl_fwprop_addr;
|
||||
extern struct tree_opt_pass pass_jump2;
|
||||
extern struct tree_opt_pass pass_lower_subreg;
|
||||
extern struct tree_opt_pass pass_cse;
|
||||
extern struct tree_opt_pass pass_gcse;
|
||||
extern struct tree_opt_pass pass_jump_bypass;
|
||||
|
@ -360,6 +361,7 @@ extern struct tree_opt_pass pass_if_after_combine;
|
|||
extern struct tree_opt_pass pass_partition_blocks;
|
||||
extern struct tree_opt_pass pass_regmove;
|
||||
extern struct tree_opt_pass pass_split_all_insns;
|
||||
extern struct tree_opt_pass pass_lower_subreg2;
|
||||
extern struct tree_opt_pass pass_mode_switching;
|
||||
extern struct tree_opt_pass pass_see;
|
||||
extern struct tree_opt_pass pass_recompute_reg_usage;
|
||||
|
|
Loading…
Add table
Reference in a new issue