summaryrefslogtreecommitdiffstats
path: root/clang/lib/CodeGen
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2008-11-12 10:30:32 +0000
committerDaniel Dunbar <daniel@zuster.org>2008-11-12 10:30:32 +0000
commitbf3c22e51d35707aeecf062b14fa0518c4391940 (patch)
treeb28f5b76423c899bf8ba4fab5d775867b914f5f3 /clang/lib/CodeGen
parentd2a53a7b778559ca5038b72df91d212829bba1f5 (diff)
downloadbcm5719-llvm-bf3c22e51d35707aeecf062b14fa0518c4391940.tar.gz
bcm5719-llvm-bf3c22e51d35707aeecf062b14fa0518c4391940.zip
Handle ?: in EmitBranchOnBoolExpr.
llvm-svn: 59129
Diffstat (limited to 'clang/lib/CodeGen')
-rw-r--r--clang/lib/CodeGen/CodeGenFunction.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp
index 0756de7a8a7..ab9633418ac 100644
--- a/clang/lib/CodeGen/CodeGenFunction.cpp
+++ b/clang/lib/CodeGen/CodeGenFunction.cpp
@@ -271,6 +271,23 @@ void CodeGenFunction::EmitBranchOnBoolExpr(const Expr *Cond,
return EmitBranchOnBoolExpr(CondUOp->getSubExpr(), FalseBlock, TrueBlock);
}
+ if (const ConditionalOperator *CondOp = dyn_cast<ConditionalOperator>(Cond)) {
+ // Handle ?: operator.
+
+ // Just ignore GNU ?: extension.
+ if (CondOp->getLHS()) {
+ // br(c ? x : y, t, f) -> br(c, br(x, t, f), br(y, t, f))
+ llvm::BasicBlock *LHSBlock = createBasicBlock("cond.true");
+ llvm::BasicBlock *RHSBlock = createBasicBlock("cond.false");
+ EmitBranchOnBoolExpr(CondOp->getCond(), LHSBlock, RHSBlock);
+ EmitBlock(LHSBlock);
+ EmitBranchOnBoolExpr(CondOp->getLHS(), TrueBlock, FalseBlock);
+ EmitBlock(RHSBlock);
+ EmitBranchOnBoolExpr(CondOp->getRHS(), TrueBlock, FalseBlock);
+ return;
+ }
+ }
+
// Emit the code with the fully general case.
llvm::Value *CondV = EvaluateExprAsBool(Cond);
Builder.CreateCondBr(CondV, TrueBlock, FalseBlock);
OpenPOWER on IntegriCloud