struct edge_list * pre_edge_lcm_avs (int n_exprs, sbitmap *transp, sbitmap *avloc, sbitmap *antloc, sbitmap *kill, sbitmap *avin, sbitmap *avout, sbitmap **insert, sbitmap **del) { sbitmap *antin, *antout, *earliest; sbitmap *later, *laterin; struct edge_list *edge_list; int num_edges; edge_list = create_edge_list (); num_edges = NUM_EDGES (edge_list); #ifdef LCM_DEBUG_INFO if (dump_file) { fprintf (dump_file, "Edge List:\n"); verify_edge_list (dump_file, edge_list); print_edge_list (dump_file, edge_list); dump_bitmap_vector (dump_file, "transp", "", transp, last_basic_block_for_fn (cfun)); dump_bitmap_vector (dump_file, "antloc", "", antloc, last_basic_block_for_fn (cfun)); dump_bitmap_vector (dump_file, "avloc", "", avloc, last_basic_block_for_fn (cfun)); dump_bitmap_vector (dump_file, "kill", "", kill, last_basic_block_for_fn (cfun)); } #endif /* Compute global availability. */ compute_available (avloc, kill, avout, avin); /* Compute global anticipatability. */ antin = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), n_exprs); antout = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), n_exprs); compute_antinout_edge (antloc, transp, antin, antout); #ifdef LCM_DEBUG_INFO if (dump_file) { dump_bitmap_vector (dump_file, "antin", "", antin, last_basic_block_for_fn (cfun)); dump_bitmap_vector (dump_file, "antout", "", antout, last_basic_block_for_fn (cfun)); } #endif /* Compute earliestness. */ earliest = sbitmap_vector_alloc (num_edges, n_exprs); compute_earliest (edge_list, n_exprs, antin, antout, avout, kill, earliest); #ifdef LCM_DEBUG_INFO if (dump_file) dump_bitmap_vector (dump_file, "earliest", "", earliest, num_edges); #endif sbitmap_vector_free (antout); sbitmap_vector_free (antin); later = sbitmap_vector_alloc (num_edges, n_exprs); /* Allocate an extra element for the exit block in the laterin vector. */ laterin = sbitmap_vector_alloc (last_basic_block_for_fn (cfun) + 1, n_exprs); compute_laterin (edge_list, earliest, antloc, later, laterin); #ifdef LCM_DEBUG_INFO if (dump_file) { dump_bitmap_vector (dump_file, "laterin", "", laterin, last_basic_block_for_fn (cfun) + 1); dump_bitmap_vector (dump_file, "later", "", later, num_edges); } #endif sbitmap_vector_free (earliest); *insert = sbitmap_vector_alloc (num_edges, n_exprs); *del = sbitmap_vector_alloc (last_basic_block_for_fn (cfun), n_exprs); bitmap_vector_clear (*insert, num_edges); bitmap_vector_clear (*del, last_basic_block_for_fn (cfun)); compute_insert_delete (edge_list, antloc, later, laterin, *insert, *del); sbitmap_vector_free (laterin); sbitmap_vector_free (later); #ifdef LCM_DEBUG_INFO if (dump_file) { dump_bitmap_vector (dump_file, "pre_insert_map", "", *insert, num_edges); dump_bitmap_vector (dump_file, "pre_delete_map", "", *del, last_basic_block_for_fn (cfun)); } #endif return edge_list; }
struct edge_list * pre_edge_rev_lcm (int n_exprs, sbitmap *transp, sbitmap *st_avloc, sbitmap *st_antloc, sbitmap *kill, sbitmap **insert, sbitmap **del) { sbitmap *st_antin, *st_antout; sbitmap *st_avout, *st_avin, *farthest; sbitmap *nearer, *nearerout; struct edge_list *edge_list; int num_edges; edge_list = create_edge_list (); num_edges = NUM_EDGES (edge_list); st_antin = sbitmap_vector_alloc (last_basic_block, n_exprs); st_antout = sbitmap_vector_alloc (last_basic_block, n_exprs); bitmap_vector_clear (st_antin, last_basic_block); bitmap_vector_clear (st_antout, last_basic_block); compute_antinout_edge (st_antloc, transp, st_antin, st_antout); /* Compute global anticipatability. */ st_avout = sbitmap_vector_alloc (last_basic_block, n_exprs); st_avin = sbitmap_vector_alloc (last_basic_block, n_exprs); compute_available (st_avloc, kill, st_avout, st_avin); #ifdef LCM_DEBUG_INFO if (dump_file) { fprintf (dump_file, "Edge List:\n"); verify_edge_list (dump_file, edge_list); print_edge_list (dump_file, edge_list); dump_bitmap_vector (dump_file, "transp", "", transp, last_basic_block); dump_bitmap_vector (dump_file, "st_avloc", "", st_avloc, last_basic_block); dump_bitmap_vector (dump_file, "st_antloc", "", st_antloc, last_basic_block); dump_bitmap_vector (dump_file, "st_antin", "", st_antin, last_basic_block); dump_bitmap_vector (dump_file, "st_antout", "", st_antout, last_basic_block); dump_bitmap_vector (dump_file, "st_kill", "", kill, last_basic_block); } #endif #ifdef LCM_DEBUG_INFO if (dump_file) { dump_bitmap_vector (dump_file, "st_avout", "", st_avout, last_basic_block); dump_bitmap_vector (dump_file, "st_avin", "", st_avin, last_basic_block); } #endif /* Compute farthestness. */ farthest = sbitmap_vector_alloc (num_edges, n_exprs); compute_farthest (edge_list, n_exprs, st_avout, st_avin, st_antin, kill, farthest); #ifdef LCM_DEBUG_INFO if (dump_file) dump_bitmap_vector (dump_file, "farthest", "", farthest, num_edges); #endif sbitmap_vector_free (st_antin); sbitmap_vector_free (st_antout); sbitmap_vector_free (st_avin); sbitmap_vector_free (st_avout); nearer = sbitmap_vector_alloc (num_edges, n_exprs); /* Allocate an extra element for the entry block. */ nearerout = sbitmap_vector_alloc (last_basic_block + 1, n_exprs); compute_nearerout (edge_list, farthest, st_avloc, nearer, nearerout); #ifdef LCM_DEBUG_INFO if (dump_file) { dump_bitmap_vector (dump_file, "nearerout", "", nearerout, last_basic_block + 1); dump_bitmap_vector (dump_file, "nearer", "", nearer, num_edges); } #endif sbitmap_vector_free (farthest); *insert = sbitmap_vector_alloc (num_edges, n_exprs); *del = sbitmap_vector_alloc (last_basic_block, n_exprs); compute_rev_insert_delete (edge_list, st_avloc, nearer, nearerout, *insert, *del); sbitmap_vector_free (nearerout); sbitmap_vector_free (nearer); #ifdef LCM_DEBUG_INFO if (dump_file) { dump_bitmap_vector (dump_file, "pre_insert_map", "", *insert, num_edges); dump_bitmap_vector (dump_file, "pre_delete_map", "", *del, last_basic_block); } #endif return edge_list; }