diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2008-11-12 10:30:32 +0000 |
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2008-11-12 10:30:32 +0000 |
| commit | bf3c22e51d35707aeecf062b14fa0518c4391940 (patch) | |
| tree | b28f5b76423c899bf8ba4fab5d775867b914f5f3 /clang/lib/CodeGen | |
| parent | d2a53a7b778559ca5038b72df91d212829bba1f5 (diff) | |
| download | bcm5719-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.cpp | 17 |
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); |

