[cfe-commits] r114376 - in /cfe/trunk: lib/CodeGen/CGExprComplex.cpp lib/CodeGen/CodeGenFunction.h test/CodeGen/conditional-gnu-ext.c test/CodeGenCXX/gnu-conditional-scalar-ext.cpp
Fariborz Jahanian
fjahanian at apple.com
Mon Sep 20 16:50:22 PDT 2010
Author: fjahanian
Date: Mon Sep 20 18:50:22 2010
New Revision: 114376
URL: http://llvm.org/viewvc/llvm-project?rev=114376&view=rev
Log:
Implements in IRgen gnu extensions missing LHS for
complex conditionals. Radar 8453812.
Modified:
cfe/trunk/lib/CodeGen/CGExprComplex.cpp
cfe/trunk/lib/CodeGen/CodeGenFunction.h
cfe/trunk/test/CodeGen/conditional-gnu-ext.c
cfe/trunk/test/CodeGenCXX/gnu-conditional-scalar-ext.cpp
Modified: cfe/trunk/lib/CodeGen/CGExprComplex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExprComplex.cpp?rev=114376&r1=114375&r2=114376&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGExprComplex.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExprComplex.cpp Mon Sep 20 18:50:22 2010
@@ -102,6 +102,15 @@
// Visitor Methods
//===--------------------------------------------------------------------===//
+ ComplexPairTy Visit(Expr *E) {
+ llvm::DenseMap<const Expr *, ComplexPairTy>::iterator I =
+ CGF.ConditionalSaveComplexExprs.find(E);
+ if (I != CGF.ConditionalSaveComplexExprs.end())
+ return I->second;
+
+ return StmtVisitor<ComplexExprEmitter, ComplexPairTy>::Visit(E);
+ }
+
ComplexPairTy VisitStmt(Stmt *S) {
S->dump(CGF.getContext().getSourceManager());
assert(0 && "Stmt can't have complex result type!");
@@ -622,13 +631,6 @@
ComplexPairTy ComplexExprEmitter::
VisitConditionalOperator(const ConditionalOperator *E) {
- if (!E->getLHS()) {
- CGF.ErrorUnsupported(E, "conditional operator with missing LHS");
- const llvm::Type *EltTy =
- CGF.ConvertType(E->getType()->getAs<ComplexType>()->getElementType());
- llvm::Value *U = llvm::UndefValue::get(EltTy);
- return ComplexPairTy(U, U);
- }
TestAndClearIgnoreReal();
TestAndClearIgnoreImag();
@@ -638,14 +640,19 @@
llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false");
llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
- CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock);
+ if (E->getLHS())
+ CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock);
+ else {
+ Expr *save = E->getSAVE();
+ assert(save && "VisitConditionalOperator - save is null");
+ // Intentianlly not doing direct assignment to ConditionalSaveExprs[save] !!
+ ComplexPairTy SaveVal = Visit(save);
+ CGF.ConditionalSaveComplexExprs[save] = SaveVal;
+ CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock);
+ }
CGF.EmitBlock(LHSBlock);
-
- // Handle the GNU extension for missing LHS.
- assert(E->getLHS() && "Must have LHS for complex value");
-
- ComplexPairTy LHS = Visit(E->getLHS());
+ ComplexPairTy LHS = Visit(E->getTrueExpr());
LHSBlock = Builder.GetInsertBlock();
CGF.EmitBranch(ContBlock);
Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=114376&r1=114375&r2=114376&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Mon Sep 20 18:50:22 2010
@@ -516,6 +516,7 @@
/// to the IR for this expression. Used to implement IR gen. for Gnu
/// extension's missing LHS expression in a conditional operator expression.
llvm::DenseMap<const Expr *, llvm::Value *> ConditionalSaveExprs;
+ llvm::DenseMap<const Expr *, ComplexPairTy> ConditionalSaveComplexExprs;
EHScopeStack EHStack;
Modified: cfe/trunk/test/CodeGen/conditional-gnu-ext.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/conditional-gnu-ext.c?rev=114376&r1=114375&r2=114376&view=diff
==============================================================================
--- cfe/trunk/test/CodeGen/conditional-gnu-ext.c (original)
+++ cfe/trunk/test/CodeGen/conditional-gnu-ext.c Mon Sep 20 18:50:22 2010
@@ -19,3 +19,18 @@
if (x != y)
abort();
}
+
+// rdar://8453812
+_Complex int getComplex(_Complex int val) {
+ static int count;
+ if (count++)
+ abort();
+ return val;
+}
+
+_Complex int complx() {
+ _Complex int cond;
+ _Complex int rhs;
+
+ return getComplex(1+2i) ? : rhs;
+}
Modified: cfe/trunk/test/CodeGenCXX/gnu-conditional-scalar-ext.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/gnu-conditional-scalar-ext.cpp?rev=114376&r1=114375&r2=114376&view=diff
==============================================================================
--- cfe/trunk/test/CodeGenCXX/gnu-conditional-scalar-ext.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/gnu-conditional-scalar-ext.cpp Mon Sep 20 18:50:22 2010
@@ -22,3 +22,25 @@
abort();
}
}
+
+namespace radar8453812 {
+extern "C" void abort();
+_Complex int getComplex(_Complex int val) {
+ static int count;
+ if (count++)
+ abort();
+ return val;
+}
+
+_Complex int cmplx() {
+ _Complex int cond;
+ _Complex int rhs;
+
+ return getComplex(1+2i) ? : rhs;
+}
+
+int main() {
+ cmplx();
+ return 0;
+}
+}
More information about the cfe-commits
mailing list