CGExprComplex.cpp revision 7976932a1c256d447316ffac58e9821417725e34
1//===--- CGExprComplex.cpp - Emit LLVM Code for Complex Exprs -------------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This contains code to emit Expr nodes with complex types as LLVM code.
11//
12//===----------------------------------------------------------------------===//
13
14#include "CodeGenFunction.h"
15#include "CodeGenModule.h"
16#include "clang/AST/ASTContext.h"
17#include "clang/AST/StmtVisitor.h"
18#include "llvm/Constants.h"
19#include "llvm/Function.h"
20#include "llvm/ADT/SmallString.h"
21#include "llvm/Support/Compiler.h"
22using namespace clang;
23using namespace CodeGen;
24
25//===----------------------------------------------------------------------===//
26//                        Complex Expression Emitter
27//===----------------------------------------------------------------------===//
28
29typedef CodeGenFunction::ComplexPairTy ComplexPairTy;
30
31namespace  {
32class VISIBILITY_HIDDEN ComplexExprEmitter
33  : public StmtVisitor<ComplexExprEmitter, ComplexPairTy> {
34  CodeGenFunction &CGF;
35  CGBuilderTy &Builder;
36public:
37  ComplexExprEmitter(CodeGenFunction &cgf) : CGF(cgf), Builder(CGF.Builder) {
38  }
39
40
41  //===--------------------------------------------------------------------===//
42  //                               Utilities
43  //===--------------------------------------------------------------------===//
44
45  /// EmitLoadOfLValue - Given an expression with complex type that represents a
46  /// value l-value, this method emits the address of the l-value, then loads
47  /// and returns the result.
48  ComplexPairTy EmitLoadOfLValue(const Expr *E) {
49    LValue LV = CGF.EmitLValue(E);
50    // FIXME: Volatile
51    return EmitLoadOfComplex(LV.getAddress(), false);
52  }
53
54  /// EmitLoadOfComplex - Given a pointer to a complex value, emit code to load
55  /// the real and imaginary pieces.
56  ComplexPairTy EmitLoadOfComplex(llvm::Value *SrcPtr, bool isVolatile);
57
58  /// EmitStoreOfComplex - Store the specified real/imag parts into the
59  /// specified value pointer.
60  void EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *ResPtr, bool isVol);
61
62  /// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType.
63  ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType SrcType,
64                                         QualType DestType);
65
66  //===--------------------------------------------------------------------===//
67  //                            Visitor Methods
68  //===--------------------------------------------------------------------===//
69
70  ComplexPairTy VisitStmt(Stmt *S) {
71    S->dump(CGF.getContext().getSourceManager());
72    assert(0 && "Stmt can't have complex result type!");
73    return ComplexPairTy();
74  }
75  ComplexPairTy VisitExpr(Expr *S);
76  ComplexPairTy VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr());}
77  ComplexPairTy VisitImaginaryLiteral(const ImaginaryLiteral *IL);
78
79  // l-values.
80  ComplexPairTy VisitDeclRefExpr(const Expr *E) { return EmitLoadOfLValue(E); }
81  ComplexPairTy VisitArraySubscriptExpr(Expr *E) { return EmitLoadOfLValue(E); }
82  ComplexPairTy VisitMemberExpr(const Expr *E) { return EmitLoadOfLValue(E); }
83
84  // FIXME: CompoundLiteralExpr
85
86  ComplexPairTy EmitCast(Expr *Op, QualType DestTy);
87  ComplexPairTy VisitImplicitCastExpr(ImplicitCastExpr *E) {
88    // Unlike for scalars, we don't have to worry about function->ptr demotion
89    // here.
90    return EmitCast(E->getSubExpr(), E->getType());
91  }
92  ComplexPairTy VisitCastExpr(CastExpr *E) {
93    return EmitCast(E->getSubExpr(), E->getType());
94  }
95  ComplexPairTy VisitCallExpr(const CallExpr *E);
96  ComplexPairTy VisitStmtExpr(const StmtExpr *E);
97
98  // Operators.
99  ComplexPairTy VisitPrePostIncDec(const UnaryOperator *E,
100                                   bool isInc, bool isPre);
101  ComplexPairTy VisitUnaryPostDec(const UnaryOperator *E) {
102    return VisitPrePostIncDec(E, false, false);
103  }
104  ComplexPairTy VisitUnaryPostInc(const UnaryOperator *E) {
105    return VisitPrePostIncDec(E, true, false);
106  }
107  ComplexPairTy VisitUnaryPreDec(const UnaryOperator *E) {
108    return VisitPrePostIncDec(E, false, true);
109  }
110  ComplexPairTy VisitUnaryPreInc(const UnaryOperator *E) {
111    return VisitPrePostIncDec(E, true, true);
112  }
113  ComplexPairTy VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); }
114  ComplexPairTy VisitUnaryPlus     (const UnaryOperator *E) {
115    return Visit(E->getSubExpr());
116  }
117  ComplexPairTy VisitUnaryMinus    (const UnaryOperator *E);
118  ComplexPairTy VisitUnaryNot      (const UnaryOperator *E);
119  // LNot,Real,Imag never return complex.
120  ComplexPairTy VisitUnaryExtension(const UnaryOperator *E) {
121    return Visit(E->getSubExpr());
122  }
123  ComplexPairTy VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
124    return Visit(DAE->getExpr());
125  }
126  ComplexPairTy VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
127    assert(E->getType()->isAnyComplexType() && "Expected complex type!");
128    QualType Elem = E->getType()->getAsComplexType()->getElementType();
129    llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem));
130    return ComplexPairTy(Null, Null);
131  }
132  ComplexPairTy VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
133    assert(E->getType()->isAnyComplexType() && "Expected complex type!");
134    QualType Elem = E->getType()->getAsComplexType()->getElementType();
135    llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem));
136    return ComplexPairTy(Null, Null);
137  }
138
139  struct BinOpInfo {
140    ComplexPairTy LHS;
141    ComplexPairTy RHS;
142    QualType Ty;  // Computation Type.
143  };
144
145  BinOpInfo EmitBinOps(const BinaryOperator *E);
146  ComplexPairTy EmitCompoundAssign(const CompoundAssignOperator *E,
147                                   ComplexPairTy (ComplexExprEmitter::*Func)
148                                   (const BinOpInfo &));
149
150  ComplexPairTy EmitBinAdd(const BinOpInfo &Op);
151  ComplexPairTy EmitBinSub(const BinOpInfo &Op);
152  ComplexPairTy EmitBinMul(const BinOpInfo &Op);
153  ComplexPairTy EmitBinDiv(const BinOpInfo &Op);
154
155  ComplexPairTy VisitBinMul(const BinaryOperator *E) {
156    return EmitBinMul(EmitBinOps(E));
157  }
158  ComplexPairTy VisitBinAdd(const BinaryOperator *E) {
159    return EmitBinAdd(EmitBinOps(E));
160  }
161  ComplexPairTy VisitBinSub(const BinaryOperator *E) {
162    return EmitBinSub(EmitBinOps(E));
163  }
164  ComplexPairTy VisitBinDiv(const BinaryOperator *E) {
165    return EmitBinDiv(EmitBinOps(E));
166  }
167
168  // Compound assignments.
169  ComplexPairTy VisitBinAddAssign(const CompoundAssignOperator *E) {
170    return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinAdd);
171  }
172  ComplexPairTy VisitBinSubAssign(const CompoundAssignOperator *E) {
173    return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinSub);
174  }
175  ComplexPairTy VisitBinMulAssign(const CompoundAssignOperator *E) {
176    return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinMul);
177  }
178  ComplexPairTy VisitBinDivAssign(const CompoundAssignOperator *E) {
179    return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinDiv);
180  }
181
182  // GCC rejects rem/and/or/xor for integer complex.
183  // Logical and/or always return int, never complex.
184
185  // No comparisons produce a complex result.
186  ComplexPairTy VisitBinAssign     (const BinaryOperator *E);
187  ComplexPairTy VisitBinComma      (const BinaryOperator *E);
188
189
190  ComplexPairTy VisitConditionalOperator(const ConditionalOperator *CO);
191  ComplexPairTy VisitChooseExpr(ChooseExpr *CE);
192
193  ComplexPairTy VisitInitListExpr(InitListExpr *E);
194
195  ComplexPairTy VisitVAArgExpr(VAArgExpr *E);
196};
197}  // end anonymous namespace.
198
199//===----------------------------------------------------------------------===//
200//                                Utilities
201//===----------------------------------------------------------------------===//
202
203/// EmitLoadOfComplex - Given an RValue reference for a complex, emit code to
204/// load the real and imaginary pieces, returning them as Real/Imag.
205ComplexPairTy ComplexExprEmitter::EmitLoadOfComplex(llvm::Value *SrcPtr,
206                                                    bool isVolatile) {
207  llvm::SmallString<64> Name(SrcPtr->getNameStart(),
208                             SrcPtr->getNameStart()+SrcPtr->getNameLen());
209
210  Name += ".realp";
211  llvm::Value *RealPtr = Builder.CreateStructGEP(SrcPtr, 0, Name.c_str());
212
213  Name.pop_back();  // .realp -> .real
214  llvm::Value *Real = Builder.CreateLoad(RealPtr, isVolatile, Name.c_str());
215
216  Name.resize(Name.size()-4); // .real -> .imagp
217  Name += "imagp";
218
219  llvm::Value *ImagPtr = Builder.CreateStructGEP(SrcPtr, 1, Name.c_str());
220
221  Name.pop_back();  // .imagp -> .imag
222  llvm::Value *Imag = Builder.CreateLoad(ImagPtr, isVolatile, Name.c_str());
223  return ComplexPairTy(Real, Imag);
224}
225
226/// EmitStoreOfComplex - Store the specified real/imag parts into the
227/// specified value pointer.
228void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, llvm::Value *Ptr,
229                                            bool isVolatile) {
230  llvm::Value *RealPtr = Builder.CreateStructGEP(Ptr, 0, "real");
231  llvm::Value *ImagPtr = Builder.CreateStructGEP(Ptr, 1, "imag");
232
233  Builder.CreateStore(Val.first, RealPtr, isVolatile);
234  Builder.CreateStore(Val.second, ImagPtr, isVolatile);
235}
236
237
238
239//===----------------------------------------------------------------------===//
240//                            Visitor Methods
241//===----------------------------------------------------------------------===//
242
243ComplexPairTy ComplexExprEmitter::VisitExpr(Expr *E) {
244  CGF.ErrorUnsupported(E, "complex expression");
245  const llvm::Type *EltTy =
246    CGF.ConvertType(E->getType()->getAsComplexType()->getElementType());
247  llvm::Value *U = llvm::UndefValue::get(EltTy);
248  return ComplexPairTy(U, U);
249}
250
251ComplexPairTy ComplexExprEmitter::
252VisitImaginaryLiteral(const ImaginaryLiteral *IL) {
253  llvm::Value *Imag = CGF.EmitScalarExpr(IL->getSubExpr());
254  return ComplexPairTy(llvm::Constant::getNullValue(Imag->getType()), Imag);
255}
256
257
258ComplexPairTy ComplexExprEmitter::VisitCallExpr(const CallExpr *E) {
259  return CGF.EmitCallExpr(E).getComplexVal();
260}
261
262ComplexPairTy ComplexExprEmitter::VisitStmtExpr(const StmtExpr *E) {
263  return CGF.EmitCompoundStmt(*E->getSubStmt(), true).getComplexVal();
264}
265
266/// EmitComplexToComplexCast - Emit a cast from complex value Val to DestType.
267ComplexPairTy ComplexExprEmitter::EmitComplexToComplexCast(ComplexPairTy Val,
268                                                           QualType SrcType,
269                                                           QualType DestType) {
270  // Get the src/dest element type.
271  SrcType = SrcType->getAsComplexType()->getElementType();
272  DestType = DestType->getAsComplexType()->getElementType();
273
274  // C99 6.3.1.6: When a value of complex type is converted to another
275  // complex type, both the real and imaginary parts follow the conversion
276  // rules for the corresponding real types.
277  Val.first = CGF.EmitScalarConversion(Val.first, SrcType, DestType);
278  Val.second = CGF.EmitScalarConversion(Val.second, SrcType, DestType);
279  return Val;
280}
281
282ComplexPairTy ComplexExprEmitter::EmitCast(Expr *Op, QualType DestTy) {
283  // Two cases here: cast from (complex to complex) and (scalar to complex).
284  if (Op->getType()->isAnyComplexType())
285    return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy);
286
287  // C99 6.3.1.7: When a value of real type is converted to a complex type, the
288  // real part of the complex  result value is determined by the rules of
289  // conversion to the corresponding real type and the imaginary part of the
290  // complex result value is a positive zero or an unsigned zero.
291  llvm::Value *Elt = CGF.EmitScalarExpr(Op);
292
293  // Convert the input element to the element type of the complex.
294  DestTy = DestTy->getAsComplexType()->getElementType();
295  Elt = CGF.EmitScalarConversion(Elt, Op->getType(), DestTy);
296
297  // Return (realval, 0).
298  return ComplexPairTy(Elt, llvm::Constant::getNullValue(Elt->getType()));
299}
300
301ComplexPairTy ComplexExprEmitter::VisitPrePostIncDec(const UnaryOperator *E,
302                                                     bool isInc, bool isPre) {
303  LValue LV = CGF.EmitLValue(E->getSubExpr());
304  // FIXME: Handle volatile!
305  ComplexPairTy InVal = EmitLoadOfComplex(LV.getAddress(), false);
306
307  uint64_t AmountVal = isInc ? 1 : -1;
308
309  llvm::Value *NextVal;
310  if (isa<llvm::IntegerType>(InVal.first->getType()))
311    NextVal = llvm::ConstantInt::get(InVal.first->getType(), AmountVal);
312  else if (InVal.first->getType() == llvm::Type::FloatTy)
313    // FIXME: Handle long double.
314    NextVal =
315      llvm::ConstantFP::get(llvm::APFloat(static_cast<float>(AmountVal)));
316  else {
317    // FIXME: Handle long double.
318    assert(InVal.first->getType() == llvm::Type::DoubleTy);
319    NextVal =
320      llvm::ConstantFP::get(llvm::APFloat(static_cast<double>(AmountVal)));
321  }
322
323  // Add the inc/dec to the real part.
324  NextVal = Builder.CreateAdd(InVal.first, NextVal, isInc ? "inc" : "dec");
325
326  ComplexPairTy IncVal(NextVal, InVal.second);
327
328  // Store the updated result through the lvalue.
329  EmitStoreOfComplex(IncVal, LV.getAddress(), false);  /* FIXME: Volatile */
330
331  // If this is a postinc, return the value read from memory, otherwise use the
332  // updated value.
333  return isPre ? IncVal : InVal;
334}
335
336ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
337  ComplexPairTy Op = Visit(E->getSubExpr());
338  llvm::Value *ResR = Builder.CreateNeg(Op.first,  "neg.r");
339  llvm::Value *ResI = Builder.CreateNeg(Op.second, "neg.i");
340  return ComplexPairTy(ResR, ResI);
341}
342
343ComplexPairTy ComplexExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
344  // ~(a+ib) = a + i*-b
345  ComplexPairTy Op = Visit(E->getSubExpr());
346  llvm::Value *ResI = Builder.CreateNeg(Op.second, "conj.i");
347  return ComplexPairTy(Op.first, ResI);
348}
349
350ComplexPairTy ComplexExprEmitter::EmitBinAdd(const BinOpInfo &Op) {
351  llvm::Value *ResR = Builder.CreateAdd(Op.LHS.first,  Op.RHS.first,  "add.r");
352  llvm::Value *ResI = Builder.CreateAdd(Op.LHS.second, Op.RHS.second, "add.i");
353  return ComplexPairTy(ResR, ResI);
354}
355
356ComplexPairTy ComplexExprEmitter::EmitBinSub(const BinOpInfo &Op) {
357  llvm::Value *ResR = Builder.CreateSub(Op.LHS.first,  Op.RHS.first,  "sub.r");
358  llvm::Value *ResI = Builder.CreateSub(Op.LHS.second, Op.RHS.second, "sub.i");
359  return ComplexPairTy(ResR, ResI);
360}
361
362
363ComplexPairTy ComplexExprEmitter::EmitBinMul(const BinOpInfo &Op) {
364  llvm::Value *ResRl = Builder.CreateMul(Op.LHS.first, Op.RHS.first, "mul.rl");
365  llvm::Value *ResRr = Builder.CreateMul(Op.LHS.second, Op.RHS.second,"mul.rr");
366  llvm::Value *ResR  = Builder.CreateSub(ResRl, ResRr, "mul.r");
367
368  llvm::Value *ResIl = Builder.CreateMul(Op.LHS.second, Op.RHS.first, "mul.il");
369  llvm::Value *ResIr = Builder.CreateMul(Op.LHS.first, Op.RHS.second, "mul.ir");
370  llvm::Value *ResI  = Builder.CreateAdd(ResIl, ResIr, "mul.i");
371  return ComplexPairTy(ResR, ResI);
372}
373
374ComplexPairTy ComplexExprEmitter::EmitBinDiv(const BinOpInfo &Op) {
375  llvm::Value *LHSr = Op.LHS.first, *LHSi = Op.LHS.second;
376  llvm::Value *RHSr = Op.RHS.first, *RHSi = Op.RHS.second;
377
378  // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
379  llvm::Value *Tmp1 = Builder.CreateMul(LHSr, RHSr, "tmp"); // a*c
380  llvm::Value *Tmp2 = Builder.CreateMul(LHSi, RHSi, "tmp"); // b*d
381  llvm::Value *Tmp3 = Builder.CreateAdd(Tmp1, Tmp2, "tmp"); // ac+bd
382
383  llvm::Value *Tmp4 = Builder.CreateMul(RHSr, RHSr, "tmp"); // c*c
384  llvm::Value *Tmp5 = Builder.CreateMul(RHSi, RHSi, "tmp"); // d*d
385  llvm::Value *Tmp6 = Builder.CreateAdd(Tmp4, Tmp5, "tmp"); // cc+dd
386
387  llvm::Value *Tmp7 = Builder.CreateMul(LHSi, RHSr, "tmp"); // b*c
388  llvm::Value *Tmp8 = Builder.CreateMul(LHSr, RHSi, "tmp"); // a*d
389  llvm::Value *Tmp9 = Builder.CreateSub(Tmp7, Tmp8, "tmp"); // bc-ad
390
391  llvm::Value *DSTr, *DSTi;
392  if (Tmp3->getType()->isFloatingPoint()) {
393    DSTr = Builder.CreateFDiv(Tmp3, Tmp6, "tmp");
394    DSTi = Builder.CreateFDiv(Tmp9, Tmp6, "tmp");
395  } else {
396    if (Op.Ty->getAsComplexType()->getElementType()->isUnsignedIntegerType()) {
397      DSTr = Builder.CreateUDiv(Tmp3, Tmp6, "tmp");
398      DSTi = Builder.CreateUDiv(Tmp9, Tmp6, "tmp");
399    } else {
400      DSTr = Builder.CreateSDiv(Tmp3, Tmp6, "tmp");
401      DSTi = Builder.CreateSDiv(Tmp9, Tmp6, "tmp");
402    }
403  }
404
405  return ComplexPairTy(DSTr, DSTi);
406}
407
408ComplexExprEmitter::BinOpInfo
409ComplexExprEmitter::EmitBinOps(const BinaryOperator *E) {
410  BinOpInfo Ops;
411  Ops.LHS = Visit(E->getLHS());
412  Ops.RHS = Visit(E->getRHS());
413  Ops.Ty = E->getType();
414  return Ops;
415}
416
417
418// Compound assignments.
419ComplexPairTy ComplexExprEmitter::
420EmitCompoundAssign(const CompoundAssignOperator *E,
421                   ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&)){
422  QualType LHSTy = E->getLHS()->getType(), RHSTy = E->getRHS()->getType();
423
424  // Load the LHS and RHS operands.
425  LValue LHSLV = CGF.EmitLValue(E->getLHS());
426
427  BinOpInfo OpInfo;
428  OpInfo.Ty = E->getComputationType();
429
430  // We know the LHS is a complex lvalue.
431  OpInfo.LHS = EmitLoadOfComplex(LHSLV.getAddress(), false);// FIXME: Volatile.
432  OpInfo.LHS = EmitComplexToComplexCast(OpInfo.LHS, LHSTy, OpInfo.Ty);
433
434  // It is possible for the RHS to be complex or scalar.
435  OpInfo.RHS = EmitCast(E->getRHS(), OpInfo.Ty);
436
437  // Expand the binary operator.
438  ComplexPairTy Result = (this->*Func)(OpInfo);
439
440  // Truncate the result back to the LHS type.
441  Result = EmitComplexToComplexCast(Result, OpInfo.Ty, LHSTy);
442
443  // Store the result value into the LHS lvalue.
444  EmitStoreOfComplex(Result, LHSLV.getAddress(), false); // FIXME: VOLATILE
445  return Result;
446}
447
448ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) {
449  assert(CGF.getContext().getCanonicalType(E->getLHS()->getType()) ==
450         CGF.getContext().getCanonicalType(E->getRHS()->getType()) &&
451         "Invalid assignment");
452  // Emit the RHS.
453  ComplexPairTy Val = Visit(E->getRHS());
454
455  // Compute the address to store into.
456  LValue LHS = CGF.EmitLValue(E->getLHS());
457
458  // Store into it.
459  // FIXME: Volatility!
460  EmitStoreOfComplex(Val, LHS.getAddress(), false);
461  return Val;
462}
463
464ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) {
465  CGF.EmitStmt(E->getLHS());
466  CGF.EnsureInsertPoint();
467  return Visit(E->getRHS());
468}
469
470ComplexPairTy ComplexExprEmitter::
471VisitConditionalOperator(const ConditionalOperator *E) {
472  llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true");
473  llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false");
474  llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
475
476  llvm::Value *Cond = CGF.EvaluateExprAsBool(E->getCond());
477  Builder.CreateCondBr(Cond, LHSBlock, RHSBlock);
478
479  CGF.EmitBlock(LHSBlock);
480
481  // Handle the GNU extension for missing LHS.
482  assert(E->getLHS() && "Must have LHS for complex value");
483
484  ComplexPairTy LHS = Visit(E->getLHS());
485  LHSBlock = Builder.GetInsertBlock();
486  CGF.EmitBranch(ContBlock);
487
488  CGF.EmitBlock(RHSBlock);
489
490  ComplexPairTy RHS = Visit(E->getRHS());
491  RHSBlock = Builder.GetInsertBlock();
492  CGF.EmitBranch(ContBlock);
493
494  CGF.EmitBlock(ContBlock);
495
496  // Create a PHI node for the real part.
497  llvm::PHINode *RealPN = Builder.CreatePHI(LHS.first->getType(), "cond.r");
498  RealPN->reserveOperandSpace(2);
499  RealPN->addIncoming(LHS.first, LHSBlock);
500  RealPN->addIncoming(RHS.first, RHSBlock);
501
502  // Create a PHI node for the imaginary part.
503  llvm::PHINode *ImagPN = Builder.CreatePHI(LHS.first->getType(), "cond.i");
504  ImagPN->reserveOperandSpace(2);
505  ImagPN->addIncoming(LHS.second, LHSBlock);
506  ImagPN->addIncoming(RHS.second, RHSBlock);
507
508  return ComplexPairTy(RealPN, ImagPN);
509}
510
511ComplexPairTy ComplexExprEmitter::VisitChooseExpr(ChooseExpr *E) {
512  return Visit(E->getChosenSubExpr(CGF.getContext()));
513}
514
515ComplexPairTy ComplexExprEmitter::VisitInitListExpr(InitListExpr *E) {
516  if (E->getNumInits())
517    return Visit(E->getInit(0));
518
519  // Empty init list intializes to null
520  QualType Ty = E->getType()->getAsComplexType()->getElementType();
521  const llvm::Type* LTy = CGF.ConvertType(Ty);
522  llvm::Value* zeroConstant = llvm::Constant::getNullValue(LTy);
523  return ComplexPairTy(zeroConstant, zeroConstant);
524}
525
526ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) {
527  llvm::Value *ArgValue = CGF.EmitVAListRef(E->getSubExpr());
528  llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, E->getType());
529
530  if (!ArgPtr) {
531    CGF.ErrorUnsupported(E, "complex va_arg expression");
532    const llvm::Type *EltTy =
533      CGF.ConvertType(E->getType()->getAsComplexType()->getElementType());
534    llvm::Value *U = llvm::UndefValue::get(EltTy);
535    return ComplexPairTy(U, U);
536  }
537
538  // FIXME Volatility.
539  return EmitLoadOfComplex(ArgPtr, false);
540}
541
542//===----------------------------------------------------------------------===//
543//                         Entry Point into this File
544//===----------------------------------------------------------------------===//
545
546/// EmitComplexExpr - Emit the computation of the specified expression of
547/// complex type, ignoring the result.
548ComplexPairTy CodeGenFunction::EmitComplexExpr(const Expr *E) {
549  assert(E && E->getType()->isAnyComplexType() &&
550         "Invalid complex expression to emit");
551
552  return ComplexExprEmitter(*this).Visit(const_cast<Expr*>(E));
553}
554
555/// EmitComplexExprIntoAddr - Emit the computation of the specified expression
556/// of complex type, storing into the specified Value*.
557void CodeGenFunction::EmitComplexExprIntoAddr(const Expr *E,
558                                              llvm::Value *DestAddr,
559                                              bool DestIsVolatile) {
560  assert(E && E->getType()->isAnyComplexType() &&
561         "Invalid complex expression to emit");
562  ComplexExprEmitter Emitter(*this);
563  ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E));
564  Emitter.EmitStoreOfComplex(Val, DestAddr, DestIsVolatile);
565}
566
567/// StoreComplexToAddr - Store a complex number into the specified address.
568void CodeGenFunction::StoreComplexToAddr(ComplexPairTy V,
569                                         llvm::Value *DestAddr,
570                                         bool DestIsVolatile) {
571  ComplexExprEmitter(*this).EmitStoreOfComplex(V, DestAddr, DestIsVolatile);
572}
573
574/// LoadComplexFromAddr - Load a complex number from the specified address.
575ComplexPairTy CodeGenFunction::LoadComplexFromAddr(llvm::Value *SrcAddr,
576                                                   bool SrcIsVolatile) {
577  return ComplexExprEmitter(*this).EmitLoadOfComplex(SrcAddr, SrcIsVolatile);
578}
579