[cfe-commits] r81867 - in /cfe/trunk/lib/CodeGen: CGExpr.cpp CodeGenFunction.h

Anders Carlsson andersca at mac.com
Tue Sep 15 09:35:25 PDT 2009


Author: andersca
Date: Tue Sep 15 11:35:24 2009
New Revision: 81867

URL: http://llvm.org/viewvc/llvm-project?rev=81867&view=rev
Log:
Code generation of Conditional operators that are lvalues (but that aren't bitfields).

Modified:
    cfe/trunk/lib/CodeGen/CGExpr.cpp
    cfe/trunk/lib/CodeGen/CodeGenFunction.h

Modified: cfe/trunk/lib/CodeGen/CGExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGExpr.cpp?rev=81867&r1=81866&r2=81867&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGExpr.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGExpr.cpp Tue Sep 15 11:35:24 2009
@@ -246,7 +246,7 @@
   case Expr::CompoundLiteralExprClass:
     return EmitCompoundLiteralLValue(cast<CompoundLiteralExpr>(E));
   case Expr::ConditionalOperatorClass:
-    return EmitConditionalOperator(cast<ConditionalOperator>(E));
+    return EmitConditionalOperatorLValue(cast<ConditionalOperator>(E));
   case Expr::ChooseExprClass:
     return EmitLValue(cast<ChooseExpr>(E)->getChosenSubExpr(getContext()));
   case Expr::ImplicitCastExprClass:
@@ -1135,10 +1135,44 @@
   return Result;
 }
 
-LValue CodeGenFunction::EmitConditionalOperator(const ConditionalOperator* E) {
-  if (E->isLvalue(getContext()) == Expr::LV_Valid)
-    return EmitUnsupportedLValue(E, "conditional operator");
+LValue 
+CodeGenFunction::EmitConditionalOperatorLValue(const ConditionalOperator* E) {
+  if (E->isLvalue(getContext()) == Expr::LV_Valid) {
+    llvm::BasicBlock *LHSBlock = createBasicBlock("cond.true");
+    llvm::BasicBlock *RHSBlock = createBasicBlock("cond.false");
+    llvm::BasicBlock *ContBlock = createBasicBlock("cond.end");
+    
+    llvm::Value *Cond = EvaluateExprAsBool(E->getCond());
+    Builder.CreateCondBr(Cond, LHSBlock, RHSBlock);
+    
+    EmitBlock(LHSBlock);
+
+    LValue LHS = EmitLValue(E->getLHS());
+    if (!LHS.isSimple())
+      return EmitUnsupportedLValue(E, "conditional operator");
+
+    llvm::Value *Temp = CreateTempAlloca(LHS.getAddress()->getType(), 
+                                         "condtmp");
+    
+    Builder.CreateStore(LHS.getAddress(), Temp);
+    EmitBranch(ContBlock);
+    
+    EmitBlock(RHSBlock);
+    LValue RHS = EmitLValue(E->getRHS());
+    if (!RHS.isSimple())
+      return EmitUnsupportedLValue(E, "conditional operator");
+
+    Builder.CreateStore(RHS.getAddress(), Temp);
+    EmitBranch(ContBlock);
 
+    EmitBlock(ContBlock);
+    
+    Temp = Builder.CreateLoad(Temp, "lv");
+    return LValue::MakeAddr(Temp, E->getType().getCVRQualifiers(),
+                            getContext().getObjCGCAttrKind(E->getType()),
+                            E->getType().getAddressSpace());
+  }
+  
   // ?: here should be an aggregate.
   assert((hasAggregateLLVMType(E->getType()) &&
           !E->getType()->isAnyComplexType()) &&
@@ -1150,7 +1184,6 @@
   return LValue::MakeAddr(Temp, E->getType().getCVRQualifiers(),
                           getContext().getObjCGCAttrKind(E->getType()),
                           E->getType().getAddressSpace());
-
 }
 
 /// EmitCastLValue - Casts are never lvalues.  If a cast is needed by the code

Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.h?rev=81867&r1=81866&r2=81867&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenFunction.h (original)
+++ cfe/trunk/lib/CodeGen/CodeGenFunction.h Tue Sep 15 11:35:24 2009
@@ -794,7 +794,7 @@
   LValue EmitExtVectorElementExpr(const ExtVectorElementExpr *E);
   LValue EmitMemberExpr(const MemberExpr *E);
   LValue EmitCompoundLiteralLValue(const CompoundLiteralExpr *E);
-  LValue EmitConditionalOperator(const ConditionalOperator *E);
+  LValue EmitConditionalOperatorLValue(const ConditionalOperator *E);
   LValue EmitCastLValue(const CastExpr *E);
 
   llvm::Value *EmitIvarOffset(const ObjCInterfaceDecl *Interface,





More information about the cfe-commits mailing list