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); } } } }
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); }