summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/cfgcleanup.c2
-rw-r--r--gcc/cselib.c14
-rw-r--r--gcc/cselib.h2
-rw-r--r--gcc/gcse.c2
-rw-r--r--gcc/loop.c2
-rw-r--r--gcc/postreload.c2
-rw-r--r--gcc/sched-deps.c2
8 files changed, 29 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index d5faea05e75..d9bb157867f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2004-03-04 Jan Hubicka <jh@suse.cz>
+
+ * cfgcleanup.c (thread_jump): Update call of cselib_init.
+ * cselib.c (cselib_record_memory): New static variable.
+ (cselib_lookup_mem, cselib_record_set, cselib_record_sets):
+ Give up on memories when asked for.
+ (cselib_init): Accept new argument.
+ * cselib.h (cselib_init): Update prototype.
+ * gcse.c (local_cprop_pass): Update call of cselib_init.
+ * loop.c (load_mems): Update call of cselib_init.
+ * postreload.c (reload_cse_regs_1): Update call of cselib_init.
+ * sched-deps.c (sched_analyze): Update call of cselib_init.
+
2004-03-04 David Edelsohn <edelsohn@gnu.org>
GP <gp@qnx.com>
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index f6bf6e743d6..b2dd0937d5a 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -349,7 +349,7 @@ thread_jump (int mode, edge e, basic_block b)
return NULL;
}
- cselib_init ();
+ cselib_init (false);
/* First process all values computed in the source basic block. */
for (insn = NEXT_INSN (BB_HEAD (e->src)); insn != NEXT_INSN (BB_END (e->src));
diff --git a/gcc/cselib.c b/gcc/cselib.c
index 31a6d70a4bb..0dfb1a6c118 100644
--- a/gcc/cselib.c
+++ b/gcc/cselib.c
@@ -42,6 +42,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
#include "params.h"
#include "alloc-pool.h"
+static bool cselib_record_memory;
static int entry_and_rtx_equal_p (const void *, const void *);
static hashval_t get_value_hash (const void *);
static struct elt_list *new_elt_list (struct elt_list *, cselib_val *);
@@ -748,6 +749,7 @@ cselib_lookup_mem (rtx x, int create)
struct elt_list *l;
if (MEM_VOLATILE_P (x) || mode == BLKmode
+ || !cselib_record_memory
|| (FLOAT_MODE_P (mode) && flag_float_store))
return 0;
@@ -1201,7 +1203,8 @@ cselib_record_set (rtx dest, cselib_val *src_elt, cselib_val *dest_addr_elt)
n_useless_values--;
src_elt->locs = new_elt_loc_list (src_elt->locs, dest);
}
- else if (GET_CODE (dest) == MEM && dest_addr_elt != 0)
+ else if (GET_CODE (dest) == MEM && dest_addr_elt != 0
+ && cselib_record_memory)
{
if (src_elt->locs == 0)
n_useless_values--;
@@ -1275,7 +1278,8 @@ cselib_record_sets (rtx insn)
sets[i].dest = dest = XEXP (dest, 0);
/* We don't know how to record anything but REG or MEM. */
- if (GET_CODE (dest) == REG || GET_CODE (dest) == MEM)
+ if (GET_CODE (dest) == REG
+ || (GET_CODE (dest) == MEM && cselib_record_memory))
{
rtx src = sets[i].src;
if (cond)
@@ -1320,7 +1324,8 @@ cselib_record_sets (rtx insn)
for (i = 0; i < n_sets; i++)
{
rtx dest = sets[i].dest;
- if (GET_CODE (dest) == REG || GET_CODE (dest) == MEM)
+ if (GET_CODE (dest) == REG
+ || (GET_CODE (dest) == MEM && cselib_record_memory))
cselib_record_set (dest, sets[i].src_elt, sets[i].dest_addr_elt);
}
}
@@ -1398,7 +1403,7 @@ cselib_process_insn (rtx insn)
init_alias_analysis. */
void
-cselib_init (void)
+cselib_init (bool record_memory)
{
elt_list_pool = create_alloc_pool ("elt_list",
sizeof (struct elt_list), 10);
@@ -1408,6 +1413,7 @@ cselib_init (void)
sizeof (cselib_val), 10);
value_pool = create_alloc_pool ("value",
RTX_SIZE (VALUE), 100);
+ cselib_record_memory = record_memory;
/* This is only created once. */
if (! callmem)
callmem = gen_rtx_MEM (BLKmode, const0_rtx);
diff --git a/gcc/cselib.h b/gcc/cselib.h
index 2060a81c041..3dea471ad35 100644
--- a/gcc/cselib.h
+++ b/gcc/cselib.h
@@ -64,7 +64,7 @@ struct elt_list GTY(())
};
extern cselib_val *cselib_lookup (rtx, enum machine_mode, int);
-extern void cselib_init (void);
+extern void cselib_init (bool record_memory);
extern void cselib_finish (void);
extern void cselib_process_insn (rtx);
extern enum machine_mode cselib_reg_set_mode (rtx);
diff --git a/gcc/gcse.c b/gcc/gcse.c
index 975fb1fbe2f..ce4d201b698 100644
--- a/gcc/gcse.c
+++ b/gcc/gcse.c
@@ -4407,7 +4407,7 @@ local_cprop_pass (int alter_jumps)
rtx libcall_stack[MAX_NESTED_LIBCALLS + 1], *libcall_sp;
bool changed = false;
- cselib_init ();
+ cselib_init (false);
libcall_sp = &libcall_stack[MAX_NESTED_LIBCALLS];
*libcall_sp = 0;
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
diff --git a/gcc/loop.c b/gcc/loop.c
index d4e891007c2..c4ca250b910 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -9797,7 +9797,7 @@ load_mems (const struct loop *loop)
;
prev_ebb_head = p;
- cselib_init ();
+ cselib_init (true);
/* Build table of mems that get set to constant values before the
loop. */
diff --git a/gcc/postreload.c b/gcc/postreload.c
index 4a09421ffbf..26404e3c5bd 100644
--- a/gcc/postreload.c
+++ b/gcc/postreload.c
@@ -181,7 +181,7 @@ reload_cse_regs_1 (rtx first)
rtx insn;
rtx testreg = gen_rtx_REG (VOIDmode, -1);
- cselib_init ();
+ cselib_init (true);
init_alias_analysis ();
for (insn = first; insn; insn = NEXT_INSN (insn))
diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index ccd9a32f915..754142f137c 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -1156,7 +1156,7 @@ sched_analyze (struct deps *deps, rtx head, rtx tail)
rtx loop_notes = 0;
if (current_sched_info->use_cselib)
- cselib_init ();
+ cselib_init (true);
for (insn = head;; insn = NEXT_INSN (insn))
{