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
|
@ -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>
|
2007-01-31 Kazu Hirata <kazu@codesourcery.com>
|
||||||
|
|
||||||
* config/sh/sh.h (HAVE_SECONDARY_RELOADS): Remove.
|
* config/sh/sh.h (HAVE_SECONDARY_RELOADS): Remove.
|
||||||
|
|
|
@ -1023,6 +1023,7 @@ OBJS-common = \
|
||||||
loop-iv.o \
|
loop-iv.o \
|
||||||
loop-unroll.o \
|
loop-unroll.o \
|
||||||
loop-unswitch.o \
|
loop-unswitch.o \
|
||||||
|
lower-subreg.o \
|
||||||
mode-switching.o \
|
mode-switching.o \
|
||||||
modulo-sched.o \
|
modulo-sched.o \
|
||||||
omp-low.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) \
|
pretty-print.o: $(CONFIG_H) $(SYSTEM_H) coretypes.h intl.h $(PRETTY_PRINT_H) \
|
||||||
$(TREE_H)
|
$(TREE_H)
|
||||||
errors.o : errors.c $(CONFIG_H) $(SYSTEM_H) errors.h $(BCONFIG_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) \
|
$(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 \
|
$(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.
|
; 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.
|
; This file is part of GCC.
|
||||||
;
|
;
|
||||||
|
@ -861,6 +861,10 @@ fsplit-ivs-in-unroller
|
||||||
Common Report Var(flag_split_ivs_in_unroller) Init(1)
|
Common Report Var(flag_split_ivs_in_unroller) Init(1)
|
||||||
Split lifetimes of induction variables when loops are unrolled
|
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
|
fvariable-expansion-in-unroller
|
||||||
Common Report Var(flag_variable_expansion_in_unroller)
|
Common Report Var(flag_variable_expansion_in_unroller)
|
||||||
Apply variable expansion when loops are unrolled
|
Apply variable expansion when loops are unrolled
|
||||||
|
|
|
@ -340,7 +340,7 @@ Objective-C and Objective-C++ Dialects}.
|
||||||
-fsched2-use-superblocks @gol
|
-fsched2-use-superblocks @gol
|
||||||
-fsched2-use-traces -fsee -freschedule-modulo-scheduled-loops @gol
|
-fsched2-use-traces -fsee -freschedule-modulo-scheduled-loops @gol
|
||||||
-fsection-anchors -fsignaling-nans -fsingle-precision-constant @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
|
-fstrict-aliasing -fstrict-overflow -ftracer -fthread-jumps @gol
|
||||||
-funroll-all-loops -funroll-loops -fpeel-loops @gol
|
-funroll-all-loops -funroll-loops -fpeel-loops @gol
|
||||||
-fsplit-ivs-in-unroller -funswitch-loops @gol
|
-fsplit-ivs-in-unroller -funswitch-loops @gol
|
||||||
|
@ -4600,6 +4600,7 @@ compilation time.
|
||||||
-fcprop-registers @gol
|
-fcprop-registers @gol
|
||||||
-fif-conversion @gol
|
-fif-conversion @gol
|
||||||
-fif-conversion2 @gol
|
-fif-conversion2 @gol
|
||||||
|
-fsplit-wide-types @gol
|
||||||
-ftree-ccp @gol
|
-ftree-ccp @gol
|
||||||
-ftree-dce @gol
|
-ftree-dce @gol
|
||||||
-ftree-dominator-opts @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}.
|
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
|
@item -fcse-follow-jumps
|
||||||
@opindex fcse-follow-jumps
|
@opindex fcse-follow-jumps
|
||||||
In common subexpression elimination, scan through jump instructions
|
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
|
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}
|
stack and the @code{addressof} expression is replaced with a @code{plus}
|
||||||
expression for the address of its stack slot.
|
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
|
@end table
|
||||||
|
|
||||||
@node Arithmetic
|
@node Arithmetic
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* Output Dwarf2 format symbol table information from GCC.
|
/* Output Dwarf2 format symbol table information from GCC.
|
||||||
Copyright (C) 1992, 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
|
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).
|
Contributed by Gary Funck (gary@intrepid.com).
|
||||||
Derived from DWARF 1 implementation of Ron Guilmette (rfg@monkeys.com).
|
Derived from DWARF 1 implementation of Ron Guilmette (rfg@monkeys.com).
|
||||||
Extensively modified by Jason Merrill (jason@cygnus.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 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
|
/* 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
|
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
|
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));
|
loc_result = concat_loc_descriptor (XEXP (rtl, 0), XEXP (rtl, 1));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case CONCATN:
|
||||||
|
loc_result = concatn_loc_descriptor (rtl);
|
||||||
|
break;
|
||||||
|
|
||||||
case VAR_LOCATION:
|
case VAR_LOCATION:
|
||||||
/* Single part. */
|
/* Single part. */
|
||||||
if (GET_CODE (XEXP (rtl, 1)) != PARALLEL)
|
if (GET_CODE (XEXP (rtl, 1)) != PARALLEL)
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* Emit RTL for the GCC expander.
|
/* Emit RTL for the GCC expander.
|
||||||
Copyright (C) 1987, 1988, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
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.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
This file is part of GCC.
|
||||||
|
@ -812,13 +812,12 @@ gen_reg_rtx (enum machine_mode mode)
|
||||||
return val;
|
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. */
|
Do the big endian correction if needed. */
|
||||||
|
|
||||||
rtx
|
static void
|
||||||
gen_rtx_REG_offset (rtx reg, enum machine_mode mode, unsigned int regno, int offset)
|
update_reg_offset (rtx new, rtx reg, int offset)
|
||||||
{
|
{
|
||||||
rtx new = gen_rtx_REG (mode, regno);
|
|
||||||
tree decl;
|
tree decl;
|
||||||
HOST_WIDE_INT var_size;
|
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)
|
if ((BYTES_BIG_ENDIAN || WORDS_BIG_ENDIAN)
|
||||||
&& decl != NULL
|
&& decl != NULL
|
||||||
&& offset > 0
|
&& 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 = int_size_in_bytes (TREE_TYPE (decl))) > 0
|
||||||
&& var_size < GET_MODE_SIZE (GET_MODE (reg))))
|
&& 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_ATTRS (new) = get_reg_attrs (REG_EXPR (reg),
|
||||||
REG_OFFSET (reg) + offset);
|
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;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
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_if_conversion2 = 1;
|
||||||
flag_ipa_pure_const = 1;
|
flag_ipa_pure_const = 1;
|
||||||
flag_ipa_reference = 1;
|
flag_ipa_reference = 1;
|
||||||
|
flag_split_wide_types = 1;
|
||||||
flag_tree_ccp = 1;
|
flag_tree_ccp = 1;
|
||||||
flag_tree_dce = 1;
|
flag_tree_dce = 1;
|
||||||
flag_tree_dom = 1;
|
flag_tree_dom = 1;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/* Top level of GCC compilers (cc1, cc1plus, etc.)
|
/* Top level of GCC compilers (cc1, cc1plus, etc.)
|
||||||
Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998,
|
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.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
@ -663,6 +664,7 @@ init_optimization_passes (void)
|
||||||
NEXT_PASS (pass_unshare_all_rtl);
|
NEXT_PASS (pass_unshare_all_rtl);
|
||||||
NEXT_PASS (pass_instantiate_virtual_regs);
|
NEXT_PASS (pass_instantiate_virtual_regs);
|
||||||
NEXT_PASS (pass_jump2);
|
NEXT_PASS (pass_jump2);
|
||||||
|
NEXT_PASS (pass_lower_subreg);
|
||||||
NEXT_PASS (pass_cse);
|
NEXT_PASS (pass_cse);
|
||||||
NEXT_PASS (pass_rtl_fwprop);
|
NEXT_PASS (pass_rtl_fwprop);
|
||||||
NEXT_PASS (pass_gcse);
|
NEXT_PASS (pass_gcse);
|
||||||
|
@ -682,6 +684,7 @@ init_optimization_passes (void)
|
||||||
NEXT_PASS (pass_partition_blocks);
|
NEXT_PASS (pass_partition_blocks);
|
||||||
NEXT_PASS (pass_regmove);
|
NEXT_PASS (pass_regmove);
|
||||||
NEXT_PASS (pass_split_all_insns);
|
NEXT_PASS (pass_split_all_insns);
|
||||||
|
NEXT_PASS (pass_lower_subreg2);
|
||||||
NEXT_PASS (pass_mode_switching);
|
NEXT_PASS (pass_mode_switching);
|
||||||
NEXT_PASS (pass_see);
|
NEXT_PASS (pass_see);
|
||||||
NEXT_PASS (pass_recompute_reg_usage);
|
NEXT_PASS (pass_recompute_reg_usage);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* Compute register class preferences for pseudo-registers.
|
/* Compute register class preferences for pseudo-registers.
|
||||||
Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996
|
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.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
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
|
#ifdef FORBIDDEN_INC_DEC_CLASSES
|
||||||
static int auto_inc_dec_reg_p (rtx, enum machine_mode);
|
static int auto_inc_dec_reg_p (rtx, enum machine_mode);
|
||||||
#endif
|
#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. */
|
/* Wrapper around REGNO_OK_FOR_INDEX_P, to allow pseudo registers. */
|
||||||
|
|
||||||
|
@ -2292,6 +2292,14 @@ free_reg_info (void)
|
||||||
regno_allocated = 0;
|
regno_allocated = 0;
|
||||||
reg_n_max = 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
|
/* This is the `regscan' pass of the compiler, run just before cse
|
||||||
and again just before loop.
|
and again just before loop.
|
||||||
|
@ -2333,10 +2341,10 @@ reg_scan (rtx f, unsigned int nregs)
|
||||||
if (GET_CODE (pat) == PARALLEL
|
if (GET_CODE (pat) == PARALLEL
|
||||||
&& XVECLEN (pat, 0) > max_parallel)
|
&& XVECLEN (pat, 0) > max_parallel)
|
||||||
max_parallel = XVECLEN (pat, 0);
|
max_parallel = XVECLEN (pat, 0);
|
||||||
reg_scan_mark_refs (pat, insn, 0);
|
reg_scan_mark_refs (pat, insn, 0, 0);
|
||||||
|
|
||||||
if (REG_NOTES (insn))
|
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;
|
max_parallel += max_set_parallel;
|
||||||
|
@ -2344,11 +2352,39 @@ reg_scan (rtx f, unsigned int nregs)
|
||||||
timevar_pop (TV_REG_SCAN);
|
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.
|
/* 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
|
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;
|
enum rtx_code code;
|
||||||
rtx dest;
|
rtx dest;
|
||||||
|
@ -2375,35 +2411,43 @@ reg_scan_mark_refs (rtx x, rtx insn, int note_flag)
|
||||||
{
|
{
|
||||||
unsigned int regno = REGNO (x);
|
unsigned int regno = REGNO (x);
|
||||||
|
|
||||||
|
if (regno >= min_regno)
|
||||||
|
{
|
||||||
if (!note_flag)
|
if (!note_flag)
|
||||||
REGNO_LAST_UID (regno) = INSN_UID (insn);
|
REGNO_LAST_UID (regno) = INSN_UID (insn);
|
||||||
if (REGNO_FIRST_UID (regno) == 0)
|
if (REGNO_FIRST_UID (regno) == 0)
|
||||||
REGNO_FIRST_UID (regno) = INSN_UID (insn);
|
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;
|
break;
|
||||||
|
|
||||||
case EXPR_LIST:
|
case EXPR_LIST:
|
||||||
if (XEXP (x, 0))
|
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))
|
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;
|
break;
|
||||||
|
|
||||||
case INSN_LIST:
|
case INSN_LIST:
|
||||||
if (XEXP (x, 1))
|
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;
|
break;
|
||||||
|
|
||||||
case CLOBBER:
|
case CLOBBER:
|
||||||
{
|
{
|
||||||
rtx reg = XEXP (x, 0);
|
rtx reg = XEXP (x, 0);
|
||||||
if (REG_P (reg))
|
if (REG_P (reg)
|
||||||
|
&& REGNO (reg) >= min_regno)
|
||||||
{
|
{
|
||||||
REG_N_SETS (REGNO (reg))++;
|
REG_N_SETS (REGNO (reg))++;
|
||||||
REG_N_REFS (REGNO (reg))++;
|
REG_N_REFS (REGNO (reg))++;
|
||||||
}
|
}
|
||||||
else if (MEM_P (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;
|
break;
|
||||||
|
|
||||||
|
@ -2420,7 +2464,8 @@ reg_scan_mark_refs (rtx x, rtx insn, int note_flag)
|
||||||
if (GET_CODE (dest) == PARALLEL)
|
if (GET_CODE (dest) == PARALLEL)
|
||||||
max_set_parallel = MAX (max_set_parallel, XVECLEN (dest, 0) - 1);
|
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_SETS (REGNO (dest))++;
|
||||||
REG_N_REFS (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))
|
if (REG_P (SET_DEST (x))
|
||||||
&& REGNO (SET_DEST (x)) >= FIRST_PSEUDO_REGISTER
|
&& REGNO (SET_DEST (x)) >= FIRST_PSEUDO_REGISTER
|
||||||
|
&& REGNO (SET_DEST (x)) >= min_regno
|
||||||
/* If the destination pseudo is set more than once, then other
|
/* If the destination pseudo is set more than once, then other
|
||||||
sets might not be to a pointer value (consider access to a
|
sets might not be to a pointer value (consider access to a
|
||||||
union in two threads of control in the presence of global
|
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--)
|
for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
|
||||||
{
|
{
|
||||||
if (fmt[i] == 'e')
|
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)
|
else if (fmt[i] == 'E' && XVEC (x, i) != 0)
|
||||||
{
|
{
|
||||||
int j;
|
int j;
|
||||||
for (j = XVECLEN (x, i) - 1; j >= 0; 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.
|
/* Define per-register tables for data flow info and register allocation.
|
||||||
Copyright (C) 1987, 1993, 1994, 1995, 1996, 1997, 1998,
|
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.
|
This file is part of GCC.
|
||||||
|
|
||||||
|
@ -237,6 +237,9 @@ extern int caller_save_needed;
|
||||||
/* Allocate reg_n_info tables */
|
/* Allocate reg_n_info tables */
|
||||||
extern void allocate_reg_info (size_t, int, int);
|
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. */
|
/* Specify number of hard registers given machine mode occupy. */
|
||||||
extern unsigned char hard_regno_nregs[FIRST_PSEUDO_REGISTER][MAX_MACHINE_MODE];
|
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 Expressions (rtx's) that make up the
|
||||||
Register Transfer Language (rtl) used in the Back End of the GNU compiler.
|
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,
|
Copyright (C) 1987, 1988, 1992, 1994, 1995, 1997, 1998, 1999, 2000, 2004,
|
||||||
2005, 2006
|
2005, 2006, 2007
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
|
||||||
This file is part of GCC.
|
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. */
|
in DECL_RTLs and during RTL generation, but not in the insn chain. */
|
||||||
DEF_RTL_EXPR(CONCAT, "concat", "ee", RTX_OBJ)
|
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
|
/* 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
|
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. */
|
field so that the field need not be specified in machine descriptions. */
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/* Register Transfer Language (RTL) definitions for GCC
|
/* Register Transfer Language (RTL) definitions for GCC
|
||||||
Copyright (C) 1987, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
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.
|
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 rtvec gen_rtvec_v (int, rtx *);
|
||||||
extern rtx gen_reg_rtx (enum machine_mode);
|
extern rtx gen_reg_rtx (enum machine_mode);
|
||||||
extern rtx gen_rtx_REG_offset (rtx, enum machine_mode, unsigned int, int);
|
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_label_rtx (void);
|
||||||
extern rtx gen_lowpart_common (enum machine_mode, rtx);
|
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_init (void);
|
||||||
extern void regclass (rtx, int);
|
extern void regclass (rtx, int);
|
||||||
extern void reg_scan (rtx, unsigned 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 fix_register (const char *, int, int);
|
||||||
extern void init_subregs_of_mode (void);
|
extern void init_subregs_of_mode (void);
|
||||||
extern void record_subregs_of_mode (rtx);
|
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>
|
2007-01-30 Geoffrey Keating <geoffk@apple.com>
|
||||||
|
|
||||||
* g++.dg/eh/simd-4.C (main): Also catch SIGSEGV.
|
* g++.dg/eh/simd-4.C (main): Also catch SIGSEGV.
|
||||||
|
|
|
@ -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
|
/* This file contains the definitions for timing variables used to
|
||||||
measure run-time performance of the compiler.
|
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.
|
Free Software Foundation, Inc.
|
||||||
Contributed by Alex Samuel <samuel@codesourcery.com>
|
Contributed by Alex Samuel <samuel@codesourcery.com>
|
||||||
|
|
||||||
|
@ -128,6 +128,7 @@ DEFTIMEVAR (TV_OVERLOAD , "overload resolution")
|
||||||
DEFTIMEVAR (TV_TEMPLATE_INSTANTIATION, "template instantiation")
|
DEFTIMEVAR (TV_TEMPLATE_INSTANTIATION, "template instantiation")
|
||||||
DEFTIMEVAR (TV_EXPAND , "expand")
|
DEFTIMEVAR (TV_EXPAND , "expand")
|
||||||
DEFTIMEVAR (TV_VARCONST , "varconst")
|
DEFTIMEVAR (TV_VARCONST , "varconst")
|
||||||
|
DEFTIMEVAR (TV_LOWER_SUBREG , "lower subreg")
|
||||||
DEFTIMEVAR (TV_JUMP , "jump")
|
DEFTIMEVAR (TV_JUMP , "jump")
|
||||||
DEFTIMEVAR (TV_FWPROP , "forward prop")
|
DEFTIMEVAR (TV_FWPROP , "forward prop")
|
||||||
DEFTIMEVAR (TV_CSE , "CSE")
|
DEFTIMEVAR (TV_CSE , "CSE")
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/* Definitions for describing one tree-ssa optimization pass.
|
/* 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>
|
Contributed by Richard Henderson <rth@redhat.com>
|
||||||
|
|
||||||
This file is part of GCC.
|
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;
|
||||||
extern struct tree_opt_pass pass_rtl_fwprop_addr;
|
extern struct tree_opt_pass pass_rtl_fwprop_addr;
|
||||||
extern struct tree_opt_pass pass_jump2;
|
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_cse;
|
||||||
extern struct tree_opt_pass pass_gcse;
|
extern struct tree_opt_pass pass_gcse;
|
||||||
extern struct tree_opt_pass pass_jump_bypass;
|
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_partition_blocks;
|
||||||
extern struct tree_opt_pass pass_regmove;
|
extern struct tree_opt_pass pass_regmove;
|
||||||
extern struct tree_opt_pass pass_split_all_insns;
|
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_mode_switching;
|
||||||
extern struct tree_opt_pass pass_see;
|
extern struct tree_opt_pass pass_see;
|
||||||
extern struct tree_opt_pass pass_recompute_reg_usage;
|
extern struct tree_opt_pass pass_recompute_reg_usage;
|
||||||
|
|
Loading…
Reference in New Issue