aboutsummaryrefslogtreecommitdiff
path: root/lib/Analysis/CFG.cpp
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-07-21 01:46:17 +0000
committerMike Stump <mrs@apple.com>2009-07-21 01:46:17 +0000
commit22cd6581188bbbc6bedaca64ab171b1187a1c06a (patch)
tree465b9361fb3a9993d6e444c336639ca67b12a28d /lib/Analysis/CFG.cpp
parent8f9893a2beeacd5149bd2d3d4c6e130516915068 (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.cpp22
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());
}