diff options
author | Ted Kremenek <kremenek@apple.com> | 2007-12-21 19:49:00 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2007-12-21 19:49:00 +0000 |
commit | afe54333a744f6d72d78f13fa20541328d6d9704 (patch) | |
tree | 8ed9087a9d21b5ab6d0fd719ddb5f6cf9f13061d | |
parent | 3c40085b373d8e6e4523812e06f73a0cb9d5142c (diff) |
Fixed successor order for CFG basic blocks when handling: x && y. The bug
is best explained by illustration:
[ B2 ]
1: x
T: [B2.1] && ...
Predecessors (1): B4
Successors (2): B3 B1
Block "B3" should be the block where we evaluate "y" when "x" evaluates to
true. Previously we had the successor list reversed. Now this behavior matches
with how we handle other conditional branches.
Thanks to Nuno Lopes for reporting this problem.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@45288 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | AST/CFG.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/AST/CFG.cpp b/AST/CFG.cpp index 1546079c92..93230744e6 100644 --- a/AST/CFG.cpp +++ b/AST/CFG.cpp @@ -340,14 +340,23 @@ CFGBlock* CFGBuilder::WalkAST(Stmt* S, bool AlwaysAddStmt = false) { // create the block evaluating the LHS CFGBlock* LHSBlock = createBlock(false); - LHSBlock->addSuccessor(ConfluenceBlock); - LHSBlock->setTerminator(B); + LHSBlock->setTerminator(B); // create the block evaluating the RHS Succ = ConfluenceBlock; Block = NULL; CFGBlock* RHSBlock = Visit(B->getRHS()); - LHSBlock->addSuccessor(RHSBlock); + + // Now link the LHSBlock with RHSBlock. + if (B->getOpcode() == BinaryOperator::LOr) { + LHSBlock->addSuccessor(ConfluenceBlock); + LHSBlock->addSuccessor(RHSBlock); + } + else { + assert (B->getOpcode() == BinaryOperator::LAnd); + LHSBlock->addSuccessor(RHSBlock); + LHSBlock->addSuccessor(ConfluenceBlock); + } // Generate the blocks for evaluating the LHS. Block = LHSBlock; |