diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-03-29 18:49:54 +0200 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2021-03-19 23:56:44 +0100 |
commit | 1331214c003027c7b8af0af9bb9d8e040f8e3b4e (patch) | |
tree | 95628ce418fc7432e507ad92088fe9232b995420 | |
parent | b2dc8031654a536313fe77951ee04c74a3017e0b (diff) | |
download | sparse-1331214c003027c7b8af0af9bb9d8e040f8e3b4e.tar.gz |
move insert_branch() to flow.c
Now that insert_branch() doesn't need to allocate a new instruction,
there is no more reasons to have it defined in linearize.c
So move it to flow.c which is more concerned with CFG changes.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
-rw-r--r-- | flow.c | 26 | ||||
-rw-r--r-- | flow.h | 1 | ||||
-rw-r--r-- | linearize.c | 26 | ||||
-rw-r--r-- | linearize.h | 1 |
4 files changed, 27 insertions, 27 deletions
@@ -709,6 +709,32 @@ void vrfy_flow(struct entrypoint *ep) assert(!entry); } +/// +// change a switch or a conditional branch into a branch +void insert_branch(struct instruction *insn, struct basic_block *target) +{ + struct basic_block *bb = insn->bb; + struct basic_block *child; + + kill_use(&insn->cond); + insn->bb_true = target; + insn->bb_false = NULL; + insn->cond = NULL; + insn->size = 0; + insn->opcode = OP_BR; + + FOR_EACH_PTR(bb->children, child) { + if (child == target) { + target = NULL; // leave first occurence + continue; + } + DELETE_CURRENT_PTR(child); + remove_bb_from_list(&child->parents, bb, 1); + } END_FOR_EACH_PTR(child); + PACK_PTR_LIST(&bb->children); + repeat_phase |= REPEAT_CFG_CLEANUP; +} + static int retarget_parents(struct basic_block *bb, struct basic_block *target) { struct basic_block *parent; @@ -18,6 +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 void convert_instruction_target(struct instruction *insn, pseudo_t src); extern void remove_dead_insns(struct entrypoint *); diff --git a/linearize.c b/linearize.c index 1d85cf2b..e6aa01f1 100644 --- a/linearize.c +++ b/linearize.c @@ -692,32 +692,6 @@ static void set_activeblock(struct entrypoint *ep, struct basic_block *bb) add_bb(&ep->bbs, bb); } -/* Change a "switch" or a conditional branch into a branch */ -void insert_branch(struct instruction *jmp, struct basic_block *target) -{ - struct basic_block *bb = jmp->bb; - struct basic_block *child; - - kill_use(&jmp->cond); - jmp->bb_true = target; - jmp->bb_false = NULL; - jmp->cond = NULL; - jmp->size = 0; - jmp->opcode = OP_BR; - - FOR_EACH_PTR(bb->children, child) { - if (child == target) { - target = NULL; /* Trigger just once */ - continue; - } - DELETE_CURRENT_PTR(child); - remove_bb_from_list(&child->parents, bb, 1); - } END_FOR_EACH_PTR(child); - PACK_PTR_LIST(&bb->children); - repeat_phase |= REPEAT_CFG_CLEANUP; -} - - void insert_select(struct basic_block *bb, struct instruction *br, struct instruction *phi_node, pseudo_t if_true, pseudo_t if_false) { pseudo_t target; diff --git a/linearize.h b/linearize.h index 1bb9d77e..b6c8bf13 100644 --- a/linearize.h +++ b/linearize.h @@ -319,7 +319,6 @@ struct entrypoint { }; extern void insert_select(struct basic_block *bb, struct instruction *br, struct instruction *phi, pseudo_t if_true, pseudo_t if_false); -extern void insert_branch(struct instruction *br, struct basic_block *target); struct instruction *alloc_phisrc(pseudo_t pseudo, struct symbol *type); struct instruction *alloc_phi_node(struct basic_block *bb, struct symbol *type, struct ident *ident); |