diff options
Diffstat (limited to 'gcc/tree-ssa-loop.c')
-rw-r--r-- | gcc/tree-ssa-loop.c | 155 |
1 files changed, 153 insertions, 2 deletions
diff --git a/gcc/tree-ssa-loop.c b/gcc/tree-ssa-loop.c index e5ec3f37066..4c3d29126fc 100644 --- a/gcc/tree-ssa-loop.c +++ b/gcc/tree-ssa-loop.c @@ -37,6 +37,10 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "flags.h" #include "tree-inline.h" #include "tree-scalar-evolution.h" +/* APPLE LOCAL begin lno */ +#include "tree-data-ref.h" +#include "function.h" +/* APPLE LOCAL end lno */ /* The loop tree currently optimized. */ @@ -45,7 +49,8 @@ struct loops *current_loops; /* Initializes the loop structures. DUMP is the file to that the details about the analysis should be dumped. */ -static struct loops * +/* APPLE LOCAL lno */ +struct loops * tree_loop_optimizer_init (FILE *dump) { struct loops *loops = loop_optimizer_init (dump); @@ -193,6 +198,116 @@ struct tree_opt_pass pass_unswitch = 0 /* letter */ }; +/* APPLE LOCAL begin lno */ +/* A pass for testing of loop infrastructure. */ + +static void +tree_ssa_loop_test (void) +{ + if (!current_loops) + return; + + scev_analysis (); + analyze_all_data_dependences (current_loops); +} + +static bool +gate_tree_ssa_loop_test (void) +{ + return flag_tree_ssa_loop_test != 0; +} + +struct tree_opt_pass pass_loop_test = +{ + "lptest", /* name */ + gate_tree_ssa_loop_test, /* gate */ + tree_ssa_loop_test, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + 0, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0, /* todo_flags_finish */ + 0 +}; + +/* Marks loops that cannot be removed in DCE, since they are possibly + infinite. */ + +static void +tree_mark_maybe_inf_loops (void) +{ + if (!current_loops) + return; + + cfun->marked_maybe_inf_loops = 1; + mark_maybe_infinite_loops (current_loops); +} + +static bool +gate_tree_mark_maybe_inf_loops (void) +{ + return (flag_tree_dce != 0 && optimize >= 2); +} + +struct tree_opt_pass pass_mark_maybe_inf_loops = +{ + "miloops", /* name */ + gate_tree_mark_maybe_inf_loops, /* gate */ + tree_mark_maybe_inf_loops, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_MARK_MILOOPS, /* tv_id */ + PROP_cfg | PROP_ssa, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_dump_func, /* todo_flags_finish */ + 0 +}; + +/* APPLE LOCAL end lno */ + +/* APPLE LOCAL begin loops-to-memset */ +/* Loops to memset pass. */ + +static void +tree_ssa_loop_memset (void) +{ + if (!current_loops) + return; + + tree_ssa_memset (current_loops); +} + +static bool +gate_tree_ssa_loop_memset (void) +{ + return flag_tree_loop_memset != 0; +} + +struct tree_opt_pass pass_memset = +{ + "memset", /* name */ + gate_tree_ssa_loop_memset, /* gate */ + tree_ssa_loop_memset, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_LIM, /* tv_id */ + PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_dump_func, /* todo_flags_finish */ + 0 /* letter */ +}; +/* APPLE LOCAL end loops-to-memset */ + /* Loop autovectorization. */ static void @@ -263,6 +378,42 @@ struct tree_opt_pass pass_linear_transform = 0 /* letter */ }; +/* APPLE LOCAL begin lno */ +/* Prefetching. */ + +static void +tree_ssa_loop_prefetch (void) +{ + if (!current_loops) + return; + + tree_ssa_prefetch_arrays (current_loops); +} + +static bool +gate_tree_ssa_loop_prefetch (void) +{ + return flag_prefetch_loop_arrays != 0; +} + +struct tree_opt_pass pass_loop_prefetch = +{ + "prefetch", /* name */ + gate_tree_ssa_loop_prefetch, /* gate */ + tree_ssa_loop_prefetch, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_TREE_PREFETCH, /* tv_id */ + PROP_cfg | PROP_ssa, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_dump_func, /* todo_flags_finish */ + 0 +}; +/* APPLE LOCAL end lno */ + /* Canonical induction variable creation pass. */ static void @@ -340,7 +491,7 @@ tree_complete_unroll (void) static bool gate_tree_complete_unroll (void) { - return flag_unroll_loops != 0; + return flag_peel_loops || flag_unroll_loops; } struct tree_opt_pass pass_complete_unroll = |