summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2003-03-14 20:15:13 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2003-03-14 20:15:13 +0000
commit53fffe66067d85062e7736d487e94049ffccc644 (patch)
tree3085a6e478e08536454831e0b1720bcba93526a0 /gcc
parentea0ebc5e7c406ca02b86e7ad13ae4ae16d52b001 (diff)
downloadgcc-53fffe66067d85062e7736d487e94049ffccc644.tar.gz
* cselib.c (clear_table): Do not take argument; always clear just
used slots. (cselib_process_insn): Update call of clear_table (cselib_init): Do not call clear_table. (cselib_finish): Clear table. * cse.c (count_reg_usage): Do not check side_effects_p. * rtlanal.c (set_noop_p): Check side_effects_p only when set looks like noop. (find_reg_equal_equiv_note): Do not use find_reg_note. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@64369 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/cse.c9
-rw-r--r--gcc/cselib.c19
-rw-r--r--gcc/rtlanal.c29
4 files changed, 36 insertions, 34 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c3c9ada7381..1d7dbc2318c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+Thu Mar 13 18:39:42 CET 2003 Jan Hubicka <jh@suse.cz>
+
+ * cselib.c (clear_table): Do not take argument; always clear just
+ used slots.
+ (cselib_process_insn): Update call of clear_table
+ (cselib_init): Do not call clear_table.
+ (cselib_finish): Clear table.
+
+ * cse.c (count_reg_usage): Do not check side_effects_p.
+ * rtlanal.c (set_noop_p): Check side_effects_p only when set looks
+ like noop.
+ (find_reg_equal_equiv_note): Do not use find_reg_note.
+
2003-03-14 Richard Henderson <rth@redhat.com>
PR target/9700
diff --git a/gcc/cse.c b/gcc/cse.c
index 6321c7c6dd9..9f6b96d20ce 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -7494,15 +7494,8 @@ count_reg_usage (x, counts, dest, incr)
/* Unless we are setting a REG, count everything in SET_DEST. */
if (GET_CODE (SET_DEST (x)) != REG)
count_reg_usage (SET_DEST (x), counts, NULL_RTX, incr);
-
- /* If SRC has side-effects, then we can't delete this insn, so the
- usage of SET_DEST inside SRC counts.
-
- ??? Strictly-speaking, we might be preserving this insn
- because some other SET has side-effects, but that's hard
- to do and can't happen now. */
count_reg_usage (SET_SRC (x), counts,
- side_effects_p (SET_SRC (x)) ? NULL_RTX : SET_DEST (x),
+ SET_DEST (x),
incr);
return;
diff --git a/gcc/cselib.c b/gcc/cselib.c
index 564afbaaacb..3aac058df27 100644
--- a/gcc/cselib.c
+++ b/gcc/cselib.c
@@ -49,7 +49,7 @@ static struct elt_loc_list *new_elt_loc_list PARAMS ((struct elt_loc_list *,
static void unchain_one_value PARAMS ((cselib_val *));
static void unchain_one_elt_list PARAMS ((struct elt_list **));
static void unchain_one_elt_loc_list PARAMS ((struct elt_loc_list **));
-static void clear_table PARAMS ((int));
+static void clear_table PARAMS ((void));
static int discard_useless_locs PARAMS ((void **, void *));
static int discard_useless_values PARAMS ((void **, void *));
static void remove_useless_values PARAMS ((void));
@@ -224,17 +224,12 @@ unchain_one_value (v)
which are known to have been used. */
static void
-clear_table (clear_all)
- int clear_all;
+clear_table ()
{
unsigned int i;
- if (clear_all)
- for (i = 0; i < cselib_nregs; i++)
- REG_VALUES (i) = 0;
- else
- for (i = 0; i < VARRAY_ACTIVE_SIZE (used_regs); i++)
- REG_VALUES (VARRAY_UINT (used_regs, i)) = 0;
+ for (i = 0; i < VARRAY_ACTIVE_SIZE (used_regs); i++)
+ REG_VALUES (VARRAY_UINT (used_regs, i)) = 0;
max_value_regs = 0;
@@ -1359,7 +1354,7 @@ cselib_process_insn (insn)
&& GET_CODE (PATTERN (insn)) == ASM_OPERANDS
&& MEM_VOLATILE_P (PATTERN (insn))))
{
- clear_table (0);
+ clear_table ();
return;
}
@@ -1437,8 +1432,6 @@ cselib_init ()
{
reg_values = reg_values_old;
used_regs = used_regs_old;
- VARRAY_CLEAR (reg_values);
- VARRAY_CLEAR (used_regs);
}
else
{
@@ -1447,7 +1440,6 @@ cselib_init ()
}
hash_table = htab_create_ggc (31, get_value_hash, entry_and_rtx_equal_p,
NULL);
- clear_table (1);
cselib_current_insn_in_libcall = false;
}
@@ -1456,6 +1448,7 @@ cselib_init ()
void
cselib_finish ()
{
+ clear_table ();
reg_values_old = reg_values;
reg_values = 0;
used_regs_old = used_regs;
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c
index d4817183c4e..4e604172f66 100644
--- a/gcc/rtlanal.c
+++ b/gcc/rtlanal.c
@@ -1327,19 +1327,17 @@ set_noop_p (set)
rtx src = SET_SRC (set);
rtx dst = SET_DEST (set);
- if (side_effects_p (src) || side_effects_p (dst))
- return 0;
-
- if (GET_CODE (dst) == MEM && GET_CODE (src) == MEM)
- return rtx_equal_p (dst, src);
-
if (dst == pc_rtx && src == pc_rtx)
return 1;
+ if (GET_CODE (dst) == MEM && GET_CODE (src) == MEM)
+ return rtx_equal_p (dst, src) && !side_effects_p (dst);
+
if (GET_CODE (dst) == SIGN_EXTRACT
|| GET_CODE (dst) == ZERO_EXTRACT)
return rtx_equal_p (XEXP (dst, 0), src)
- && ! BYTES_BIG_ENDIAN && XEXP (dst, 2) == const0_rtx;
+ && ! BYTES_BIG_ENDIAN && XEXP (dst, 2) == const0_rtx
+ && !side_effects_p (src);
if (GET_CODE (dst) == STRICT_LOW_PART)
dst = XEXP (dst, 0);
@@ -2018,14 +2016,19 @@ rtx
find_reg_equal_equiv_note (insn)
rtx insn;
{
- rtx note;
+ rtx link;
- if (single_set (insn) == 0)
+ if (!INSN_P (insn))
return 0;
- else if ((note = find_reg_note (insn, REG_EQUIV, NULL_RTX)) != 0)
- return note;
- else
- return find_reg_note (insn, REG_EQUAL, NULL_RTX);
+ for (link = REG_NOTES (insn); link; link = XEXP (link, 1))
+ if (REG_NOTE_KIND (link) == REG_EQUAL
+ || REG_NOTE_KIND (link) == REG_EQUIV)
+ {
+ if (single_set (insn) == 0)
+ return 0;
+ return link;
+ }
+ return NULL;
}
/* Return true if DATUM, or any overlap of DATUM, of kind CODE is found