From: Ted Kremenek Date: Sat, 14 Jul 2012 05:04:06 +0000 (+0000) Subject: Hoist CFG builder logic for '&&' and '||' into helper method. No funcationlity change. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5c3ea5c57971317c35b120ef0a2a2c79bd171008;p=clang Hoist CFG builder logic for '&&' and '||' into helper method. No funcationlity change. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160217 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index 61b7e1b826..a0d34193db 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -343,6 +343,7 @@ private: CFGBlock *VisitIndirectGotoStmt(IndirectGotoStmt *I); CFGBlock *VisitLabelStmt(LabelStmt *L); CFGBlock *VisitLambdaExpr(LambdaExpr *E, AddStmtChoice asc); + CFGBlock *VisitLogicalOperator(BinaryOperator *B); CFGBlock *VisitMemberExpr(MemberExpr *M, AddStmtChoice asc); CFGBlock *VisitObjCAtCatchStmt(ObjCAtCatchStmt *S); CFGBlock *VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *S); @@ -1162,54 +1163,58 @@ CFGBlock *CFGBuilder::VisitUnaryOperator(UnaryOperator *U, return Visit(U->getSubExpr(), AddStmtChoice()); } -CFGBlock *CFGBuilder::VisitBinaryOperator(BinaryOperator *B, - AddStmtChoice asc) { - if (B->isLogicalOp()) { // && or || - CFGBlock *ConfluenceBlock = Block ? Block : createBlock(); - appendStmt(ConfluenceBlock, B); +CFGBlock *CFGBuilder::VisitLogicalOperator(BinaryOperator *B) { + CFGBlock *ConfluenceBlock = Block ? Block : createBlock(); + appendStmt(ConfluenceBlock, B); - if (badCFG) - return 0; + if (badCFG) + return 0; - // create the block evaluating the LHS - CFGBlock *LHSBlock = createBlock(false); - LHSBlock->setTerminator(B); + // create the block evaluating the LHS + CFGBlock *LHSBlock = createBlock(false); + LHSBlock->setTerminator(B); - // create the block evaluating the RHS - Succ = ConfluenceBlock; - Block = NULL; - CFGBlock *RHSBlock = addStmt(B->getRHS()); + // create the block evaluating the RHS + Succ = ConfluenceBlock; + Block = NULL; + CFGBlock *RHSBlock = addStmt(B->getRHS()); - if (RHSBlock) { - if (badCFG) - return 0; - } else { - // Create an empty block for cases where the RHS doesn't require - // any explicit statements in the CFG. - RHSBlock = createBlock(); - } + if (RHSBlock) { + if (badCFG) + return 0; + } else { + // Create an empty block for cases where the RHS doesn't require + // any explicit statements in the CFG. + RHSBlock = createBlock(); + } - // Generate the blocks for evaluating the LHS. - Block = LHSBlock; - CFGBlock *EntryLHSBlock = addStmt(B->getLHS()); + // Generate the blocks for evaluating the LHS. + Block = LHSBlock; + CFGBlock *EntryLHSBlock = addStmt(B->getLHS()); - // See if this is a known constant. - TryResult KnownVal = tryEvaluateBool(B->getLHS()); - if (KnownVal.isKnown() && (B->getOpcode() == BO_LOr)) - KnownVal.negate(); + // See if this is a known constant. + TryResult KnownVal = tryEvaluateBool(B->getLHS()); + if (KnownVal.isKnown() && (B->getOpcode() == BO_LOr)) + KnownVal.negate(); + + // Now link the LHSBlock with RHSBlock. + if (B->getOpcode() == BO_LOr) { + addSuccessor(LHSBlock, KnownVal.isTrue() ? NULL : ConfluenceBlock); + addSuccessor(LHSBlock, KnownVal.isFalse() ? NULL : RHSBlock); + } else { + assert(B->getOpcode() == BO_LAnd); + addSuccessor(LHSBlock, KnownVal.isFalse() ? NULL : RHSBlock); + addSuccessor(LHSBlock, KnownVal.isTrue() ? NULL : ConfluenceBlock); + } - // Now link the LHSBlock with RHSBlock. - if (B->getOpcode() == BO_LOr) { - addSuccessor(LHSBlock, KnownVal.isTrue() ? NULL : ConfluenceBlock); - addSuccessor(LHSBlock, KnownVal.isFalse() ? NULL : RHSBlock); - } else { - assert(B->getOpcode() == BO_LAnd); - addSuccessor(LHSBlock, KnownVal.isFalse() ? NULL : RHSBlock); - addSuccessor(LHSBlock, KnownVal.isTrue() ? NULL : ConfluenceBlock); - } + return EntryLHSBlock; +} - return EntryLHSBlock; - } +CFGBlock *CFGBuilder::VisitBinaryOperator(BinaryOperator *B, + AddStmtChoice asc) { + // && or || + if (B->isLogicalOp()) + return VisitLogicalOperator(B); if (B->getOpcode() == BO_Comma) { // , autoCreateBlock();