diff options
-rw-r--r-- | flow.c | 7 | ||||
-rw-r--r-- | flow.h | 2 | ||||
-rw-r--r-- | simplify.c | 21 |
3 files changed, 13 insertions, 17 deletions
@@ -711,10 +711,11 @@ void vrfy_flow(struct entrypoint *ep) /// // change a switch or a conditional branch into a branch -void insert_branch(struct instruction *insn, struct basic_block *target) +int insert_branch(struct instruction *insn, struct basic_block *target) { struct basic_block *bb = insn->bb; struct basic_block *child; + int changed = REPEAT_CSE; kill_use(&insn->cond); insn->bb_true = target; @@ -730,9 +731,11 @@ void insert_branch(struct instruction *insn, struct basic_block *target) } DELETE_CURRENT_PTR(child); remove_bb_from_list(&child->parents, bb, 1); + changed |= REPEAT_CFG_CLEANUP; } END_FOR_EACH_PTR(child); PACK_PTR_LIST(&bb->children); - repeat_phase |= REPEAT_CFG_CLEANUP; + repeat_phase |= changed; + return changed; } static int retarget_parents(struct basic_block *bb, struct basic_block *target) @@ -18,7 +18,7 @@ extern void simplify_symbol_usage(struct entrypoint *ep); extern void simplify_memops(struct entrypoint *ep); extern void pack_basic_blocks(struct entrypoint *ep); extern int simplify_cfg_early(struct entrypoint *ep); -extern void insert_branch(struct instruction *insn, struct basic_block *target); +extern int insert_branch(struct instruction *insn, struct basic_block *target); extern void convert_instruction_target(struct instruction *insn, pseudo_t src); extern void remove_dead_insns(struct entrypoint *); @@ -2440,10 +2440,8 @@ static int simplify_branch(struct instruction *insn) pseudo_t cond = insn->cond; /* Constant conditional */ - if (constant(cond)) { - insert_branch(insn, cond->value ? insn->bb_true : insn->bb_false); - return REPEAT_CSE; - } + if (constant(cond)) + return insert_branch(insn, cond->value ? insn->bb_true : insn->bb_false); /* Same target? */ if (insn->bb_true == insn->bb_false) { @@ -2472,14 +2470,10 @@ static int simplify_branch(struct instruction *insn) if (constant(def->src2) && constant(def->src3)) { long long val1 = def->src2->value; long long val2 = def->src3->value; - if (!val1 && !val2) { - insert_branch(insn, insn->bb_false); - return REPEAT_CSE; - } - if (val1 && val2) { - insert_branch(insn, insn->bb_true); - return REPEAT_CSE; - } + if (!val1 && !val2) + return insert_branch(insn, insn->bb_false); + if (val1 && val2) + return insert_branch(insn, insn->bb_true); if (val2) { struct basic_block *tmp = insn->bb_true; insn->bb_true = insn->bb_false; @@ -2515,8 +2509,7 @@ static int simplify_switch(struct instruction *insn) return 0; found: - insert_branch(insn, jmp->target); - return REPEAT_CSE; + return insert_branch(insn, jmp->target); } static struct basic_block *is_label(pseudo_t pseudo) |