summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>1999-11-05 00:49:03 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>1999-11-05 00:49:03 +0000
commitaeee2a4ba470685dfddec7e01b2ffff41d37c5ed (patch)
tree36caca6632c74bf9cd783c44f1c99239c1b55570
parent49fa4c0a7b6d6cee5261743243ecf3464c81152a (diff)
downloadgcc-aeee2a4ba470685dfddec7e01b2ffff41d37c5ed.tar.gz
* bitmap.h (BITMAP_XFREE): New.
* flow.c (life_analysis): Use it. (life_analysis_1): Free blocks. * combine.c (undo_commit): New. (try_combine): Use it. Don't zap undobuf.undos. (combine_instructions): Don't zap undobuf.undos; free the undobuf.frees list. * local-alloc.c (local_alloc): Free qty_phys_num_sugg. * stmt.c (cost_table_): New. (estimate_case_costs): Use it instead of xmalloc. * toplev.c (compile_file): Reuse dumpname memory instead of strdup'ing it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@30404 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog19
-rw-r--r--gcc/bitmap.h25
-rw-r--r--gcc/combine.c33
-rw-r--r--gcc/flow.c4
-rw-r--r--gcc/local-alloc.c1
-rw-r--r--gcc/stmt.c3
-rw-r--r--gcc/toplev.c14
7 files changed, 80 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e9800db9783..512eabaa706 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,22 @@
+Thu Nov 4 16:44:53 1999 Richard Henderson <rth@cygnus.com>
+
+ * bitmap.h (BITMAP_XFREE): New.
+ * flow.c (life_analysis): Use it.
+ (life_analysis_1): Free blocks.
+
+ * combine.c (undo_commit): New.
+ (try_combine): Use it. Don't zap undobuf.undos.
+ (combine_instructions): Don't zap undobuf.undos; free the
+ undobuf.frees list.
+
+ * local-alloc.c (local_alloc): Free qty_phys_num_sugg.
+
+ * stmt.c (cost_table_): New.
+ (estimate_case_costs): Use it instead of xmalloc.
+
+ * toplev.c (compile_file): Reuse dumpname memory instead
+ of strdup'ing it.
+
Thu Nov 4 16:36:44 1999 Richard Henderson <rth@cygnus.com>
* reg-stack.c (convert_regs_1): Initialize target_stack->top
diff --git a/gcc/bitmap.h b/gcc/bitmap.h
index 9b8875a0185..99f45492e22 100644
--- a/gcc/bitmap.h
+++ b/gcc/bitmap.h
@@ -119,13 +119,24 @@ extern void debug_bitmap PROTO((bitmap));
bitmap_initialize ((bitmap) xmalloc (sizeof (bitmap_head)))
/* Do any cleanup needed on a bitmap when it is no longer used. */
-#define BITMAP_FREE(BITMAP) \
-do { \
- if (BITMAP) \
- { \
- bitmap_clear (BITMAP); \
- (BITMAP) = 0; \
- } \
+#define BITMAP_FREE(BITMAP) \
+do { \
+ if (BITMAP) \
+ { \
+ bitmap_clear (BITMAP); \
+ (BITMAP) = 0; \
+ } \
+} while (0)
+
+/* Do any cleanup needed on an xmalloced bitmap when it is no longer used. */
+#define BITMAP_XFREE(BITMAP) \
+do { \
+ if (BITMAP) \
+ { \
+ bitmap_clear (BITMAP); \
+ free (BITMAP); \
+ (BITMAP) = 0; \
+ } \
} while (0)
/* Do any one-time initializations needed for bitmaps. */
diff --git a/gcc/combine.c b/gcc/combine.c
index 951930d048a..4a1cb0ee62c 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -361,6 +361,7 @@ static int combinable_i3pat PROTO((rtx, rtx *, rtx, rtx, int, rtx *));
static int contains_muldiv PROTO((rtx));
static rtx try_combine PROTO((rtx, rtx, rtx));
static void undo_all PROTO((void));
+static void undo_commit PROTO((void));
static rtx *find_split_point PROTO((rtx *, rtx));
static rtx subst PROTO((rtx, rtx, rtx, int, int));
static rtx combine_simplify_rtx PROTO((rtx, enum machine_mode, int, int));
@@ -495,7 +496,6 @@ combine_instructions (f, nregs)
combine_merges = 0;
combine_extras = 0;
combine_successes = 0;
- undobuf.undos = undobuf.previous_undos = 0;
combine_max_regno = nregs;
@@ -717,6 +717,16 @@ combine_instructions (f, nregs)
free (reg_last_set_sign_bit_copies);
free (uid_cuid);
+ {
+ struct undo *undo, *next;
+ for (undo = undobuf.frees; undo; undo = next)
+ {
+ next = undo->next;
+ free (undo);
+ }
+ undobuf.frees = 0;
+ }
+
total_attempts += combine_attempts;
total_merges += combine_merges;
total_extras += combine_extras;
@@ -1461,8 +1471,6 @@ try_combine (i3, i2, i1)
return 0;
combine_attempts++;
-
- undobuf.undos = undobuf.previous_undos = 0;
undobuf.other_insn = 0;
/* Save the current high-water-mark so we can free storage if we didn't
@@ -2620,6 +2628,7 @@ try_combine (i3, i2, i1)
}
combine_successes++;
+ undo_commit ();
/* Clear this here, so that subsequent get_last_value calls are not
affected. */
@@ -2659,6 +2668,24 @@ undo_all ()
affected. */
subst_prev_insn = NULL_RTX;
}
+
+/* We've committed to accepting the changes we made. Move all
+ of the undos to the free list. */
+
+static void
+undo_commit ()
+{
+ struct undo *undo, *next;
+
+ for (undo = undobuf.undos; undo; undo = next)
+ {
+ next = undo->next;
+ undo->next = undobuf.frees;
+ undobuf.frees = undo;
+ }
+ undobuf.undos = undobuf.previous_undos = 0;
+}
+
/* Find the innermost point within the rtx at LOC, possibly LOC itself,
where we have an arithmetic expression and return that point. LOC will
diff --git a/gcc/flow.c b/gcc/flow.c
index d2d50914b10..43688ae11d3 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -2466,8 +2466,7 @@ life_analysis (f, nregs, file, remove_dead_code)
if (file)
dump_flow_info (file);
- BITMAP_FREE (uid_volatile);
- free (uid_volatile);
+ BITMAP_XFREE (uid_volatile);
free_basic_block_vars (1);
}
@@ -2940,6 +2939,7 @@ life_analysis_1 (f, nregs, flags)
blocks = sbitmap_alloc (n_basic_blocks);
sbitmap_ones (blocks);
calculate_global_regs_live (blocks, blocks, flags & PROP_SCAN_DEAD_CODE);
+ sbitmap_free (blocks);
}
/* The only pseudos that are live at the beginning of the function are
diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c
index 3578f859794..a135cad07d7 100644
--- a/gcc/local-alloc.c
+++ b/gcc/local-alloc.c
@@ -420,6 +420,7 @@ local_alloc ()
free (qty_phys_copy_sugg);
free (qty_phys_num_copy_sugg);
free (qty_phys_sugg);
+ free (qty_phys_num_sugg);
free (qty_birth);
free (qty_death);
free (qty_first_reg);
diff --git a/gcc/stmt.c b/gcc/stmt.c
index f38b94fc942..17a2402c37c 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -106,6 +106,7 @@ typedef struct case_node *case_node_ptr;
/* These are used by estimate_case_costs and balance_case_nodes. */
/* This must be a signed type, and non-ANSI compilers lack signed char. */
+static short cost_table_[129];
static short *cost_table;
static int use_cost_table;
@@ -5694,7 +5695,7 @@ estimate_case_costs (node)
if (cost_table == NULL)
{
- cost_table = ((short *) xcalloc (129, sizeof (short))) + 1;
+ cost_table = cost_table_ + 1;
for (i = 0; i < 128; i++)
{
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 5e7dbc0a272..89bef06d70f 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -3053,13 +3053,15 @@ compile_file (name)
asm_out_file = stdout;
else
{
- int len = strlen (dump_base_name);
- register char *dumpname = (char *) xmalloc (len + 6);
- strcpy (dumpname, dump_base_name);
- strip_off_ending (dumpname, len);
- strcat (dumpname, ".s");
if (asm_file_name == 0)
- asm_file_name = xstrdup (dumpname);
+ {
+ int len = strlen (dump_base_name);
+ char *dumpname = (char *) xmalloc (len + 6);
+ memcpy (dumpname, dump_base_name, len + 1);
+ strip_off_ending (dumpname, len);
+ strcat (dumpname, ".s");
+ asm_file_name = dumpname;
+ }
if (!strcmp (asm_file_name, "-"))
asm_out_file = stdout;
else