diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2004-12-04 14:30:43 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-07 21:05:28 -0700 |
commit | d6d2b715f5eca280659dbd8bd6535998832b88bb (patch) | |
tree | d47ddee346ce21469cb08a17c706c369fd1d4ef5 /simplify.c | |
parent | Fix flow: we only remove one parent at a time. The same block (diff) | |
download | sparse-d6d2b715f5eca280659dbd8bd6535998832b88bb.tar.gz sparse-d6d2b715f5eca280659dbd8bd6535998832b88bb.tar.bz2 sparse-d6d2b715f5eca280659dbd8bd6535998832b88bb.zip |
Fix conditional branch to same target simplification.
We should clear out "insn->cond" when turning it into
an unconditional branch, anything else will confuse us
later (kill_use() will set it to VOID, that's not good
enough).
Move it to simplify.c at the same time.
Diffstat (limited to 'simplify.c')
-rw-r--r-- | simplify.c | 12 |
1 files changed, 12 insertions, 0 deletions
@@ -545,6 +545,18 @@ static int simplify_branch(struct instruction *insn) return REPEAT_CSE; } + /* Same target? */ + if (insn->bb_true == insn->bb_false) { + struct basic_block *bb = insn->bb; + struct basic_block *target = insn->bb_false; + remove_bb_from_list(&target->parents, bb, 1); + remove_bb_from_list(&bb->children, target, 1); + insn->bb_false = NULL; + kill_use(&insn->cond); + insn->cond = NULL; + return REPEAT_CSE; + } + /* Conditional on a SETNE $0 or SETEQ $0 */ if (cond->type == PSEUDO_REG) { struct instruction *def = cond->def; |