static void df_bb_refs_record PARAMS((struct df *, basic_block));
static void df_refs_record PARAMS((struct df *, bitmap));
-static int df_visit_next PARAMS ((struct df *, sbitmap));
+static int df_visit_next_rc PARAMS ((struct df *, sbitmap));
+static int df_visit_next_rts PARAMS ((struct df *, sbitmap));
static void df_bb_reg_def_chain_create PARAMS((struct df *, basic_block));
static void df_reg_def_chain_create PARAMS((struct df *, bitmap));
static void df_bb_reg_use_chain_create PARAMS((struct df *, basic_block));
for (j = 0; j < ASM_OPERANDS_INPUT_LENGTH (x); j++)
df_uses_record (df, &ASM_OPERANDS_INPUT (x, j),
DF_REF_REG_USE, bb, insn);
+ return;
}
break;
}
}
\f
-/* Use depth first order, and the worklist, to figure out what block
+/* Use reverse completion order, and the worklist, to figure out what block
to look at next. */
static int
-df_visit_next (df, blocks)
+df_visit_next_rc (df, blocks)
struct df *df ATTRIBUTE_UNUSED;
sbitmap blocks;
{
return sbitmap_first_set_bit (blocks);
}
+/* Use reverse topsort order, and the worklist, to figure out what block
+ to look at next. */
+
+static int
+df_visit_next_rts (df, blocks)
+ struct df *df ATTRIBUTE_UNUSED;
+ sbitmap blocks;
+{
+ int i=0;
+ for (i = 0; i < n_basic_blocks; i++)
+ if (TEST_BIT (blocks, df->rts_order[i]))
+ return df->rts_order[i];
+ return sbitmap_first_set_bit (blocks);
+}
+
+
/* Calculate reaching defs for each basic block in BLOCKS, i.e., the
defs that are live at the start of a basic block. */
static void
bitmap_copy (bb_info->rd_out, bb_info->rd_gen);
});
- while ((i = df_visit_next (df, worklist)) >= 0)
+ while ((i = df_visit_next_rc (df, worklist)) >= 0)
{
struct bb_info *bb_info;
edge e;
});
- while ((i = df_visit_next (df, worklist)) >= 0)
+ while ((i = df_visit_next_rts (df, worklist)) >= 0)
{
struct bb_info *bb_info;
edge e;
df->dfs_order = xmalloc (sizeof(int) * n_basic_blocks);
df->rc_order = xmalloc (sizeof(int) * n_basic_blocks);
+ df->rts_order = xmalloc (sizeof(int) * n_basic_blocks);
flow_depth_first_order_compute (df->dfs_order, df->rc_order);
-
+ flow_reverse_top_sort_order_compute (df->rts_order);
if (aflags & DF_RD)
{
/* Compute the sets of gens and kills for the defs of each bb. */
}
free (df->dfs_order);
free (df->rc_order);
+ free (df->rts_order);
}