+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.
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;
}
if (! n_entities)
- return;
+ return 0;
#ifdef MODE_USES_IN_EXIT_BLOCK
/* For some ABIs a particular mode setting is required at function exit. */
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. */
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++)
{
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 */
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
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);