summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog36
-rw-r--r--gcc/cse.c8
-rw-r--r--gcc/cselib.c7
-rw-r--r--gcc/doc/rtl.texi16
-rw-r--r--gcc/except.c147
-rw-r--r--gcc/except.h3
-rw-r--r--gcc/flow.c2
-rw-r--r--gcc/integrate.c420
-rw-r--r--gcc/integrate.h126
-rw-r--r--gcc/reg-stack.c52
-rw-r--r--gcc/rtl.def9
-rw-r--r--gcc/rtl.h35
-rw-r--r--gcc/varray.c1
-rw-r--r--gcc/varray.h33
-rw-r--r--gcc/web.c1
15 files changed, 58 insertions, 838 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7fe8ac684ad..8c5c3294f3f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,39 @@
+2004-11-13 Steven Bosscher <stevenb@suse.de>
+
+ * cse.c (CHEAP_REGNO): Redefine using REGNO_PTR_FRAME_P and
+ HARD_REGISTER_NUM_P.
+
+ * cselib.c (new_cselib_val): Make comment correct and more detailed.
+ * flow.c (mark_set_1): Likewise.
+
+ * except.c (duplicate_eh_region_1, duplicate_eh_region_2,
+ duplicate_eh_regions): Remove.
+ * except.h (duplicate_eh_regions): Remove prototype.
+ * integrate.c (get_label_from_map, copy_rtx_and_substitute,
+ global_const_equiv_varray): Remove.
+ * integrate.h (get_label_from_map, copy_rtx_and_substitute,
+ global_const_equiv_varray, set_label_in_map): Remove prototypes,
+ extern declaration, and #define.
+ (MAYBE_EXTEND_CONST_EQUIV_VARRAY, SET_CONST_EQUIV_DATA): Remove.
+ (struct inline_remap): Remove.
+ * varray.c (struct element): Remove entry for const_equiv_data.
+ * varray.h (struct const_equiv_data): Remove.
+ (enum varray_data_enum) <VARRAY_DATA_CONST_EQUIV>: Remove.
+ (union varray_data_tag) <const_equiv>: Remove.
+ (VARRAY_CONST_EQUIV_INIT, VARRAY_CONST_EQUIV,
+ VARRAY_PUSH_CONST_EQUIV, VARRAY_TOP_CONST_EQUIV): Remove.
+
+ * regstack.c (record_label_references): Remove unused function.
+
+ * rtl.def (VALUE): Update comment.
+ (LABEL_REF): Remove unused operand 2.
+ * rtl.h (struct rtx_def): Update for removed accessor macros.
+ (XCADVFLAGS, INSN_DEAD_CODE_P, LINE_NUMBER, CONTAINING_INSN,
+ REG_LOOP_TEST_P): Remove.
+ (ADDR_DIFF_VEC_FLAGS, CSELIB_VAL_PTR, LABEL_NEXTREF): Add comments.
+ * web.c (entry_register): Don't copy REG_LOOP_TEST_P.
+ * doc/rtl.texi (INSN_DEAD_CODE_P, REG_LOOP_TEST_P): Remove.
+
2004-11-13 James A. Morrison <phython@gcc.gnu.org>
Eric Botcazou <ebotcazou@libertysurf.fr>
diff --git a/gcc/cse.c b/gcc/cse.c
index 19e7f7145cf..2797e437d3a 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -504,11 +504,9 @@ struct table_elt
of 0. Next come pseudos with a cost of one and other hard registers with
a cost of 2. Aside from these special cases, call `rtx_cost'. */
-#define CHEAP_REGNO(N) \
- ((N) == FRAME_POINTER_REGNUM || (N) == HARD_FRAME_POINTER_REGNUM \
- || (N) == STACK_POINTER_REGNUM || (N) == ARG_POINTER_REGNUM \
- || ((N) >= FIRST_VIRTUAL_REGISTER && (N) <= LAST_VIRTUAL_REGISTER) \
- || ((N) < FIRST_PSEUDO_REGISTER \
+#define CHEAP_REGNO(N) \
+ (REGNO_PTR_FRAME_P(N) \
+ || (HARD_REGISTER_NUM_P (N) \
&& FIXED_REGNO_P (N) && REGNO_REG_CLASS (N) != NO_REGS))
#define COST(X) (REG_P (X) ? 0 : notreg_cost (X, SET))
diff --git a/gcc/cselib.c b/gcc/cselib.c
index eb0b52a2edc..df22800114d 100644
--- a/gcc/cselib.c
+++ b/gcc/cselib.c
@@ -704,8 +704,11 @@ new_cselib_val (unsigned int value, enum machine_mode mode)
gcc_assert (value);
e->value = value;
- /* We use custom method to allocate this RTL construct because it accounts
- about 8% of overall memory usage. */
+ /* We use an alloc pool to allocate this RTL construct because it
+ accounts for about 8% of the overall memory usage. We know
+ precisely when we can have VALUE RTXen (when cselib is active)
+ so we don't need to put them in garbave collected memory.
+ ??? Why should a VALUE be an RTX in the first place? */
e->u.val_rtx = pool_alloc (value_pool);
memset (e->u.val_rtx, 0, RTX_HDR_SIZE);
PUT_CODE (e->u.val_rtx, VALUE);
diff --git a/gcc/doc/rtl.texi b/gcc/doc/rtl.texi
index 287d9f4ad94..869570b11c2 100644
--- a/gcc/doc/rtl.texi
+++ b/gcc/doc/rtl.texi
@@ -537,14 +537,6 @@ that the branch is an annulling one. See the discussion under
@code{sequence} below. Stored in the @code{unchanging} field and
printed as @samp{/u}.
-@findex INSN_DEAD_CODE_P
-@cindex @code{insn} and @samp{/s}
-@cindex @code{in_struct}, in @code{insn}
-@item INSN_DEAD_CODE_P (@var{x})
-In an @code{insn} during the dead-code elimination pass, nonzero if the
-insn is dead.
-Stored in the @code{in_struct} field and printed as @samp{/s}.
-
@findex INSN_DELETED_P
@cindex @code{insn} and @samp{/v}
@cindex @code{call_insn} and @samp{/v}
@@ -660,14 +652,6 @@ value is going to be returned. (This happens only in a hard
register.) Stored in the @code{integrated} field and printed as
@samp{/i}.
-@findex REG_LOOP_TEST_P
-@cindex @code{reg} and @samp{/s}
-@cindex @code{in_struct}, in @code{reg}
-@item REG_LOOP_TEST_P (@var{x})
-In @code{reg} expressions, nonzero if this register's entire life is
-contained in the exit test code for some loop. Stored in the
-@code{in_struct} field and printed as @samp{/s}.
-
@findex REG_POINTER
@cindex @code{reg} and @samp{/f}
@cindex @code{frame_related}, in @code{reg}
diff --git a/gcc/except.c b/gcc/except.c
index c67a98205a2..71fc01153a6 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -265,9 +265,6 @@ static void remove_fixup_regions (void);
static void remove_unreachable_regions (rtx);
static void convert_from_eh_region_ranges_1 (rtx *, int *, int);
-static struct eh_region *duplicate_eh_region_1 (struct eh_region *,
- struct inline_remap *);
-static void duplicate_eh_region_2 (struct eh_region *, struct eh_region **);
static int ttypes_filter_eq (const void *, const void *);
static hashval_t ttypes_filter_hash (const void *);
static int ehspec_filter_eq (const void *, const void *);
@@ -1065,150 +1062,6 @@ current_function_has_exception_handlers (void)
return false;
}
-static struct eh_region *
-duplicate_eh_region_1 (struct eh_region *o, struct inline_remap *map)
-{
- struct eh_region *n = ggc_alloc_cleared (sizeof (struct eh_region));
-
- n->region_number = o->region_number + cfun->eh->last_region_number;
- n->type = o->type;
-
- switch (n->type)
- {
- case ERT_CLEANUP:
- case ERT_MUST_NOT_THROW:
- break;
-
- case ERT_TRY:
- if (o->u.try.continue_label)
- n->u.try.continue_label
- = get_label_from_map (map,
- CODE_LABEL_NUMBER (o->u.try.continue_label));
- break;
-
- case ERT_CATCH:
- n->u.catch.type_list = o->u.catch.type_list;
- break;
-
- case ERT_ALLOWED_EXCEPTIONS:
- n->u.allowed.type_list = o->u.allowed.type_list;
- break;
-
- case ERT_THROW:
- n->u.throw.type = o->u.throw.type;
-
- default:
- gcc_unreachable ();
- }
-
- if (o->label)
- n->label = get_label_from_map (map, CODE_LABEL_NUMBER (o->label));
- if (o->resume)
- {
- n->resume = map->insn_map[INSN_UID (o->resume)];
- gcc_assert (n->resume);
- }
-
- return n;
-}
-
-static void
-duplicate_eh_region_2 (struct eh_region *o, struct eh_region **n_array)
-{
- struct eh_region *n = n_array[o->region_number];
-
- switch (n->type)
- {
- case ERT_TRY:
- n->u.try.catch = n_array[o->u.try.catch->region_number];
- n->u.try.last_catch = n_array[o->u.try.last_catch->region_number];
- break;
-
- case ERT_CATCH:
- if (o->u.catch.next_catch)
- n->u.catch.next_catch = n_array[o->u.catch.next_catch->region_number];
- if (o->u.catch.prev_catch)
- n->u.catch.prev_catch = n_array[o->u.catch.prev_catch->region_number];
- break;
-
- default:
- break;
- }
-
- if (o->outer)
- n->outer = n_array[o->outer->region_number];
- if (o->inner)
- n->inner = n_array[o->inner->region_number];
- if (o->next_peer)
- n->next_peer = n_array[o->next_peer->region_number];
-}
-
-int
-duplicate_eh_regions (struct function *ifun, struct inline_remap *map)
-{
- int ifun_last_region_number = ifun->eh->last_region_number;
- struct eh_region **n_array, *root, *cur;
- int i;
-
- if (ifun_last_region_number == 0)
- return 0;
-
- n_array = xcalloc (ifun_last_region_number + 1, sizeof (*n_array));
-
- for (i = 1; i <= ifun_last_region_number; ++i)
- {
- cur = ifun->eh->region_array[i];
- if (!cur || cur->region_number != i)
- continue;
- n_array[i] = duplicate_eh_region_1 (cur, map);
- }
- for (i = 1; i <= ifun_last_region_number; ++i)
- {
- cur = ifun->eh->region_array[i];
- if (!cur || cur->region_number != i)
- continue;
- duplicate_eh_region_2 (cur, n_array);
- }
-
- root = n_array[ifun->eh->region_tree->region_number];
- cur = cfun->eh->cur_region;
- if (cur)
- {
- struct eh_region *p = cur->inner;
- if (p)
- {
- while (p->next_peer)
- p = p->next_peer;
- p->next_peer = root;
- }
- else
- cur->inner = root;
-
- for (i = 1; i <= ifun_last_region_number; ++i)
- if (n_array[i] && n_array[i]->outer == NULL)
- n_array[i]->outer = cur;
- }
- else
- {
- struct eh_region *p = cfun->eh->region_tree;
- if (p)
- {
- while (p->next_peer)
- p = p->next_peer;
- p->next_peer = root;
- }
- else
- cfun->eh->region_tree = root;
- }
-
- free (n_array);
-
- i = cfun->eh->last_region_number;
- cfun->eh->last_region_number = i + ifun_last_region_number;
- return i;
-}
-
-
static int
t2r_eq (const void *pentry, const void *pdata)
{
diff --git a/gcc/except.h b/gcc/except.h
index 58461483caf..d79182f6463 100644
--- a/gcc/except.h
+++ b/gcc/except.h
@@ -23,8 +23,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
struct function;
-struct inline_remap;
-
/* Per-function EH data. Used only in except.c, but GC and others
manipulate pointers to the opaque type. */
struct eh_status;
@@ -83,7 +81,6 @@ extern void expand_eh_return (void);
extern rtx expand_builtin_extend_pointer (tree);
extern rtx get_exception_pointer (struct function *);
extern rtx get_exception_filter (struct function *);
-extern int duplicate_eh_regions (struct function *, struct inline_remap *);
extern int check_handled (tree, tree);
extern void sjlj_emit_function_exit_after (rtx);
diff --git a/gcc/flow.c b/gcc/flow.c
index 2ccd7554ca9..1053d830676 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -2634,7 +2634,7 @@ mark_set_1 (struct propagate_block_info *pbi, enum rtx_code code, rtx reg, rtx c
invalidate_mems_from_set (pbi, reg);
/* If the memory reference had embedded side effects (autoincrement
- address modes. Then we may need to kill some entries on the
+ address modes) then we may need to kill some entries on the
memory set list. */
if (insn && MEM_P (reg))
for_each_rtx (&PATTERN (insn), invalidate_mems_from_autoinc, pbi);
diff --git a/gcc/integrate.c b/gcc/integrate.c
index 2202e22f910..e4a9ddd9d71 100644
--- a/gcc/integrate.c
+++ b/gcc/integrate.c
@@ -64,21 +64,6 @@ typedef struct initial_value_struct GTY(()) {
static void set_block_origin_self (tree);
static void set_block_abstract_flags (tree, int);
-/* Returns the Ith entry in the label_map contained in MAP. If the
- Ith entry has not yet been set, return a fresh label. This function
- performs a lazy initialization of label_map, thereby avoiding huge memory
- explosions when the label_map gets very large. */
-
-rtx
-get_label_from_map (struct inline_remap *map, int i)
-{
- rtx x = map->label_map[i];
-
- if (x == NULL_RTX)
- x = map->label_map[i] = gen_label_rtx ();
-
- return x;
-}
/* Return false if the function FNDECL cannot be inlined on account of its
attributes, true otherwise. */
@@ -174,412 +159,7 @@ copy_decl_for_inlining (tree decl, tree from_fn, tree to_fn)
return copy;
}
-
-/* Unfortunately, we need a global copy of const_equiv map for communication
- with a function called from note_stores. Be *very* careful that this
- is used properly in the presence of recursion. */
-
-varray_type global_const_equiv_varray;
-
-/* Create a new copy of an rtx. Recursively copies the operands of the rtx,
- except for those few rtx codes that are sharable.
-
- We always return an rtx that is similar to that incoming rtx, with the
- exception of possibly changing a REG to a SUBREG or vice versa. No
- rtl is ever emitted.
-
- If FOR_LHS is nonzero, if means we are processing something that will
- be the LHS of a SET.
-
- Handle constants that need to be placed in the constant pool by
- calling `force_const_mem'. */
-
-rtx
-copy_rtx_and_substitute (rtx orig, struct inline_remap *map, int for_lhs)
-{
- rtx copy, temp;
- int i, j;
- RTX_CODE code;
- enum machine_mode mode;
- const char *format_ptr;
- int regno;
-
- if (orig == 0)
- return 0;
-
- code = GET_CODE (orig);
- mode = GET_MODE (orig);
-
- switch (code)
- {
- case REG:
- /* If the stack pointer register shows up, it must be part of
- stack-adjustments (*not* because we eliminated the frame pointer!).
- Small hard registers are returned as-is. Pseudo-registers
- go through their `reg_map'. */
- regno = REGNO (orig);
- if (regno <= LAST_VIRTUAL_REGISTER)
- {
- /* Some hard registers are also mapped,
- but others are not translated. */
- if (map->reg_map[regno] != 0)
- return map->reg_map[regno];
-
- /* If this is the virtual frame pointer, make space in current
- function's stack frame for the stack frame of the inline function.
-
- Copy the address of this area into a pseudo. Map
- virtual_stack_vars_rtx to this pseudo and set up a constant
- equivalence for it to be the address. This will substitute the
- address into insns where it can be substituted and use the new
- pseudo where it can't. */
- else if (regno == VIRTUAL_STACK_VARS_REGNUM)
- {
- rtx loc, seq;
- int size
- = get_func_frame_size (DECL_STRUCT_FUNCTION (map->fndecl));
-#ifdef FRAME_GROWS_DOWNWARD
- int alignment
- = (DECL_STRUCT_FUNCTION (map->fndecl)->stack_alignment_needed
- / BITS_PER_UNIT);
-
- /* In this case, virtual_stack_vars_rtx points to one byte
- higher than the top of the frame area. So make sure we
- allocate a big enough chunk to keep the frame pointer
- aligned like a real one. */
- if (alignment)
- size = CEIL_ROUND (size, alignment);
-#endif
- start_sequence ();
- loc = assign_stack_temp (BLKmode, size, 1);
- loc = XEXP (loc, 0);
-#ifdef FRAME_GROWS_DOWNWARD
- /* In this case, virtual_stack_vars_rtx points to one byte
- higher than the top of the frame area. So compute the offset
- to one byte higher than our substitute frame. */
- loc = plus_constant (loc, size);
-#endif
- map->reg_map[regno] = temp
- = force_reg (Pmode, force_operand (loc, NULL_RTX));
-
-#ifdef STACK_BOUNDARY
- mark_reg_pointer (map->reg_map[regno], STACK_BOUNDARY);
-#endif
-
- SET_CONST_EQUIV_DATA (map, temp, loc, CONST_AGE_PARM);
-
- seq = get_insns ();
- end_sequence ();
- emit_insn_after (seq, map->insns_at_start);
- return temp;
- }
- else if (regno == VIRTUAL_INCOMING_ARGS_REGNUM)
- {
- /* Do the same for a block to contain any arguments referenced
- in memory. */
- rtx loc, seq;
- int size = DECL_STRUCT_FUNCTION (map->fndecl)->args_size;
-
- start_sequence ();
- loc = assign_stack_temp (BLKmode, size, 1);
- loc = XEXP (loc, 0);
- /* When arguments grow downward, the virtual incoming
- args pointer points to the top of the argument block,
- so the remapped location better do the same. */
-#ifdef ARGS_GROW_DOWNWARD
- loc = plus_constant (loc, size);
-#endif
- map->reg_map[regno] = temp
- = force_reg (Pmode, force_operand (loc, NULL_RTX));
-
-#ifdef STACK_BOUNDARY
- mark_reg_pointer (map->reg_map[regno], STACK_BOUNDARY);
-#endif
-
- SET_CONST_EQUIV_DATA (map, temp, loc, CONST_AGE_PARM);
-
- seq = get_insns ();
- end_sequence ();
- emit_insn_after (seq, map->insns_at_start);
- return temp;
- }
- else
- return orig;
-
- abort ();
- }
- if (map->reg_map[regno] == NULL)
- {
- map->reg_map[regno] = gen_reg_rtx (mode);
- REG_USERVAR_P (map->reg_map[regno]) = REG_USERVAR_P (orig);
- REG_LOOP_TEST_P (map->reg_map[regno]) = REG_LOOP_TEST_P (orig);
- /* A reg with REG_FUNCTION_VALUE_P true will never reach here. */
-
- if (REG_POINTER (map->x_regno_reg_rtx[regno]))
- mark_reg_pointer (map->reg_map[regno],
- map->regno_pointer_align[regno]);
- }
- return map->reg_map[regno];
-
- case SUBREG:
- copy = copy_rtx_and_substitute (SUBREG_REG (orig), map, for_lhs);
- return simplify_gen_subreg (GET_MODE (orig), copy,
- GET_MODE (SUBREG_REG (orig)),
- SUBREG_BYTE (orig));
-
- case USE:
- case CLOBBER:
- /* USE and CLOBBER are ordinary, but we convert (use (subreg foo))
- to (use foo) if the original insn didn't have a subreg.
- Removing the subreg distorts the VAX movmemhi pattern
- by changing the mode of an operand. */
- copy = copy_rtx_and_substitute (XEXP (orig, 0), map, code == CLOBBER);
- if (GET_CODE (copy) == SUBREG && GET_CODE (XEXP (orig, 0)) != SUBREG)
- copy = SUBREG_REG (copy);
- return gen_rtx_fmt_e (code, VOIDmode, copy);
-
- /* We need to handle "deleted" labels that appear in the DECL_RTL
- of a LABEL_DECL. */
- case NOTE:
- if (NOTE_LINE_NUMBER (orig) != NOTE_INSN_DELETED_LABEL)
- break;
-
- /* Fall through. */
- case CODE_LABEL:
- LABEL_PRESERVE_P (get_label_from_map (map, CODE_LABEL_NUMBER (orig)))
- = LABEL_PRESERVE_P (orig);
- return get_label_from_map (map, CODE_LABEL_NUMBER (orig));
-
- case LABEL_REF:
- copy
- = gen_rtx_LABEL_REF
- (mode,
- LABEL_REF_NONLOCAL_P (orig) ? XEXP (orig, 0)
- : get_label_from_map (map, CODE_LABEL_NUMBER (XEXP (orig, 0))));
-
- LABEL_OUTSIDE_LOOP_P (copy) = LABEL_OUTSIDE_LOOP_P (orig);
-
- /* The fact that this label was previously nonlocal does not mean
- it still is, so we must check if it is within the range of
- this function's labels. */
- LABEL_REF_NONLOCAL_P (copy)
- = (LABEL_REF_NONLOCAL_P (orig)
- && ! (CODE_LABEL_NUMBER (XEXP (copy, 0)) >= get_first_label_num ()
- && CODE_LABEL_NUMBER (XEXP (copy, 0)) < max_label_num ()));
-
- return copy;
-
- case PC:
- case CC0:
- case CONST_INT:
- case CONST_VECTOR:
- return orig;
-
- case SYMBOL_REF:
- /* Symbols which represent the address of a label stored in the constant
- pool must be modified to point to a constant pool entry for the
- remapped label. Otherwise, symbols are returned unchanged. */
- if (CONSTANT_POOL_ADDRESS_P (orig))
- {
- struct function *f = cfun;
- rtx constant = get_pool_constant_for_function (f, orig);
- if (GET_CODE (constant) == LABEL_REF)
- return XEXP (force_const_mem
- (GET_MODE (orig),
- copy_rtx_and_substitute (constant, map, for_lhs)),
- 0);
- }
- return orig;
-
- case CONST_DOUBLE:
- /* We have to make a new copy of this CONST_DOUBLE because don't want
- to use the old value of CONST_DOUBLE_MEM. Also, this may be a
- duplicate of a CONST_DOUBLE we have already seen. */
- if (GET_MODE_CLASS (GET_MODE (orig)) == MODE_FLOAT)
- {
- REAL_VALUE_TYPE d;
-
- REAL_VALUE_FROM_CONST_DOUBLE (d, orig);
- return CONST_DOUBLE_FROM_REAL_VALUE (d, GET_MODE (orig));
- }
- else
- return immed_double_const (CONST_DOUBLE_LOW (orig),
- CONST_DOUBLE_HIGH (orig), VOIDmode);
-
- case CONST:
- break;
-
- case ASM_OPERANDS:
- /* If a single asm insn contains multiple output operands then
- it contains multiple ASM_OPERANDS rtx's that share the input
- and constraint vecs. We must make sure that the copied insn
- continues to share it. */
- if (map->orig_asm_operands_vector == ASM_OPERANDS_INPUT_VEC (orig))
- {
- copy = rtx_alloc (ASM_OPERANDS);
- RTX_FLAG (copy, volatil) = RTX_FLAG (orig, volatil);
- PUT_MODE (copy, GET_MODE (orig));
- ASM_OPERANDS_TEMPLATE (copy) = ASM_OPERANDS_TEMPLATE (orig);
- ASM_OPERANDS_OUTPUT_CONSTRAINT (copy)
- = ASM_OPERANDS_OUTPUT_CONSTRAINT (orig);
- ASM_OPERANDS_OUTPUT_IDX (copy) = ASM_OPERANDS_OUTPUT_IDX (orig);
- ASM_OPERANDS_INPUT_VEC (copy) = map->copy_asm_operands_vector;
- ASM_OPERANDS_INPUT_CONSTRAINT_VEC (copy)
- = map->copy_asm_constraints_vector;
-#ifdef USE_MAPPED_LOCATION
- ASM_OPERANDS_SOURCE_LOCATION (copy)
- = ASM_OPERANDS_SOURCE_LOCATION (orig);
-#else
- ASM_OPERANDS_SOURCE_FILE (copy) = ASM_OPERANDS_SOURCE_FILE (orig);
- ASM_OPERANDS_SOURCE_LINE (copy) = ASM_OPERANDS_SOURCE_LINE (orig);
-#endif
- return copy;
- }
- break;
-
- case CALL:
- /* This is given special treatment because the first
- operand of a CALL is a (MEM ...) which may get
- forced into a register for cse. This is undesirable
- if function-address cse isn't wanted or if we won't do cse. */
-#ifndef NO_FUNCTION_CSE
- if (! (optimize && ! flag_no_function_cse))
-#endif
- {
- rtx copy
- = gen_rtx_MEM (GET_MODE (XEXP (orig, 0)),
- copy_rtx_and_substitute (XEXP (XEXP (orig, 0), 0),
- map, 0));
-
- MEM_COPY_ATTRIBUTES (copy, XEXP (orig, 0));
-
- return
- gen_rtx_CALL (GET_MODE (orig), copy,
- copy_rtx_and_substitute (XEXP (orig, 1), map, 0));
- }
- break;
-
-#if 0
- /* Must be ifdefed out for loop unrolling to work. */
- /* ??? Is this for the old or the new unroller? */
- case RETURN:
- abort ();
-#endif
- case SET:
- /* If this is setting fp or ap, it means that we have a nonlocal goto.
- Adjust the setting by the offset of the area we made.
- If the nonlocal goto is into the current function,
- this will result in unnecessarily bad code, but should work. */
- if (SET_DEST (orig) == virtual_stack_vars_rtx
- || SET_DEST (orig) == virtual_incoming_args_rtx)
- {
- /* In case a translation hasn't occurred already, make one now. */
- rtx equiv_reg;
- rtx equiv_loc;
- HOST_WIDE_INT loc_offset;
-
- copy_rtx_and_substitute (SET_DEST (orig), map, for_lhs);
- equiv_reg = map->reg_map[REGNO (SET_DEST (orig))];
- equiv_loc = VARRAY_CONST_EQUIV (map->const_equiv_varray,
- REGNO (equiv_reg)).rtx;
- loc_offset
- = REG_P (equiv_loc) ? 0 : INTVAL (XEXP (equiv_loc, 1));
-
- return gen_rtx_SET (VOIDmode, SET_DEST (orig),
- force_operand
- (plus_constant
- (copy_rtx_and_substitute (SET_SRC (orig),
- map, 0),
- - loc_offset),
- NULL_RTX));
- }
- else
- return gen_rtx_SET (VOIDmode,
- copy_rtx_and_substitute (SET_DEST (orig), map, 1),
- copy_rtx_and_substitute (SET_SRC (orig), map, 0));
- break;
-
- case MEM:
- copy = gen_rtx_MEM (mode, copy_rtx_and_substitute (XEXP (orig, 0),
- map, 0));
- MEM_COPY_ATTRIBUTES (copy, orig);
- return copy;
-
- default:
- break;
- }
-
- copy = rtx_alloc (code);
- PUT_MODE (copy, mode);
- RTX_FLAG (copy, in_struct) = RTX_FLAG (orig, in_struct);
- RTX_FLAG (copy, volatil) = RTX_FLAG (orig, volatil);
- RTX_FLAG (copy, unchanging) = RTX_FLAG (orig, unchanging);
-
- format_ptr = GET_RTX_FORMAT (GET_CODE (copy));
-
- for (i = 0; i < GET_RTX_LENGTH (GET_CODE (copy)); i++)
- {
- switch (*format_ptr++)
- {
- case '0':
- X0ANY (copy, i) = X0ANY (orig, i);
- break;
-
- case 'e':
- XEXP (copy, i)
- = copy_rtx_and_substitute (XEXP (orig, i), map, for_lhs);
- break;
-
- case 'u':
- /* Change any references to old-insns to point to the
- corresponding copied insns. */
- XEXP (copy, i) = map->insn_map[INSN_UID (XEXP (orig, i))];
- break;
-
- case 'E':
- XVEC (copy, i) = XVEC (orig, i);
- if (XVEC (orig, i) != NULL && XVECLEN (orig, i) != 0)
- {
- XVEC (copy, i) = rtvec_alloc (XVECLEN (orig, i));
- for (j = 0; j < XVECLEN (copy, i); j++)
- XVECEXP (copy, i, j)
- = copy_rtx_and_substitute (XVECEXP (orig, i, j),
- map, for_lhs);
- }
- break;
-
- case 'w':
- XWINT (copy, i) = XWINT (orig, i);
- break;
-
- case 'i':
- XINT (copy, i) = XINT (orig, i);
- break;
-
- case 's':
- XSTR (copy, i) = XSTR (orig, i);
- break;
-
- case 't':
- XTREE (copy, i) = XTREE (orig, i);
- break;
-
- default:
- abort ();
- }
- }
-
- if (code == ASM_OPERANDS && map->orig_asm_operands_vector == 0)
- {
- map->orig_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (orig);
- map->copy_asm_operands_vector = ASM_OPERANDS_INPUT_VEC (copy);
- map->copy_asm_constraints_vector
- = ASM_OPERANDS_INPUT_CONSTRAINT_VEC (copy);
- }
-
- return copy;
-}
/* Given a pointer to some BLOCK node, if the BLOCK_ABSTRACT_ORIGIN for the
given BLOCK node is NULL, set the BLOCK_ABSTRACT_ORIGIN for the node so
diff --git a/gcc/integrate.h b/gcc/integrate.h
index 035b1d90dc1..2d6cffcbe43 100644
--- a/gcc/integrate.h
+++ b/gcc/integrate.h
@@ -21,100 +21,6 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "varray.h"
-/* This structure is used to remap objects in the function being inlined to
- those belonging to the calling function. It is passed by
- expand_inline_function to its children.
-
- This structure is also used when unrolling loops and otherwise
- replicating code, although not all fields are needed in this case;
- only those fields needed by copy_rtx_and_substitute() and its children
- are used.
-
- This structure is used instead of static variables because
- expand_inline_function may be called recursively via expand_expr. */
-
-struct inline_remap
-{
- /* Definition of function be inlined. */
- tree fndecl;
- /* Place to put insns needed at start of function. */
- rtx insns_at_start;
- /* Mapping from old registers to new registers.
- It is allocated and deallocated in `expand_inline_function' */
- rtx *reg_map;
- /* Mapping from old code-labels to new code-labels.
- The first element of this map is label_map[min_labelno]. */
- rtx *label_map;
- /* Mapping from old insn uid's to copied insns. The first element
- of this map is insn_map[min_insnno]; the last element is
- insn_map[max_insnno]. We keep the bounds here for when the map
- only covers a partial range of insns (such as loop unrolling or
- code replication). */
- rtx *insn_map;
- int min_insnno, max_insnno;
-
- /* Map pseudo reg number in calling function to equivalent constant. We
- cannot in general substitute constants into parameter pseudo registers,
- since some machine descriptions (many RISCs) won't always handle
- the resulting insns. So if an incoming parameter has a constant
- equivalent, we record it here, and if the resulting insn is
- recognizable, we go with it.
-
- We also use this mechanism to convert references to incoming arguments
- and stacked variables. copy_rtx_and_substitute will replace the virtual
- incoming argument and virtual stacked variables registers with new
- pseudos that contain pointers into the replacement area allocated for
- this inline instance. These pseudos are then marked as being equivalent
- to the appropriate address and substituted if valid. */
- varray_type const_equiv_varray;
- /* This is incremented for each new basic block.
- It is used to store in the age field to record the domain of validity
- of each entry in const_equiv_varray.
- A value of -1 indicates an entry for a reg which is a parm.
- All other values are "positive". */
-#define CONST_AGE_PARM (-1)
- unsigned int const_age;
-
- /* When an insn is being copied by copy_rtx_and_substitute,
- this is nonzero if we have copied an ASM_OPERANDS.
- In that case, it is the original input-operand vector. */
- rtvec orig_asm_operands_vector;
- /* When an insn is being copied by copy_rtx_and_substitute,
- this is nonzero if we have copied an ASM_OPERANDS.
- In that case, it is the copied input-operand vector. */
- rtvec copy_asm_operands_vector;
- /* Likewise, this is the copied constraints vector. */
- rtvec copy_asm_constraints_vector;
-
- /* Indications for regs being pointers and their alignment. */
- unsigned char *regno_pointer_align;
- rtx *x_regno_reg_rtx;
-
- /* The next few fields are used for subst_constants to record the SETs
- that it saw. */
- int num_sets;
- struct equiv_table
- {
- rtx dest;
- rtx equiv;
- } equiv_sets[MAX_RECOG_OPERANDS];
- /* Record the last thing assigned to pc. This is used for folded
- conditional branch insns. */
- rtx last_pc_value;
-#ifdef HAVE_cc0
- /* Record the last thing assigned to cc0. */
- rtx last_cc0_value;
-#endif
- /* Note mode of COMPARE if the mode would be otherwise lost (comparing of
- two VOIDmode constants. */
- rtx compare_src;
- enum machine_mode compare_mode;
-};
-
-/* Return a copy of an rtx (as needed), substituting pseudo-register,
- labels, and frame-pointer offsets as necessary. */
-extern rtx copy_rtx_and_substitute (rtx, struct inline_remap *, int);
-
/* Return a pseudo that corresponds to the value in the specified hard
reg as of the start of the function (for inlined functions, the
value at the start of the parent function). */
@@ -142,35 +48,3 @@ extern tree copy_decl_for_inlining (tree, tree, tree);
true otherwise. */
extern bool function_attribute_inlinable_p (tree);
-/* Return the label indicated. */
-extern rtx get_label_from_map (struct inline_remap *, int);
-
-/* Set the label indicated. */
-#define set_label_in_map(MAP, I, X) ((MAP)->label_map[I] = (X))
-
-/* Unfortunately, we need a global copy of const_equiv varray for
- communication with a function called from note_stores. Be *very*
- careful that this is used properly in the presence of recursion. */
-
-extern varray_type global_const_equiv_varray;
-
-#define MAYBE_EXTEND_CONST_EQUIV_VARRAY(MAP,MAX) \
- { \
- if ((size_t)(MAX) >= VARRAY_SIZE ((MAP)->const_equiv_varray)) \
- { \
- int is_global = (global_const_equiv_varray \
- == (MAP)->const_equiv_varray); \
- VARRAY_GROW ((MAP)->const_equiv_varray, (MAX)+1); \
- if (is_global) \
- global_const_equiv_varray = (MAP)->const_equiv_varray; \
- } \
- }
-
-#define SET_CONST_EQUIV_DATA(MAP,REG,RTX,AGE) \
- { \
- struct const_equiv_data *p; \
- MAYBE_EXTEND_CONST_EQUIV_VARRAY ((MAP), REGNO (REG)); \
- p = &VARRAY_CONST_EQUIV ((MAP)->const_equiv_varray, REGNO (REG)); \
- p->rtx = (RTX); \
- p->age = (AGE); \
- }
diff --git a/gcc/reg-stack.c b/gcc/reg-stack.c
index c09f76e48a4..d5983bbaf18 100644
--- a/gcc/reg-stack.c
+++ b/gcc/reg-stack.c
@@ -265,7 +265,6 @@ static int convert_regs_2 (FILE *, basic_block);
static int convert_regs (FILE *);
static void print_stack (FILE *, stack);
static rtx next_flags_user (rtx);
-static void record_label_references (rtx, rtx);
static bool compensate_edge (edge, FILE *);
/* Return nonzero if any stack register is mentioned somewhere within PAT. */
@@ -491,58 +490,7 @@ reg_to_stack (FILE *file)
free_aux_for_blocks ();
return true;
}
-
-/* Check PAT, which is in INSN, for LABEL_REFs. Add INSN to the
- label's chain of references, and note which insn contains each
- reference. */
-
-static void
-record_label_references (rtx insn, rtx pat)
-{
- enum rtx_code code = GET_CODE (pat);
- int i;
- const char *fmt;
-
- if (code == LABEL_REF)
- {
- rtx label = XEXP (pat, 0);
- rtx ref;
-
- gcc_assert (LABEL_P (label));
-
- /* If this is an undefined label, LABEL_REFS (label) contains
- garbage. */
- if (INSN_UID (label) == 0)
- return;
-
- /* Don't make a duplicate in the code_label's chain. */
- for (ref = LABEL_REFS (label);
- ref && ref != label;
- ref = LABEL_NEXTREF (ref))
- if (CONTAINING_INSN (ref) == insn)
- return;
-
- CONTAINING_INSN (pat) = insn;
- LABEL_NEXTREF (pat) = LABEL_REFS (label);
- LABEL_REFS (label) = pat;
-
- return;
- }
-
- fmt = GET_RTX_FORMAT (code);
- for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
- {
- if (fmt[i] == 'e')
- record_label_references (insn, XEXP (pat, i));
- if (fmt[i] == 'E')
- {
- int j;
- for (j = 0; j < XVECLEN (pat, i); j++)
- record_label_references (insn, XVECEXP (pat, i, j));
- }
- }
-}
/* Return a pointer to the REG expression within PAT. If PAT is not a
REG, possible enclosed by a conversion rtx, return the inner part of
diff --git a/gcc/rtl.def b/gcc/rtl.def
index 61cb811fc22..c20f61bdd4b 100644
--- a/gcc/rtl.def
+++ b/gcc/rtl.def
@@ -331,7 +331,9 @@ DEF_RTL_EXPR(CONST, "const", "e", RTX_CONST_OBJ)
by a SET whose first operand is (PC). */
DEF_RTL_EXPR(PC, "pc", "", RTX_OBJ)
-/* Used in the cselib routines to describe a value. */
+/* Used in the cselib routines to describe a value. Objects of this
+ kind are only allocated in cselib.c, in an alloc pool instead of
+ in GC memory. The only operand of a VALUE is a cselib_val_struct. */
DEF_RTL_EXPR(VALUE, "value", "0", RTX_OBJ)
/* A register. The "operand" is the register number, accessed with
@@ -387,9 +389,8 @@ DEF_RTL_EXPR(MEM, "mem", "e0", RTX_OBJ)
/* Reference to an assembler label in the code for this function.
The operand is a CODE_LABEL found in the insn chain.
- The unprinted fields 1 and 2 are used in flow.c for the
- LABEL_NEXTREF and CONTAINING_INSN. */
-DEF_RTL_EXPR(LABEL_REF, "label_ref", "u00", RTX_CONST_OBJ)
+ The unprinted field 1 is used in flow.c for the LABEL_NEXTREF. */
+DEF_RTL_EXPR(LABEL_REF, "label_ref", "u0", RTX_CONST_OBJ)
/* Reference to a named label:
Operand 0: label name
diff --git a/gcc/rtl.h b/gcc/rtl.h
index f8ca1c3e2f8..2ff874bd7a3 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -220,16 +220,11 @@ struct rtx_def GTY((chain_next ("RTX_NEXT (&%h)"),
promoted mode.
1 in a CODE_LABEL if the label is used for nonlocal gotos
and must not be deleted even if its count is zero.
- 1 in a LABEL_REF if this is a reference to a label outside the
- current loop.
1 in an INSN, JUMP_INSN or CALL_INSN if this insn must be scheduled
together with the preceding insn. Valid only within sched.
1 in an INSN, JUMP_INSN, or CALL_INSN if insn is in a delay slot and
from the target of a branch. Valid from reorg until end of compilation;
- cleared before used.
- 1 in an INSN, JUMP_INSN or CALL_INSN or related rtx if this insn is
- dead code. Valid only during dead-code elimination phase; cleared
- before use. */
+ cleared before used. */
unsigned int in_struct : 1;
/* At the end of RTL generation, 1 if this rtx is used. This is used for
copying shared structure. See `unshare_all_rtl'.
@@ -642,7 +637,6 @@ do { \
#define XCBITMAP(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_bit)
#define XCTREE(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_tree)
#define XCBBDEF(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_bb)
-#define XCADVFLAGS(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_addr_diff_vec_flags)
#define XCCSELIB(RTX, N, C) (RTL_CHECKC1 (RTX, N, C).rt_cselib)
#define XCVECEXP(RTX, N, M, C) RTVEC_ELT (XCVEC (RTX, N, C), M)
@@ -698,11 +692,6 @@ do { \
#define INSN_ANNULLED_BRANCH_P(RTX) \
(RTL_FLAG_CHECK3("INSN_ANNULLED_BRANCH_P", (RTX), JUMP_INSN, CALL_INSN, INSN)->unchanging)
-/* 1 if RTX is an insn that is dead code. Valid only for dead-code
- elimination phase. */
-#define INSN_DEAD_CODE_P(RTX) \
- (RTL_FLAG_CHECK3("INSN_DEAD_CODE_P", (RTX), INSN, CALL_INSN, JUMP_INSN)->in_struct)
-
/* 1 if RTX is an insn in a delay slot and is from the target of the branch.
If the branch insn has INSN_ANNULLED_BRANCH_P set, this insn should only be
executed if the branch is taken. For annulled branches with this bit
@@ -710,8 +699,12 @@ do { \
#define INSN_FROM_TARGET_P(RTX) \
(RTL_FLAG_CHECK3("INSN_FROM_TARGET_P", (RTX), INSN, JUMP_INSN, CALL_INSN)->in_struct)
+/* In an ADDR_DIFF_VEC, the flags for RTX for use by branch shortening.
+ See the comments for ADDR_DIFF_VEC in rtl.def. */
#define ADDR_DIFF_VEC_FLAGS(RTX) X0ADVFLAGS(RTX, 4)
+/* In a VALUE, the value cselib has assigned to RTX.
+ This is a "struct cselib_val_struct", see cselib.h. */
#define CSELIB_VAL_PTR(RTX) X0CSELIB(RTX, 0)
/* Holds a list of notes on what this insn does to various REGs.
@@ -719,7 +712,6 @@ do { \
chain pointer and the first operand is the REG being described.
The mode field of the EXPR_LIST contains not a real machine mode
but a value from enum reg_note. */
-
#define REG_NOTES(INSN) XEXP(INSN, 8)
enum reg_note
@@ -757,8 +749,6 @@ extern const char * const reg_note_name[];
Label numbers are unique in a compilation. */
#define CODE_LABEL_NUMBER(INSN) XINT (INSN, 6)
-#define LINE_NUMBER NOTE
-
/* In a NOTE that is a line number, this is a string for the file name that the
line is in. We use the same field to record block numbers temporarily in
NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes. (We avoid lots of casts
@@ -908,15 +898,11 @@ enum label_kind
/* This is the field in the LABEL_REF through which the circular chain
of references to a particular label is linked.
- This chain is set up in flow.c. */
-
+ FIXME: This chain is used in loop.c and in the SH backend.
+ Since loop.c is about to go away, it could be a win to replace
+ the uses of this in the SH backend with something else. */
#define LABEL_NEXTREF(REF) XCEXP (REF, 1, LABEL_REF)
-/* Once basic blocks are found in flow.c,
- Each LABEL_REF points to its containing instruction with this field. */
-
-#define CONTAINING_INSN(RTX) XCEXP (RTX, 2, LABEL_REF)
-
/* For a REG rtx, REGNO extracts the register number. ORIGINAL_REGNO holds
the number the register originally had; for a pseudo register turned into
a hard reg this will hold the old pseudo register number. */
@@ -948,7 +934,6 @@ enum label_kind
#define HARD_REGISTER_NUM_P(REG_NO) ((REG_NO) < FIRST_PSEUDO_REGISTER)
/* For a CONST_INT rtx, INTVAL extracts the integer. */
-
#define INTVAL(RTX) XCWINT(RTX, 0, CONST_INT)
/* For a CONST_DOUBLE:
@@ -1162,10 +1147,6 @@ do { \
#define LABEL_PRESERVE_P(RTX) \
(RTL_FLAG_CHECK2("LABEL_PRESERVE_P", (RTX), CODE_LABEL, NOTE)->in_struct)
-/* 1 if RTX is a reg that is used only in an exit test of a loop. */
-#define REG_LOOP_TEST_P(RTX) \
- (RTL_FLAG_CHECK1("REG_LOOP_TEST_P", (RTX), REG)->in_struct)
-
/* During sched, 1 if RTX is an insn that must be scheduled together
with the preceding insn. */
#define SCHED_GROUP_P(RTX) \
diff --git a/gcc/varray.c b/gcc/varray.c
index ce3503b8bcd..e80827a5ce6 100644
--- a/gcc/varray.c
+++ b/gcc/varray.c
@@ -113,7 +113,6 @@ static const struct {
{ sizeof (union tree_node *), 1 },
{ sizeof (struct bitmap_head_def *), 1 },
{ sizeof (struct reg_info_def *), 0 },
- { sizeof (struct const_equiv_data), 0 },
{ sizeof (struct basic_block_def *), 1 },
{ sizeof (struct elt_list *), 1 },
{ sizeof (struct edge_def *), 1 },
diff --git a/gcc/varray.h b/gcc/varray.h
index f1012f4a5c4..c896fe23a33 100644
--- a/gcc/varray.h
+++ b/gcc/varray.h
@@ -33,30 +33,6 @@
#include "tm.h"
#endif
-/* Auxiliary structure used inside the varray structure, used for
- function integration data. */
-
-struct const_equiv_data GTY(()) {
- /* Map pseudo reg number in calling function to equivalent constant. We
- cannot in general substitute constants into parameter pseudo registers,
- since some machine descriptions (many RISCs) won't always handle
- the resulting insns. So if an incoming parameter has a constant
- equivalent, we record it here, and if the resulting insn is
- recognizable, we go with it.
-
- We also use this mechanism to convert references to incoming arguments
- and stacked variables. copy_rtx_and_substitute will replace the virtual
- incoming argument and virtual stacked variables registers with new
- pseudos that contain pointers into the replacement area allocated for
- this inline instance. These pseudos are then marked as being equivalent
- to the appropriate address and substituted if valid. */
- rtx rtx;
-
- /* Record the valid age for each entry. The entry is invalid if its
- age is less than const_age. */
- unsigned age;
-};
-
/* Enum indicating what the varray contains.
If this is changed, `element' in varray.c needs to be updated. */
@@ -79,7 +55,6 @@ enum varray_data_enum {
VARRAY_DATA_TREE,
VARRAY_DATA_BITMAP,
VARRAY_DATA_REG,
- VARRAY_DATA_CONST_EQUIV,
VARRAY_DATA_BB,
VARRAY_DATA_TE,
VARRAY_DATA_EDGE,
@@ -125,8 +100,6 @@ typedef union varray_data_tag GTY (()) {
tag ("VARRAY_DATA_BITMAP"))) bitmap[1];
struct reg_info_def *GTY ((length ("%0.num_elements"), skip,
tag ("VARRAY_DATA_REG"))) reg[1];
- struct const_equiv_data GTY ((length ("%0.num_elements"),
- tag ("VARRAY_DATA_CONST_EQUIV"))) const_equiv[1];
struct basic_block_def *GTY ((length ("%0.num_elements"), skip,
tag ("VARRAY_DATA_BB"))) bb[1];
struct elt_list *GTY ((length ("%0.num_elements"),
@@ -207,9 +180,6 @@ extern varray_type varray_init (size_t, enum varray_data_enum, const char *);
#define VARRAY_REG_INIT(va, num, name) \
va = varray_init (num, VARRAY_DATA_REG, name)
-#define VARRAY_CONST_EQUIV_INIT(va, num, name) \
- va = varray_init (num, VARRAY_DATA_CONST_EQUIV, name)
-
#define VARRAY_BB_INIT(va, num, name) \
va = varray_init (num, VARRAY_DATA_BB, name)
@@ -298,7 +268,6 @@ extern void varray_underflow (varray_type, const char *, int, const char *)
#define VARRAY_TREE(VA, N) VARRAY_CHECK (VA, N, tree)
#define VARRAY_BITMAP(VA, N) VARRAY_CHECK (VA, N, bitmap)
#define VARRAY_REG(VA, N) VARRAY_CHECK (VA, N, reg)
-#define VARRAY_CONST_EQUIV(VA, N) VARRAY_CHECK (VA, N, const_equiv)
#define VARRAY_BB(VA, N) VARRAY_CHECK (VA, N, bb)
#define VARRAY_ELT_LIST(VA, N) VARRAY_CHECK (VA, N, te)
#define VARRAY_EDGE(VA, N) VARRAY_CHECK (VA, N, e)
@@ -323,7 +292,6 @@ extern void varray_underflow (varray_type, const char *, int, const char *)
#define VARRAY_PUSH_TREE(VA, X) VARRAY_PUSH (VA, tree, X)
#define VARRAY_PUSH_BITMAP(VA, X) VARRAY_PUSH (VA, bitmap, X)
#define VARRAY_PUSH_REG(VA, X) VARRAY_PUSH (VA, reg, X)
-#define VARRAY_PUSH_CONST_EQUIV(VA, X) VARRAY_PUSH (VA, const_equiv, X)
#define VARRAY_PUSH_BB(VA, X) VARRAY_PUSH (VA, bb, X)
#define VARRAY_PUSH_EDGE(VA, X) VARRAY_PUSH (VA, e, X)
#define VARRAY_PUSH_TREE_PTR(VA, X) VARRAY_PUSH (VA, tp, X)
@@ -349,7 +317,6 @@ extern void varray_underflow (varray_type, const char *, int, const char *)
#define VARRAY_TOP_TREE(VA) VARRAY_TOP (VA, tree)
#define VARRAY_TOP_BITMAP(VA) VARRAY_TOP (VA, bitmap)
#define VARRAY_TOP_REG(VA) VARRAY_TOP (VA, reg)
-#define VARRAY_TOP_CONST_EQUIV(VA) VARRAY_TOP (VA, const_equiv)
#define VARRAY_TOP_BB(VA) VARRAY_TOP (VA, bb)
#define VARRAY_TOP_EDGE(VA) VARRAY_TOP (VA, e)
#define VARRAY_TOP_TREE_PTR(VA) VARRAY_TOP (VA, tp)
diff --git a/gcc/web.c b/gcc/web.c
index 26835116172..97ac74f3287 100644
--- a/gcc/web.c
+++ b/gcc/web.c
@@ -201,7 +201,6 @@ entry_register (struct web_entry *entry, struct ref *ref, char *used)
newreg = gen_reg_rtx (GET_MODE (reg));
REG_USERVAR_P (newreg) = REG_USERVAR_P (reg);
REG_POINTER (newreg) = REG_POINTER (reg);
- REG_LOOP_TEST_P (newreg) = REG_LOOP_TEST_P (reg);
REG_ATTRS (newreg) = REG_ATTRS (reg);
if (dump_file)
fprintf (dump_file, "Web oldreg=%i newreg=%i\n", REGNO (reg),