static void compute_farthest (struct edge_list *edge_list, int n_exprs, sbitmap *st_avout, sbitmap *st_avin, sbitmap *st_antin, sbitmap *kill, sbitmap *farthest) { int x, num_edges; basic_block pred, succ; num_edges = NUM_EDGES (edge_list); auto_sbitmap difference (n_exprs), temp_bitmap (n_exprs); for (x = 0; x < num_edges; x++) { pred = INDEX_EDGE_PRED_BB (edge_list, x); succ = INDEX_EDGE_SUCC_BB (edge_list, x); if (succ == EXIT_BLOCK_PTR_FOR_FN (cfun)) bitmap_copy (farthest[x], st_avout[pred->index]); else { if (pred == ENTRY_BLOCK_PTR_FOR_FN (cfun)) bitmap_clear (farthest[x]); else { bitmap_and_compl (difference, st_avout[pred->index], st_antin[succ->index]); bitmap_not (temp_bitmap, st_avin[succ->index]); bitmap_and_or (farthest[x], difference, kill[succ->index], temp_bitmap); } } } }
/* The transfer function used by the DF equation solver to propagate live info through block with BB_INDEX according to the following equation: bb.livein = (bb.liveout - bb.kill) OR bb.gen */ static bool live_trans_fun (int bb_index) { basic_block bb = get_bb_data_by_index (bb_index)->bb; bitmap bb_liveout = df_get_live_out (bb); bitmap bb_livein = df_get_live_in (bb); bb_data_t bb_info = get_bb_data (bb); bitmap_and_compl (&temp_bitmap, bb_liveout, &all_hard_regs_bitmap); return bitmap_ior_and_compl (bb_livein, &bb_info->gen_pseudos, &temp_bitmap, &bb_info->killed_pseudos); }
static void compute_rev_insert_delete (struct edge_list *edge_list, sbitmap *st_avloc, sbitmap *nearer, sbitmap *nearerout, sbitmap *insert, sbitmap *del) { int x; basic_block bb; FOR_EACH_BB (bb) bitmap_and_compl (del[bb->index], st_avloc[bb->index], nearerout[bb->index]); for (x = 0; x < NUM_EDGES (edge_list); x++) { basic_block b = INDEX_EDGE_PRED_BB (edge_list, x); if (b == ENTRY_BLOCK_PTR) bitmap_and_compl (insert[x], nearer[x], nearerout[last_basic_block]); else bitmap_and_compl (insert[x], nearer[x], nearerout[b->index]); } }
static void compute_insert_delete (struct edge_list *edge_list, sbitmap *antloc, sbitmap *later, sbitmap *laterin, sbitmap *insert, sbitmap *del) { int x; basic_block bb; FOR_EACH_BB (bb) bitmap_and_compl (del[bb->index], antloc[bb->index], laterin[bb->index]); for (x = 0; x < NUM_EDGES (edge_list); x++) { basic_block b = INDEX_EDGE_SUCC_BB (edge_list, x); if (b == EXIT_BLOCK_PTR) bitmap_and_compl (insert[x], later[x], laterin[last_basic_block]); else bitmap_and_compl (insert[x], later[x], laterin[b->index]); } }
static void compute_earliest (struct edge_list *edge_list, int n_exprs, sbitmap *antin, sbitmap *antout, sbitmap *avout, sbitmap *kill, sbitmap *earliest) { sbitmap difference, temp_bitmap; int x, num_edges; basic_block pred, succ; num_edges = NUM_EDGES (edge_list); difference = sbitmap_alloc (n_exprs); temp_bitmap = sbitmap_alloc (n_exprs); for (x = 0; x < num_edges; x++) { pred = INDEX_EDGE_PRED_BB (edge_list, x); succ = INDEX_EDGE_SUCC_BB (edge_list, x); if (pred == ENTRY_BLOCK_PTR_FOR_FN (cfun)) bitmap_copy (earliest[x], antin[succ->index]); else { if (succ == EXIT_BLOCK_PTR_FOR_FN (cfun)) bitmap_clear (earliest[x]); else { bitmap_and_compl (difference, antin[succ->index], avout[pred->index]); bitmap_not (temp_bitmap, antout[pred->index]); bitmap_and_or (earliest[x], difference, kill[pred->index], temp_bitmap); } } } sbitmap_free (temp_bitmap); sbitmap_free (difference); }