aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cfglayout.c54
-rw-r--r--gcc/passes.c2
-rw-r--r--gcc/tree-pass.h3
4 files changed, 68 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 17fadea..a9abd65 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2007-03-12 Steven Bosscher <steven@gcc.gnu.org>
+
+ * tree-pass.h (pass_into_cfg_layout_mode,
+ pass_outof_cfg_layout_mode): Declare.
+ * cfglayout.c (into_cfg_layout_mode, outof_cfg_layout_mode,
+ pass_into_cfg_layout_mode, pass_outof_cfg_layout_mode): New.
+ * passes.c (pass_into_cfg_layout_mode): Schedule before jump2.
+ (pass_outof_cfg_layout_mode): Schedule after pass_rtl_ifcvt.
+
2007-03-12 Seongbae Park <seongbae.park@gmail.com>
* c-decl.c (warn_variable_length_array): New function.
diff --git a/gcc/cfglayout.c b/gcc/cfglayout.c
index bbdd7a2..545cc5d 100644
--- a/gcc/cfglayout.c
+++ b/gcc/cfglayout.c
@@ -347,6 +347,60 @@ struct tree_opt_pass pass_insn_locators_initialize =
0 /* letter */
};
+static unsigned int
+into_cfg_layout_mode (void)
+{
+ cfg_layout_initialize (0);
+ return 0;
+}
+
+static unsigned int
+outof_cfg_layout_mode (void)
+{
+ basic_block bb;
+
+ FOR_EACH_BB (bb)
+ if (bb->next_bb != EXIT_BLOCK_PTR)
+ bb->aux = bb->next_bb;
+
+ cfg_layout_finalize ();
+
+ return 0;
+}
+
+struct tree_opt_pass pass_into_cfg_layout_mode =
+{
+ "into_cfglayout", /* name */
+ NULL, /* gate */
+ into_cfg_layout_mode, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ 0, /* tv_id */
+ 0, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_dump_func, /* todo_flags_finish */
+ 0 /* letter */
+};
+
+struct tree_opt_pass pass_outof_cfg_layout_mode =
+{
+ "outof_cfglayout", /* name */
+ NULL, /* gate */
+ outof_cfg_layout_mode, /* execute */
+ NULL, /* sub */
+ NULL, /* next */
+ 0, /* static_pass_number */
+ 0, /* tv_id */
+ 0, /* properties_required */
+ 0, /* properties_provided */
+ 0, /* properties_destroyed */
+ 0, /* todo_flags_start */
+ TODO_dump_func, /* todo_flags_finish */
+ 0 /* letter */
+};
/* For each lexical block, set BLOCK_NUMBER to the depth at which it is
found in the block tree. */
diff --git a/gcc/passes.c b/gcc/passes.c
index 28bda44..b93cc6c 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -658,6 +658,7 @@ init_optimization_passes (void)
NEXT_PASS (pass_initial_value_sets);
NEXT_PASS (pass_unshare_all_rtl);
NEXT_PASS (pass_instantiate_virtual_regs);
+ NEXT_PASS (pass_into_cfg_layout_mode);
NEXT_PASS (pass_jump2);
NEXT_PASS (pass_lower_subreg);
NEXT_PASS (pass_cse);
@@ -665,6 +666,7 @@ init_optimization_passes (void)
NEXT_PASS (pass_gcse);
NEXT_PASS (pass_jump_bypass);
NEXT_PASS (pass_rtl_ifcvt);
+ NEXT_PASS (pass_outof_cfg_layout_mode);
NEXT_PASS (pass_tracer);
/* Perform loop optimizations. It might be better to do them a bit
sooner, but we want the profile feedback to work more
diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
index 6d4f707..ed4fb47 100644
--- a/gcc/tree-pass.h
+++ b/gcc/tree-pass.h
@@ -344,6 +344,9 @@ extern struct tree_opt_pass pass_profiling;
extern struct tree_opt_pass pass_rtl_ifcvt;
extern struct tree_opt_pass pass_tracer;
+extern struct tree_opt_pass pass_into_cfg_layout_mode;
+extern struct tree_opt_pass pass_outof_cfg_layout_mode;
+
extern struct tree_opt_pass pass_loop2;
extern struct tree_opt_pass pass_rtl_loop_init;
extern struct tree_opt_pass pass_rtl_move_loop_invariants;