diff options
author | Mike Stump <mrs@apple.com> | 2009-07-21 01:46:17 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-07-21 01:46:17 +0000 |
commit | 22cd6581188bbbc6bedaca64ab171b1187a1c06a (patch) | |
tree | 465b9361fb3a9993d6e444c336639ca67b12a28d /lib/Analysis/CFG.cpp | |
parent | 8f9893a2beeacd5149bd2d3d4c6e130516915068 (diff) |
Wire up CFG improvements for __builtin_choose_expr.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@76531 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/CFG.cpp')
-rw-r--r-- | lib/Analysis/CFG.cpp | 22 |
1 files changed, 20 insertions, 2 deletions
diff --git a/lib/Analysis/CFG.cpp b/lib/Analysis/CFG.cpp index 258f67e1d5..79ca8114a7 100644 --- a/lib/Analysis/CFG.cpp +++ b/lib/Analysis/CFG.cpp @@ -521,6 +521,18 @@ CFGBlock *CFGBuilder::VisitCallExpr(CallExpr *C, bool alwaysAdd) { } CFGBlock *CFGBuilder::VisitChooseExpr(ChooseExpr *C) { + // See if this is a known constant. + bool KnownTrue = false; + bool KnownFalse = false; + Expr::EvalResult Result; + if (C->getCond()->Evaluate(Result, *Context) + && Result.Val.isInt()) { + if (Result.Val.getInt().getBoolValue()) + KnownTrue = true; + else + KnownFalse = true; + } + CFGBlock* ConfluenceBlock = Block ? Block : createBlock(); ConfluenceBlock->appendStmt(C); if (!FinishBlock(ConfluenceBlock)) @@ -539,8 +551,14 @@ CFGBlock *CFGBuilder::VisitChooseExpr(ChooseExpr *C) { return 0; Block = createBlock(false); - Block->addSuccessor(LHSBlock); - Block->addSuccessor(RHSBlock); + if (KnownFalse) + Block->addSuccessor(0); + else + Block->addSuccessor(LHSBlock); + if (KnownTrue) + Block->addSuccessor(0); + else + Block->addSuccessor(RHSBlock); Block->setTerminator(C); return addStmt(C->getCond()); } |