aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>2000-05-17 21:01:07 +0000
committerRichard Henderson <rth@cygnus.com>2000-05-17 21:01:07 +0000
commiteef9ecb84632fc1cd18f1f2185b71f01d3fee776 (patch)
tree29b79c5c989692d01b7a5e6d73a5c535c51e4e48
parent5626b85b1d367c69340add9f16ad833468f64aa3 (diff)
* toplev.c (rest_of_compilation): Don't call optimize_mode_switching
unless OPTIMIZE_MODE_SWITCHING. Conditionally set no_new_pseudos. Don't call recompute_reg_usage if no_new_pseudos is true. * lcm.c (optimize_mode_switching): Move ifdefs outside function. Return true if we did work; update global life information. * basic-block.h (optimize_mode_switching): Update decl. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@33965 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/basic-block.h2
-rw-r--r--gcc/lcm.c31
-rw-r--r--gcc/toplev.c18
4 files changed, 44 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a82a24bc4d7..577189f75aa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2000-05-17 Richard Henderson <rth@cygnus.com>
+
+ * toplev.c (rest_of_compilation): Don't call optimize_mode_switching
+ unless OPTIMIZE_MODE_SWITCHING. Conditionally set no_new_pseudos.
+ Don't call recompute_reg_usage if no_new_pseudos is true.
+ * lcm.c (optimize_mode_switching): Move ifdefs outside function.
+ Return true if we did work; update global life information.
+ * basic-block.h (optimize_mode_switching): Update decl.
+
2000-05-17 Neil Booth <neilb@earthling.net>
* cpplex.c (expand_name_space): Don't use ptrdiff_t.
diff --git a/gcc/basic-block.h b/gcc/basic-block.h
index f9eb268458a..c7ae0f86383 100644
--- a/gcc/basic-block.h
+++ b/gcc/basic-block.h
@@ -450,7 +450,7 @@ extern struct edge_list *pre_edge_rev_lcm PARAMS ((FILE *, int, sbitmap *,
sbitmap **));
extern void compute_available PARAMS ((sbitmap *, sbitmap *,
sbitmap *, sbitmap *));
-extern void optimize_mode_switching PARAMS ((FILE *));
+extern int optimize_mode_switching PARAMS ((FILE *));
/* In emit-rtl.c. */
extern rtx emit_block_insn_after PARAMS ((rtx, rtx, basic_block));
diff --git a/gcc/lcm.c b/gcc/lcm.c
index 2d054d10a94..2f9aaa8af5d 100644
--- a/gcc/lcm.c
+++ b/gcc/lcm.c
@@ -958,16 +958,14 @@ reg_becomes_live (reg, setter, live)
nregs--)
SET_HARD_REG_BIT (* (HARD_REG_SET *) live, regno + nregs);
}
-#endif
-/* Find all insns that need a particular mode
- setting, and insert the necessary mode switches. */
+/* Find all insns that need a particular mode setting, and insert the
+ necessary mode switches. Return true if we did work. */
-void
+int
optimize_mode_switching (file)
- FILE *file ATTRIBUTE_UNUSED;
+ FILE *file;
{
-#ifdef OPTIMIZE_MODE_SWITCHING
rtx insn;
int bb, e;
edge eg;
@@ -994,7 +992,7 @@ optimize_mode_switching (file)
}
if (! n_entities)
- return;
+ return 0;
#ifdef MODE_USES_IN_EXIT_BLOCK
/* For some ABIs a particular mode setting is required at function exit. */
@@ -1017,7 +1015,7 @@ optimize_mode_switching (file)
else if (NEXT_INSN (use) == BLOCK_HEAD (bb))
BLOCK_HEAD (bb) = NEXT_INSN (insn);
}
-#endif
+#endif /* MODE_USES_IN_EXIT_BLOCK */
/* Create the bitmap vectors. */
@@ -1034,7 +1032,7 @@ optimize_mode_switching (file)
struct bb_info *info = bb_info[j];
/* Determine what the first use (if any) need for a mode of entity E is.
- This will be th mode that is anticipatable for this block.
+ This will be the mode that is anticipatable for this block.
Also compute the initial transparency settings. */
for (bb = 0 ; bb < n_basic_blocks; bb++)
{
@@ -1253,5 +1251,18 @@ optimize_mode_switching (file)
if (need_commit)
commit_edge_insertions ();
-#endif /* OPTIMIZE_MODE_SWITCHING */
+
+ /* Ideally we'd figure out what blocks were affected and start from
+ there, but this is enormously complicated by commit_edge_insertions,
+ which would screw up any indicies we'd collected, and also need to
+ be involved in the update. Bail and recompute global life info for
+ everything. */
+
+ allocate_reg_life_data ();
+ update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
+ (PROP_DEATH_NOTES | PROP_KILL_DEAD_CODE
+ | PROP_SCAN_DEAD_CODE | PROP_REG_INFO));
+
+ return 1;
}
+#endif /* OPTIMIZE_MODE_SWITCHING */
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 470a6ab6314..52f6cb821a1 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -3234,12 +3234,22 @@ rest_of_compilation (decl)
ggc_collect ();
}
- if (optimize && n_basic_blocks)
+#ifdef OPTIMIZE_MODE_SWITCHING
+ if (optimize)
{
timevar_push (TV_GCSE);
- optimize_mode_switching (NULL_PTR);
+
+ if (optimize_mode_switching (NULL_PTR))
+ {
+ /* We did work, and so had to regenerate global life information.
+ Take advantage of this and don't re-recompute register life
+ information below. */
+ no_new_pseudos = 1;
+ }
+
timevar_pop (TV_GCSE);
}
+#endif
#ifdef INSN_SCHEDULING
@@ -3280,9 +3290,7 @@ rest_of_compilation (decl)
RUN_JUMP_AFTER_RELOAD records whether or not we need to rerun the
jump optimizer after register allocation and reloading are finished. */
- /* We recomputed reg usage as part of updating the rest
- of life info during sched. */
- if (! flag_schedule_insns)
+ if (! no_new_pseudos)
{
recompute_reg_usage (insns, ! optimize_size);