[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