struct loops * loop_optimizer_init (FILE *dumpfile) { struct loops *loops = xcalloc (1, sizeof (struct loops)); edge e; /* Initialize structures for layout changes. */ cfg_layout_initialize (0); /* Avoid annoying special cases of edges going to exit block. */ for (e = EXIT_BLOCK_PTR->pred; e; e = e->pred_next) if ((e->flags & EDGE_FALLTHRU) && e->src->succ->succ_next) split_edge (e); /* Find the loops. */ if (flow_loops_find (loops, LOOP_TREE) <= 1) { basic_block bb; /* No loops. */ flow_loops_free (loops); free_dominance_info (CDI_DOMINATORS); free (loops); /* Make chain. */ FOR_EACH_BB (bb) if (bb->next_bb != EXIT_BLOCK_PTR) bb->rbi->next = bb->next_bb; cfg_layout_finalize (); return NULL; }
/* Initialization of the RTL loop passes. */ static void rtl_loop_init (void) { if (dump_file) dump_flow_info (dump_file); /* Initialize structures for layout changes. */ cfg_layout_initialize (0); current_loops = loop_optimizer_init (dump_file); }
/* Initialization of the RTL loop passes. */ static unsigned int rtl_loop_init (void) { if (dump_file) dump_flow_info (dump_file, dump_flags); /* Initialize structures for layout changes. */ cfg_layout_initialize (0); current_loops = loop_optimizer_init (LOOPS_NORMAL); return 0; }
void reorder_basic_blocks (void) { int n_traces; int i; struct trace *traces; if (n_basic_blocks <= 1) return; if ((* targetm.cannot_modify_jumps_p) ()) return; timevar_push (TV_REORDER_BLOCKS); cfg_layout_initialize (); set_edge_can_fallthru_flag (); mark_dfs_back_edges (); /* We are estimating the length of uncond jump insn only once since the code for getting the insn length always returns the minimal length now. */ if (uncond_jump_length == 0) uncond_jump_length = get_uncond_jump_length (); /* We need to know some information for each basic block. */ array_size = GET_ARRAY_SIZE (last_basic_block); bbd = xmalloc (array_size * sizeof (bbro_basic_block_data)); for (i = 0; i < array_size; i++) { bbd[i].start_of_trace = -1; bbd[i].end_of_trace = -1; bbd[i].heap = NULL; bbd[i].node = NULL; } traces = xmalloc (n_basic_blocks * sizeof (struct trace)); n_traces = 0; find_traces (&n_traces, traces); connect_traces (n_traces, traces); FREE (traces); FREE (bbd); if (rtl_dump_file) dump_flow_info (rtl_dump_file); cfg_layout_finalize (); timevar_pop (TV_REORDER_BLOCKS); }
void tracer (unsigned int flags) { if (n_basic_blocks <= NUM_FIXED_BLOCKS + 1) return; cfg_layout_initialize (flags); mark_dfs_back_edges (); if (dump_file) dump_flow_info (dump_file, dump_flags); tail_duplicate (); layout_superblocks (); if (dump_file) dump_flow_info (dump_file, dump_flags); cfg_layout_finalize (); /* Merge basic blocks in duplicated traces. */ cleanup_cfg (CLEANUP_EXPENSIVE); }
void tracer (void) { if (n_basic_blocks <= 1) return; timevar_push (TV_TRACER); cfg_layout_initialize (); mark_dfs_back_edges (); if (rtl_dump_file) dump_flow_info (rtl_dump_file); tail_duplicate (); layout_superblocks (); if (rtl_dump_file) dump_flow_info (rtl_dump_file); cfg_layout_finalize (); /* Merge basic blocks in duplicated traces. */ cleanup_cfg (CLEANUP_EXPENSIVE); timevar_pop (TV_TRACER); }