aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2004-12-04 14:30:43 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-07 21:05:28 -0700
commitd6d2b715f5eca280659dbd8bd6535998832b88bb (patch)
treed47ddee346ce21469cb08a17c706c369fd1d4ef5 /simplify.c
parentFix flow: we only remove one parent at a time. The same block (diff)
downloadsparse-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.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/simplify.c b/simplify.c
index 56f10bb..1af115d 100644
--- a/simplify.c
+++ b/simplify.c
@@ -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;