xref: /aosp_15_r20/external/clang/lib/CodeGen/CGExprComplex.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- CGExprComplex.cpp - Emit LLVM Code for Complex Exprs -------------===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li // This contains code to emit Expr nodes with complex types as LLVM code.
11*67e74705SXin Li //
12*67e74705SXin Li //===----------------------------------------------------------------------===//
13*67e74705SXin Li 
14*67e74705SXin Li #include "CodeGenFunction.h"
15*67e74705SXin Li #include "CodeGenModule.h"
16*67e74705SXin Li #include "clang/AST/ASTContext.h"
17*67e74705SXin Li #include "clang/AST/StmtVisitor.h"
18*67e74705SXin Li #include "llvm/ADT/STLExtras.h"
19*67e74705SXin Li #include "llvm/ADT/SmallString.h"
20*67e74705SXin Li #include "llvm/IR/Constants.h"
21*67e74705SXin Li #include "llvm/IR/Function.h"
22*67e74705SXin Li #include "llvm/IR/Instructions.h"
23*67e74705SXin Li #include "llvm/IR/MDBuilder.h"
24*67e74705SXin Li #include "llvm/IR/Metadata.h"
25*67e74705SXin Li #include <algorithm>
26*67e74705SXin Li using namespace clang;
27*67e74705SXin Li using namespace CodeGen;
28*67e74705SXin Li 
29*67e74705SXin Li //===----------------------------------------------------------------------===//
30*67e74705SXin Li //                        Complex Expression Emitter
31*67e74705SXin Li //===----------------------------------------------------------------------===//
32*67e74705SXin Li 
33*67e74705SXin Li typedef CodeGenFunction::ComplexPairTy ComplexPairTy;
34*67e74705SXin Li 
35*67e74705SXin Li /// Return the complex type that we are meant to emit.
getComplexType(QualType type)36*67e74705SXin Li static const ComplexType *getComplexType(QualType type) {
37*67e74705SXin Li   type = type.getCanonicalType();
38*67e74705SXin Li   if (const ComplexType *comp = dyn_cast<ComplexType>(type)) {
39*67e74705SXin Li     return comp;
40*67e74705SXin Li   } else {
41*67e74705SXin Li     return cast<ComplexType>(cast<AtomicType>(type)->getValueType());
42*67e74705SXin Li   }
43*67e74705SXin Li }
44*67e74705SXin Li 
45*67e74705SXin Li namespace  {
46*67e74705SXin Li class ComplexExprEmitter
47*67e74705SXin Li   : public StmtVisitor<ComplexExprEmitter, ComplexPairTy> {
48*67e74705SXin Li   CodeGenFunction &CGF;
49*67e74705SXin Li   CGBuilderTy &Builder;
50*67e74705SXin Li   bool IgnoreReal;
51*67e74705SXin Li   bool IgnoreImag;
52*67e74705SXin Li public:
ComplexExprEmitter(CodeGenFunction & cgf,bool ir=false,bool ii=false)53*67e74705SXin Li   ComplexExprEmitter(CodeGenFunction &cgf, bool ir=false, bool ii=false)
54*67e74705SXin Li     : CGF(cgf), Builder(CGF.Builder), IgnoreReal(ir), IgnoreImag(ii) {
55*67e74705SXin Li   }
56*67e74705SXin Li 
57*67e74705SXin Li 
58*67e74705SXin Li   //===--------------------------------------------------------------------===//
59*67e74705SXin Li   //                               Utilities
60*67e74705SXin Li   //===--------------------------------------------------------------------===//
61*67e74705SXin Li 
TestAndClearIgnoreReal()62*67e74705SXin Li   bool TestAndClearIgnoreReal() {
63*67e74705SXin Li     bool I = IgnoreReal;
64*67e74705SXin Li     IgnoreReal = false;
65*67e74705SXin Li     return I;
66*67e74705SXin Li   }
TestAndClearIgnoreImag()67*67e74705SXin Li   bool TestAndClearIgnoreImag() {
68*67e74705SXin Li     bool I = IgnoreImag;
69*67e74705SXin Li     IgnoreImag = false;
70*67e74705SXin Li     return I;
71*67e74705SXin Li   }
72*67e74705SXin Li 
73*67e74705SXin Li   /// EmitLoadOfLValue - Given an expression with complex type that represents a
74*67e74705SXin Li   /// value l-value, this method emits the address of the l-value, then loads
75*67e74705SXin Li   /// and returns the result.
EmitLoadOfLValue(const Expr * E)76*67e74705SXin Li   ComplexPairTy EmitLoadOfLValue(const Expr *E) {
77*67e74705SXin Li     return EmitLoadOfLValue(CGF.EmitLValue(E), E->getExprLoc());
78*67e74705SXin Li   }
79*67e74705SXin Li 
80*67e74705SXin Li   ComplexPairTy EmitLoadOfLValue(LValue LV, SourceLocation Loc);
81*67e74705SXin Li 
82*67e74705SXin Li   /// EmitStoreOfComplex - Store the specified real/imag parts into the
83*67e74705SXin Li   /// specified value pointer.
84*67e74705SXin Li   void EmitStoreOfComplex(ComplexPairTy Val, LValue LV, bool isInit);
85*67e74705SXin Li 
86*67e74705SXin Li   /// Emit a cast from complex value Val to DestType.
87*67e74705SXin Li   ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType SrcType,
88*67e74705SXin Li                                          QualType DestType, SourceLocation Loc);
89*67e74705SXin Li   /// Emit a cast from scalar value Val to DestType.
90*67e74705SXin Li   ComplexPairTy EmitScalarToComplexCast(llvm::Value *Val, QualType SrcType,
91*67e74705SXin Li                                         QualType DestType, SourceLocation Loc);
92*67e74705SXin Li 
93*67e74705SXin Li   //===--------------------------------------------------------------------===//
94*67e74705SXin Li   //                            Visitor Methods
95*67e74705SXin Li   //===--------------------------------------------------------------------===//
96*67e74705SXin Li 
Visit(Expr * E)97*67e74705SXin Li   ComplexPairTy Visit(Expr *E) {
98*67e74705SXin Li     ApplyDebugLocation DL(CGF, E);
99*67e74705SXin Li     return StmtVisitor<ComplexExprEmitter, ComplexPairTy>::Visit(E);
100*67e74705SXin Li   }
101*67e74705SXin Li 
VisitStmt(Stmt * S)102*67e74705SXin Li   ComplexPairTy VisitStmt(Stmt *S) {
103*67e74705SXin Li     S->dump(CGF.getContext().getSourceManager());
104*67e74705SXin Li     llvm_unreachable("Stmt can't have complex result type!");
105*67e74705SXin Li   }
106*67e74705SXin Li   ComplexPairTy VisitExpr(Expr *S);
VisitParenExpr(ParenExpr * PE)107*67e74705SXin Li   ComplexPairTy VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr());}
VisitGenericSelectionExpr(GenericSelectionExpr * GE)108*67e74705SXin Li   ComplexPairTy VisitGenericSelectionExpr(GenericSelectionExpr *GE) {
109*67e74705SXin Li     return Visit(GE->getResultExpr());
110*67e74705SXin Li   }
111*67e74705SXin Li   ComplexPairTy VisitImaginaryLiteral(const ImaginaryLiteral *IL);
112*67e74705SXin Li   ComplexPairTy
VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr * PE)113*67e74705SXin Li   VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *PE) {
114*67e74705SXin Li     return Visit(PE->getReplacement());
115*67e74705SXin Li   }
116*67e74705SXin Li 
117*67e74705SXin Li   // l-values.
VisitDeclRefExpr(DeclRefExpr * E)118*67e74705SXin Li   ComplexPairTy VisitDeclRefExpr(DeclRefExpr *E) {
119*67e74705SXin Li     if (CodeGenFunction::ConstantEmission result = CGF.tryEmitAsConstant(E)) {
120*67e74705SXin Li       if (result.isReference())
121*67e74705SXin Li         return EmitLoadOfLValue(result.getReferenceLValue(CGF, E),
122*67e74705SXin Li                                 E->getExprLoc());
123*67e74705SXin Li 
124*67e74705SXin Li       llvm::Constant *pair = result.getValue();
125*67e74705SXin Li       return ComplexPairTy(pair->getAggregateElement(0U),
126*67e74705SXin Li                            pair->getAggregateElement(1U));
127*67e74705SXin Li     }
128*67e74705SXin Li     return EmitLoadOfLValue(E);
129*67e74705SXin Li   }
VisitObjCIvarRefExpr(ObjCIvarRefExpr * E)130*67e74705SXin Li   ComplexPairTy VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
131*67e74705SXin Li     return EmitLoadOfLValue(E);
132*67e74705SXin Li   }
VisitObjCMessageExpr(ObjCMessageExpr * E)133*67e74705SXin Li   ComplexPairTy VisitObjCMessageExpr(ObjCMessageExpr *E) {
134*67e74705SXin Li     return CGF.EmitObjCMessageExpr(E).getComplexVal();
135*67e74705SXin Li   }
VisitArraySubscriptExpr(Expr * E)136*67e74705SXin Li   ComplexPairTy VisitArraySubscriptExpr(Expr *E) { return EmitLoadOfLValue(E); }
VisitMemberExpr(const Expr * E)137*67e74705SXin Li   ComplexPairTy VisitMemberExpr(const Expr *E) { return EmitLoadOfLValue(E); }
VisitOpaqueValueExpr(OpaqueValueExpr * E)138*67e74705SXin Li   ComplexPairTy VisitOpaqueValueExpr(OpaqueValueExpr *E) {
139*67e74705SXin Li     if (E->isGLValue())
140*67e74705SXin Li       return EmitLoadOfLValue(CGF.getOpaqueLValueMapping(E), E->getExprLoc());
141*67e74705SXin Li     return CGF.getOpaqueRValueMapping(E).getComplexVal();
142*67e74705SXin Li   }
143*67e74705SXin Li 
VisitPseudoObjectExpr(PseudoObjectExpr * E)144*67e74705SXin Li   ComplexPairTy VisitPseudoObjectExpr(PseudoObjectExpr *E) {
145*67e74705SXin Li     return CGF.EmitPseudoObjectRValue(E).getComplexVal();
146*67e74705SXin Li   }
147*67e74705SXin Li 
148*67e74705SXin Li   // FIXME: CompoundLiteralExpr
149*67e74705SXin Li 
150*67e74705SXin Li   ComplexPairTy EmitCast(CastKind CK, Expr *Op, QualType DestTy);
VisitImplicitCastExpr(ImplicitCastExpr * E)151*67e74705SXin Li   ComplexPairTy VisitImplicitCastExpr(ImplicitCastExpr *E) {
152*67e74705SXin Li     // Unlike for scalars, we don't have to worry about function->ptr demotion
153*67e74705SXin Li     // here.
154*67e74705SXin Li     return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType());
155*67e74705SXin Li   }
VisitCastExpr(CastExpr * E)156*67e74705SXin Li   ComplexPairTy VisitCastExpr(CastExpr *E) {
157*67e74705SXin Li     if (const auto *ECE = dyn_cast<ExplicitCastExpr>(E))
158*67e74705SXin Li       CGF.CGM.EmitExplicitCastExprType(ECE, &CGF);
159*67e74705SXin Li     return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType());
160*67e74705SXin Li   }
161*67e74705SXin Li   ComplexPairTy VisitCallExpr(const CallExpr *E);
162*67e74705SXin Li   ComplexPairTy VisitStmtExpr(const StmtExpr *E);
163*67e74705SXin Li 
164*67e74705SXin Li   // Operators.
VisitPrePostIncDec(const UnaryOperator * E,bool isInc,bool isPre)165*67e74705SXin Li   ComplexPairTy VisitPrePostIncDec(const UnaryOperator *E,
166*67e74705SXin Li                                    bool isInc, bool isPre) {
167*67e74705SXin Li     LValue LV = CGF.EmitLValue(E->getSubExpr());
168*67e74705SXin Li     return CGF.EmitComplexPrePostIncDec(E, LV, isInc, isPre);
169*67e74705SXin Li   }
VisitUnaryPostDec(const UnaryOperator * E)170*67e74705SXin Li   ComplexPairTy VisitUnaryPostDec(const UnaryOperator *E) {
171*67e74705SXin Li     return VisitPrePostIncDec(E, false, false);
172*67e74705SXin Li   }
VisitUnaryPostInc(const UnaryOperator * E)173*67e74705SXin Li   ComplexPairTy VisitUnaryPostInc(const UnaryOperator *E) {
174*67e74705SXin Li     return VisitPrePostIncDec(E, true, false);
175*67e74705SXin Li   }
VisitUnaryPreDec(const UnaryOperator * E)176*67e74705SXin Li   ComplexPairTy VisitUnaryPreDec(const UnaryOperator *E) {
177*67e74705SXin Li     return VisitPrePostIncDec(E, false, true);
178*67e74705SXin Li   }
VisitUnaryPreInc(const UnaryOperator * E)179*67e74705SXin Li   ComplexPairTy VisitUnaryPreInc(const UnaryOperator *E) {
180*67e74705SXin Li     return VisitPrePostIncDec(E, true, true);
181*67e74705SXin Li   }
VisitUnaryDeref(const Expr * E)182*67e74705SXin Li   ComplexPairTy VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); }
VisitUnaryPlus(const UnaryOperator * E)183*67e74705SXin Li   ComplexPairTy VisitUnaryPlus     (const UnaryOperator *E) {
184*67e74705SXin Li     TestAndClearIgnoreReal();
185*67e74705SXin Li     TestAndClearIgnoreImag();
186*67e74705SXin Li     return Visit(E->getSubExpr());
187*67e74705SXin Li   }
188*67e74705SXin Li   ComplexPairTy VisitUnaryMinus    (const UnaryOperator *E);
189*67e74705SXin Li   ComplexPairTy VisitUnaryNot      (const UnaryOperator *E);
190*67e74705SXin Li   // LNot,Real,Imag never return complex.
VisitUnaryExtension(const UnaryOperator * E)191*67e74705SXin Li   ComplexPairTy VisitUnaryExtension(const UnaryOperator *E) {
192*67e74705SXin Li     return Visit(E->getSubExpr());
193*67e74705SXin Li   }
VisitCXXDefaultArgExpr(CXXDefaultArgExpr * DAE)194*67e74705SXin Li   ComplexPairTy VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
195*67e74705SXin Li     return Visit(DAE->getExpr());
196*67e74705SXin Li   }
VisitCXXDefaultInitExpr(CXXDefaultInitExpr * DIE)197*67e74705SXin Li   ComplexPairTy VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) {
198*67e74705SXin Li     CodeGenFunction::CXXDefaultInitExprScope Scope(CGF);
199*67e74705SXin Li     return Visit(DIE->getExpr());
200*67e74705SXin Li   }
VisitExprWithCleanups(ExprWithCleanups * E)201*67e74705SXin Li   ComplexPairTy VisitExprWithCleanups(ExprWithCleanups *E) {
202*67e74705SXin Li     CGF.enterFullExpression(E);
203*67e74705SXin Li     CodeGenFunction::RunCleanupsScope Scope(CGF);
204*67e74705SXin Li     return Visit(E->getSubExpr());
205*67e74705SXin Li   }
VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr * E)206*67e74705SXin Li   ComplexPairTy VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
207*67e74705SXin Li     assert(E->getType()->isAnyComplexType() && "Expected complex type!");
208*67e74705SXin Li     QualType Elem = E->getType()->castAs<ComplexType>()->getElementType();
209*67e74705SXin Li     llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem));
210*67e74705SXin Li     return ComplexPairTy(Null, Null);
211*67e74705SXin Li   }
VisitImplicitValueInitExpr(ImplicitValueInitExpr * E)212*67e74705SXin Li   ComplexPairTy VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
213*67e74705SXin Li     assert(E->getType()->isAnyComplexType() && "Expected complex type!");
214*67e74705SXin Li     QualType Elem = E->getType()->castAs<ComplexType>()->getElementType();
215*67e74705SXin Li     llvm::Constant *Null =
216*67e74705SXin Li                        llvm::Constant::getNullValue(CGF.ConvertType(Elem));
217*67e74705SXin Li     return ComplexPairTy(Null, Null);
218*67e74705SXin Li   }
219*67e74705SXin Li 
220*67e74705SXin Li   struct BinOpInfo {
221*67e74705SXin Li     ComplexPairTy LHS;
222*67e74705SXin Li     ComplexPairTy RHS;
223*67e74705SXin Li     QualType Ty;  // Computation Type.
224*67e74705SXin Li   };
225*67e74705SXin Li 
226*67e74705SXin Li   BinOpInfo EmitBinOps(const BinaryOperator *E);
227*67e74705SXin Li   LValue EmitCompoundAssignLValue(const CompoundAssignOperator *E,
228*67e74705SXin Li                                   ComplexPairTy (ComplexExprEmitter::*Func)
229*67e74705SXin Li                                   (const BinOpInfo &),
230*67e74705SXin Li                                   RValue &Val);
231*67e74705SXin Li   ComplexPairTy EmitCompoundAssign(const CompoundAssignOperator *E,
232*67e74705SXin Li                                    ComplexPairTy (ComplexExprEmitter::*Func)
233*67e74705SXin Li                                    (const BinOpInfo &));
234*67e74705SXin Li 
235*67e74705SXin Li   ComplexPairTy EmitBinAdd(const BinOpInfo &Op);
236*67e74705SXin Li   ComplexPairTy EmitBinSub(const BinOpInfo &Op);
237*67e74705SXin Li   ComplexPairTy EmitBinMul(const BinOpInfo &Op);
238*67e74705SXin Li   ComplexPairTy EmitBinDiv(const BinOpInfo &Op);
239*67e74705SXin Li 
240*67e74705SXin Li   ComplexPairTy EmitComplexBinOpLibCall(StringRef LibCallName,
241*67e74705SXin Li                                         const BinOpInfo &Op);
242*67e74705SXin Li 
VisitBinAdd(const BinaryOperator * E)243*67e74705SXin Li   ComplexPairTy VisitBinAdd(const BinaryOperator *E) {
244*67e74705SXin Li     return EmitBinAdd(EmitBinOps(E));
245*67e74705SXin Li   }
VisitBinSub(const BinaryOperator * E)246*67e74705SXin Li   ComplexPairTy VisitBinSub(const BinaryOperator *E) {
247*67e74705SXin Li     return EmitBinSub(EmitBinOps(E));
248*67e74705SXin Li   }
VisitBinMul(const BinaryOperator * E)249*67e74705SXin Li   ComplexPairTy VisitBinMul(const BinaryOperator *E) {
250*67e74705SXin Li     return EmitBinMul(EmitBinOps(E));
251*67e74705SXin Li   }
VisitBinDiv(const BinaryOperator * E)252*67e74705SXin Li   ComplexPairTy VisitBinDiv(const BinaryOperator *E) {
253*67e74705SXin Li     return EmitBinDiv(EmitBinOps(E));
254*67e74705SXin Li   }
255*67e74705SXin Li 
256*67e74705SXin Li   // Compound assignments.
VisitBinAddAssign(const CompoundAssignOperator * E)257*67e74705SXin Li   ComplexPairTy VisitBinAddAssign(const CompoundAssignOperator *E) {
258*67e74705SXin Li     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinAdd);
259*67e74705SXin Li   }
VisitBinSubAssign(const CompoundAssignOperator * E)260*67e74705SXin Li   ComplexPairTy VisitBinSubAssign(const CompoundAssignOperator *E) {
261*67e74705SXin Li     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinSub);
262*67e74705SXin Li   }
VisitBinMulAssign(const CompoundAssignOperator * E)263*67e74705SXin Li   ComplexPairTy VisitBinMulAssign(const CompoundAssignOperator *E) {
264*67e74705SXin Li     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinMul);
265*67e74705SXin Li   }
VisitBinDivAssign(const CompoundAssignOperator * E)266*67e74705SXin Li   ComplexPairTy VisitBinDivAssign(const CompoundAssignOperator *E) {
267*67e74705SXin Li     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinDiv);
268*67e74705SXin Li   }
269*67e74705SXin Li 
270*67e74705SXin Li   // GCC rejects rem/and/or/xor for integer complex.
271*67e74705SXin Li   // Logical and/or always return int, never complex.
272*67e74705SXin Li 
273*67e74705SXin Li   // No comparisons produce a complex result.
274*67e74705SXin Li 
275*67e74705SXin Li   LValue EmitBinAssignLValue(const BinaryOperator *E,
276*67e74705SXin Li                              ComplexPairTy &Val);
277*67e74705SXin Li   ComplexPairTy VisitBinAssign     (const BinaryOperator *E);
278*67e74705SXin Li   ComplexPairTy VisitBinComma      (const BinaryOperator *E);
279*67e74705SXin Li 
280*67e74705SXin Li 
281*67e74705SXin Li   ComplexPairTy
282*67e74705SXin Li   VisitAbstractConditionalOperator(const AbstractConditionalOperator *CO);
283*67e74705SXin Li   ComplexPairTy VisitChooseExpr(ChooseExpr *CE);
284*67e74705SXin Li 
285*67e74705SXin Li   ComplexPairTy VisitInitListExpr(InitListExpr *E);
286*67e74705SXin Li 
VisitCompoundLiteralExpr(CompoundLiteralExpr * E)287*67e74705SXin Li   ComplexPairTy VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
288*67e74705SXin Li     return EmitLoadOfLValue(E);
289*67e74705SXin Li   }
290*67e74705SXin Li 
291*67e74705SXin Li   ComplexPairTy VisitVAArgExpr(VAArgExpr *E);
292*67e74705SXin Li 
VisitAtomicExpr(AtomicExpr * E)293*67e74705SXin Li   ComplexPairTy VisitAtomicExpr(AtomicExpr *E) {
294*67e74705SXin Li     return CGF.EmitAtomicExpr(E).getComplexVal();
295*67e74705SXin Li   }
296*67e74705SXin Li };
297*67e74705SXin Li }  // end anonymous namespace.
298*67e74705SXin Li 
299*67e74705SXin Li //===----------------------------------------------------------------------===//
300*67e74705SXin Li //                                Utilities
301*67e74705SXin Li //===----------------------------------------------------------------------===//
302*67e74705SXin Li 
emitAddrOfRealComponent(Address addr,QualType complexType)303*67e74705SXin Li Address CodeGenFunction::emitAddrOfRealComponent(Address addr,
304*67e74705SXin Li                                                  QualType complexType) {
305*67e74705SXin Li   CharUnits offset = CharUnits::Zero();
306*67e74705SXin Li   return Builder.CreateStructGEP(addr, 0, offset, addr.getName() + ".realp");
307*67e74705SXin Li }
308*67e74705SXin Li 
emitAddrOfImagComponent(Address addr,QualType complexType)309*67e74705SXin Li Address CodeGenFunction::emitAddrOfImagComponent(Address addr,
310*67e74705SXin Li                                                  QualType complexType) {
311*67e74705SXin Li   QualType eltType = complexType->castAs<ComplexType>()->getElementType();
312*67e74705SXin Li   CharUnits offset = getContext().getTypeSizeInChars(eltType);
313*67e74705SXin Li   return Builder.CreateStructGEP(addr, 1, offset, addr.getName() + ".imagp");
314*67e74705SXin Li }
315*67e74705SXin Li 
316*67e74705SXin Li /// EmitLoadOfLValue - Given an RValue reference for a complex, emit code to
317*67e74705SXin Li /// load the real and imaginary pieces, returning them as Real/Imag.
EmitLoadOfLValue(LValue lvalue,SourceLocation loc)318*67e74705SXin Li ComplexPairTy ComplexExprEmitter::EmitLoadOfLValue(LValue lvalue,
319*67e74705SXin Li                                                    SourceLocation loc) {
320*67e74705SXin Li   assert(lvalue.isSimple() && "non-simple complex l-value?");
321*67e74705SXin Li   if (lvalue.getType()->isAtomicType())
322*67e74705SXin Li     return CGF.EmitAtomicLoad(lvalue, loc).getComplexVal();
323*67e74705SXin Li 
324*67e74705SXin Li   Address SrcPtr = lvalue.getAddress();
325*67e74705SXin Li   bool isVolatile = lvalue.isVolatileQualified();
326*67e74705SXin Li 
327*67e74705SXin Li   llvm::Value *Real = nullptr, *Imag = nullptr;
328*67e74705SXin Li 
329*67e74705SXin Li   if (!IgnoreReal || isVolatile) {
330*67e74705SXin Li     Address RealP = CGF.emitAddrOfRealComponent(SrcPtr, lvalue.getType());
331*67e74705SXin Li     Real = Builder.CreateLoad(RealP, isVolatile, SrcPtr.getName() + ".real");
332*67e74705SXin Li   }
333*67e74705SXin Li 
334*67e74705SXin Li   if (!IgnoreImag || isVolatile) {
335*67e74705SXin Li     Address ImagP = CGF.emitAddrOfImagComponent(SrcPtr, lvalue.getType());
336*67e74705SXin Li     Imag = Builder.CreateLoad(ImagP, isVolatile, SrcPtr.getName() + ".imag");
337*67e74705SXin Li   }
338*67e74705SXin Li 
339*67e74705SXin Li   return ComplexPairTy(Real, Imag);
340*67e74705SXin Li }
341*67e74705SXin Li 
342*67e74705SXin Li /// EmitStoreOfComplex - Store the specified real/imag parts into the
343*67e74705SXin Li /// specified value pointer.
EmitStoreOfComplex(ComplexPairTy Val,LValue lvalue,bool isInit)344*67e74705SXin Li void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, LValue lvalue,
345*67e74705SXin Li                                             bool isInit) {
346*67e74705SXin Li   if (lvalue.getType()->isAtomicType() ||
347*67e74705SXin Li       (!isInit && CGF.LValueIsSuitableForInlineAtomic(lvalue)))
348*67e74705SXin Li     return CGF.EmitAtomicStore(RValue::getComplex(Val), lvalue, isInit);
349*67e74705SXin Li 
350*67e74705SXin Li   Address Ptr = lvalue.getAddress();
351*67e74705SXin Li   Address RealPtr = CGF.emitAddrOfRealComponent(Ptr, lvalue.getType());
352*67e74705SXin Li   Address ImagPtr = CGF.emitAddrOfImagComponent(Ptr, lvalue.getType());
353*67e74705SXin Li 
354*67e74705SXin Li   Builder.CreateStore(Val.first, RealPtr, lvalue.isVolatileQualified());
355*67e74705SXin Li   Builder.CreateStore(Val.second, ImagPtr, lvalue.isVolatileQualified());
356*67e74705SXin Li }
357*67e74705SXin Li 
358*67e74705SXin Li 
359*67e74705SXin Li 
360*67e74705SXin Li //===----------------------------------------------------------------------===//
361*67e74705SXin Li //                            Visitor Methods
362*67e74705SXin Li //===----------------------------------------------------------------------===//
363*67e74705SXin Li 
VisitExpr(Expr * E)364*67e74705SXin Li ComplexPairTy ComplexExprEmitter::VisitExpr(Expr *E) {
365*67e74705SXin Li   CGF.ErrorUnsupported(E, "complex expression");
366*67e74705SXin Li   llvm::Type *EltTy =
367*67e74705SXin Li     CGF.ConvertType(getComplexType(E->getType())->getElementType());
368*67e74705SXin Li   llvm::Value *U = llvm::UndefValue::get(EltTy);
369*67e74705SXin Li   return ComplexPairTy(U, U);
370*67e74705SXin Li }
371*67e74705SXin Li 
372*67e74705SXin Li ComplexPairTy ComplexExprEmitter::
VisitImaginaryLiteral(const ImaginaryLiteral * IL)373*67e74705SXin Li VisitImaginaryLiteral(const ImaginaryLiteral *IL) {
374*67e74705SXin Li   llvm::Value *Imag = CGF.EmitScalarExpr(IL->getSubExpr());
375*67e74705SXin Li   return ComplexPairTy(llvm::Constant::getNullValue(Imag->getType()), Imag);
376*67e74705SXin Li }
377*67e74705SXin Li 
378*67e74705SXin Li 
VisitCallExpr(const CallExpr * E)379*67e74705SXin Li ComplexPairTy ComplexExprEmitter::VisitCallExpr(const CallExpr *E) {
380*67e74705SXin Li   if (E->getCallReturnType(CGF.getContext())->isReferenceType())
381*67e74705SXin Li     return EmitLoadOfLValue(E);
382*67e74705SXin Li 
383*67e74705SXin Li   return CGF.EmitCallExpr(E).getComplexVal();
384*67e74705SXin Li }
385*67e74705SXin Li 
VisitStmtExpr(const StmtExpr * E)386*67e74705SXin Li ComplexPairTy ComplexExprEmitter::VisitStmtExpr(const StmtExpr *E) {
387*67e74705SXin Li   CodeGenFunction::StmtExprEvaluation eval(CGF);
388*67e74705SXin Li   Address RetAlloca = CGF.EmitCompoundStmt(*E->getSubStmt(), true);
389*67e74705SXin Li   assert(RetAlloca.isValid() && "Expected complex return value");
390*67e74705SXin Li   return EmitLoadOfLValue(CGF.MakeAddrLValue(RetAlloca, E->getType()),
391*67e74705SXin Li                           E->getExprLoc());
392*67e74705SXin Li }
393*67e74705SXin Li 
394*67e74705SXin Li /// Emit a cast from complex value Val to DestType.
EmitComplexToComplexCast(ComplexPairTy Val,QualType SrcType,QualType DestType,SourceLocation Loc)395*67e74705SXin Li ComplexPairTy ComplexExprEmitter::EmitComplexToComplexCast(ComplexPairTy Val,
396*67e74705SXin Li                                                            QualType SrcType,
397*67e74705SXin Li                                                            QualType DestType,
398*67e74705SXin Li                                                            SourceLocation Loc) {
399*67e74705SXin Li   // Get the src/dest element type.
400*67e74705SXin Li   SrcType = SrcType->castAs<ComplexType>()->getElementType();
401*67e74705SXin Li   DestType = DestType->castAs<ComplexType>()->getElementType();
402*67e74705SXin Li 
403*67e74705SXin Li   // C99 6.3.1.6: When a value of complex type is converted to another
404*67e74705SXin Li   // complex type, both the real and imaginary parts follow the conversion
405*67e74705SXin Li   // rules for the corresponding real types.
406*67e74705SXin Li   Val.first = CGF.EmitScalarConversion(Val.first, SrcType, DestType, Loc);
407*67e74705SXin Li   Val.second = CGF.EmitScalarConversion(Val.second, SrcType, DestType, Loc);
408*67e74705SXin Li   return Val;
409*67e74705SXin Li }
410*67e74705SXin Li 
EmitScalarToComplexCast(llvm::Value * Val,QualType SrcType,QualType DestType,SourceLocation Loc)411*67e74705SXin Li ComplexPairTy ComplexExprEmitter::EmitScalarToComplexCast(llvm::Value *Val,
412*67e74705SXin Li                                                           QualType SrcType,
413*67e74705SXin Li                                                           QualType DestType,
414*67e74705SXin Li                                                           SourceLocation Loc) {
415*67e74705SXin Li   // Convert the input element to the element type of the complex.
416*67e74705SXin Li   DestType = DestType->castAs<ComplexType>()->getElementType();
417*67e74705SXin Li   Val = CGF.EmitScalarConversion(Val, SrcType, DestType, Loc);
418*67e74705SXin Li 
419*67e74705SXin Li   // Return (realval, 0).
420*67e74705SXin Li   return ComplexPairTy(Val, llvm::Constant::getNullValue(Val->getType()));
421*67e74705SXin Li }
422*67e74705SXin Li 
EmitCast(CastKind CK,Expr * Op,QualType DestTy)423*67e74705SXin Li ComplexPairTy ComplexExprEmitter::EmitCast(CastKind CK, Expr *Op,
424*67e74705SXin Li                                            QualType DestTy) {
425*67e74705SXin Li   switch (CK) {
426*67e74705SXin Li   case CK_Dependent: llvm_unreachable("dependent cast kind in IR gen!");
427*67e74705SXin Li 
428*67e74705SXin Li   // Atomic to non-atomic casts may be more than a no-op for some platforms and
429*67e74705SXin Li   // for some types.
430*67e74705SXin Li   case CK_AtomicToNonAtomic:
431*67e74705SXin Li   case CK_NonAtomicToAtomic:
432*67e74705SXin Li   case CK_NoOp:
433*67e74705SXin Li   case CK_LValueToRValue:
434*67e74705SXin Li   case CK_UserDefinedConversion:
435*67e74705SXin Li     return Visit(Op);
436*67e74705SXin Li 
437*67e74705SXin Li   case CK_LValueBitCast: {
438*67e74705SXin Li     LValue origLV = CGF.EmitLValue(Op);
439*67e74705SXin Li     Address V = origLV.getAddress();
440*67e74705SXin Li     V = Builder.CreateElementBitCast(V, CGF.ConvertType(DestTy));
441*67e74705SXin Li     return EmitLoadOfLValue(CGF.MakeAddrLValue(V, DestTy), Op->getExprLoc());
442*67e74705SXin Li   }
443*67e74705SXin Li 
444*67e74705SXin Li   case CK_BitCast:
445*67e74705SXin Li   case CK_BaseToDerived:
446*67e74705SXin Li   case CK_DerivedToBase:
447*67e74705SXin Li   case CK_UncheckedDerivedToBase:
448*67e74705SXin Li   case CK_Dynamic:
449*67e74705SXin Li   case CK_ToUnion:
450*67e74705SXin Li   case CK_ArrayToPointerDecay:
451*67e74705SXin Li   case CK_FunctionToPointerDecay:
452*67e74705SXin Li   case CK_NullToPointer:
453*67e74705SXin Li   case CK_NullToMemberPointer:
454*67e74705SXin Li   case CK_BaseToDerivedMemberPointer:
455*67e74705SXin Li   case CK_DerivedToBaseMemberPointer:
456*67e74705SXin Li   case CK_MemberPointerToBoolean:
457*67e74705SXin Li   case CK_ReinterpretMemberPointer:
458*67e74705SXin Li   case CK_ConstructorConversion:
459*67e74705SXin Li   case CK_IntegralToPointer:
460*67e74705SXin Li   case CK_PointerToIntegral:
461*67e74705SXin Li   case CK_PointerToBoolean:
462*67e74705SXin Li   case CK_ToVoid:
463*67e74705SXin Li   case CK_VectorSplat:
464*67e74705SXin Li   case CK_IntegralCast:
465*67e74705SXin Li   case CK_BooleanToSignedIntegral:
466*67e74705SXin Li   case CK_IntegralToBoolean:
467*67e74705SXin Li   case CK_IntegralToFloating:
468*67e74705SXin Li   case CK_FloatingToIntegral:
469*67e74705SXin Li   case CK_FloatingToBoolean:
470*67e74705SXin Li   case CK_FloatingCast:
471*67e74705SXin Li   case CK_CPointerToObjCPointerCast:
472*67e74705SXin Li   case CK_BlockPointerToObjCPointerCast:
473*67e74705SXin Li   case CK_AnyPointerToBlockPointerCast:
474*67e74705SXin Li   case CK_ObjCObjectLValueCast:
475*67e74705SXin Li   case CK_FloatingComplexToReal:
476*67e74705SXin Li   case CK_FloatingComplexToBoolean:
477*67e74705SXin Li   case CK_IntegralComplexToReal:
478*67e74705SXin Li   case CK_IntegralComplexToBoolean:
479*67e74705SXin Li   case CK_ARCProduceObject:
480*67e74705SXin Li   case CK_ARCConsumeObject:
481*67e74705SXin Li   case CK_ARCReclaimReturnedObject:
482*67e74705SXin Li   case CK_ARCExtendBlockObject:
483*67e74705SXin Li   case CK_CopyAndAutoreleaseBlockObject:
484*67e74705SXin Li   case CK_BuiltinFnToFnPtr:
485*67e74705SXin Li   case CK_ZeroToOCLEvent:
486*67e74705SXin Li   case CK_AddressSpaceConversion:
487*67e74705SXin Li     llvm_unreachable("invalid cast kind for complex value");
488*67e74705SXin Li 
489*67e74705SXin Li   case CK_FloatingRealToComplex:
490*67e74705SXin Li   case CK_IntegralRealToComplex:
491*67e74705SXin Li     return EmitScalarToComplexCast(CGF.EmitScalarExpr(Op), Op->getType(),
492*67e74705SXin Li                                    DestTy, Op->getExprLoc());
493*67e74705SXin Li 
494*67e74705SXin Li   case CK_FloatingComplexCast:
495*67e74705SXin Li   case CK_FloatingComplexToIntegralComplex:
496*67e74705SXin Li   case CK_IntegralComplexCast:
497*67e74705SXin Li   case CK_IntegralComplexToFloatingComplex:
498*67e74705SXin Li     return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy,
499*67e74705SXin Li                                     Op->getExprLoc());
500*67e74705SXin Li   }
501*67e74705SXin Li 
502*67e74705SXin Li   llvm_unreachable("unknown cast resulting in complex value");
503*67e74705SXin Li }
504*67e74705SXin Li 
VisitUnaryMinus(const UnaryOperator * E)505*67e74705SXin Li ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
506*67e74705SXin Li   TestAndClearIgnoreReal();
507*67e74705SXin Li   TestAndClearIgnoreImag();
508*67e74705SXin Li   ComplexPairTy Op = Visit(E->getSubExpr());
509*67e74705SXin Li 
510*67e74705SXin Li   llvm::Value *ResR, *ResI;
511*67e74705SXin Li   if (Op.first->getType()->isFloatingPointTy()) {
512*67e74705SXin Li     ResR = Builder.CreateFNeg(Op.first,  "neg.r");
513*67e74705SXin Li     ResI = Builder.CreateFNeg(Op.second, "neg.i");
514*67e74705SXin Li   } else {
515*67e74705SXin Li     ResR = Builder.CreateNeg(Op.first,  "neg.r");
516*67e74705SXin Li     ResI = Builder.CreateNeg(Op.second, "neg.i");
517*67e74705SXin Li   }
518*67e74705SXin Li   return ComplexPairTy(ResR, ResI);
519*67e74705SXin Li }
520*67e74705SXin Li 
VisitUnaryNot(const UnaryOperator * E)521*67e74705SXin Li ComplexPairTy ComplexExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
522*67e74705SXin Li   TestAndClearIgnoreReal();
523*67e74705SXin Li   TestAndClearIgnoreImag();
524*67e74705SXin Li   // ~(a+ib) = a + i*-b
525*67e74705SXin Li   ComplexPairTy Op = Visit(E->getSubExpr());
526*67e74705SXin Li   llvm::Value *ResI;
527*67e74705SXin Li   if (Op.second->getType()->isFloatingPointTy())
528*67e74705SXin Li     ResI = Builder.CreateFNeg(Op.second, "conj.i");
529*67e74705SXin Li   else
530*67e74705SXin Li     ResI = Builder.CreateNeg(Op.second, "conj.i");
531*67e74705SXin Li 
532*67e74705SXin Li   return ComplexPairTy(Op.first, ResI);
533*67e74705SXin Li }
534*67e74705SXin Li 
EmitBinAdd(const BinOpInfo & Op)535*67e74705SXin Li ComplexPairTy ComplexExprEmitter::EmitBinAdd(const BinOpInfo &Op) {
536*67e74705SXin Li   llvm::Value *ResR, *ResI;
537*67e74705SXin Li 
538*67e74705SXin Li   if (Op.LHS.first->getType()->isFloatingPointTy()) {
539*67e74705SXin Li     ResR = Builder.CreateFAdd(Op.LHS.first,  Op.RHS.first,  "add.r");
540*67e74705SXin Li     if (Op.LHS.second && Op.RHS.second)
541*67e74705SXin Li       ResI = Builder.CreateFAdd(Op.LHS.second, Op.RHS.second, "add.i");
542*67e74705SXin Li     else
543*67e74705SXin Li       ResI = Op.LHS.second ? Op.LHS.second : Op.RHS.second;
544*67e74705SXin Li     assert(ResI && "Only one operand may be real!");
545*67e74705SXin Li   } else {
546*67e74705SXin Li     ResR = Builder.CreateAdd(Op.LHS.first,  Op.RHS.first,  "add.r");
547*67e74705SXin Li     assert(Op.LHS.second && Op.RHS.second &&
548*67e74705SXin Li            "Both operands of integer complex operators must be complex!");
549*67e74705SXin Li     ResI = Builder.CreateAdd(Op.LHS.second, Op.RHS.second, "add.i");
550*67e74705SXin Li   }
551*67e74705SXin Li   return ComplexPairTy(ResR, ResI);
552*67e74705SXin Li }
553*67e74705SXin Li 
EmitBinSub(const BinOpInfo & Op)554*67e74705SXin Li ComplexPairTy ComplexExprEmitter::EmitBinSub(const BinOpInfo &Op) {
555*67e74705SXin Li   llvm::Value *ResR, *ResI;
556*67e74705SXin Li   if (Op.LHS.first->getType()->isFloatingPointTy()) {
557*67e74705SXin Li     ResR = Builder.CreateFSub(Op.LHS.first, Op.RHS.first, "sub.r");
558*67e74705SXin Li     if (Op.LHS.second && Op.RHS.second)
559*67e74705SXin Li       ResI = Builder.CreateFSub(Op.LHS.second, Op.RHS.second, "sub.i");
560*67e74705SXin Li     else
561*67e74705SXin Li       ResI = Op.LHS.second ? Op.LHS.second
562*67e74705SXin Li                            : Builder.CreateFNeg(Op.RHS.second, "sub.i");
563*67e74705SXin Li     assert(ResI && "Only one operand may be real!");
564*67e74705SXin Li   } else {
565*67e74705SXin Li     ResR = Builder.CreateSub(Op.LHS.first, Op.RHS.first, "sub.r");
566*67e74705SXin Li     assert(Op.LHS.second && Op.RHS.second &&
567*67e74705SXin Li            "Both operands of integer complex operators must be complex!");
568*67e74705SXin Li     ResI = Builder.CreateSub(Op.LHS.second, Op.RHS.second, "sub.i");
569*67e74705SXin Li   }
570*67e74705SXin Li   return ComplexPairTy(ResR, ResI);
571*67e74705SXin Li }
572*67e74705SXin Li 
573*67e74705SXin Li /// \brief Emit a libcall for a binary operation on complex types.
EmitComplexBinOpLibCall(StringRef LibCallName,const BinOpInfo & Op)574*67e74705SXin Li ComplexPairTy ComplexExprEmitter::EmitComplexBinOpLibCall(StringRef LibCallName,
575*67e74705SXin Li                                                           const BinOpInfo &Op) {
576*67e74705SXin Li   CallArgList Args;
577*67e74705SXin Li   Args.add(RValue::get(Op.LHS.first),
578*67e74705SXin Li            Op.Ty->castAs<ComplexType>()->getElementType());
579*67e74705SXin Li   Args.add(RValue::get(Op.LHS.second),
580*67e74705SXin Li            Op.Ty->castAs<ComplexType>()->getElementType());
581*67e74705SXin Li   Args.add(RValue::get(Op.RHS.first),
582*67e74705SXin Li            Op.Ty->castAs<ComplexType>()->getElementType());
583*67e74705SXin Li   Args.add(RValue::get(Op.RHS.second),
584*67e74705SXin Li            Op.Ty->castAs<ComplexType>()->getElementType());
585*67e74705SXin Li 
586*67e74705SXin Li   // We *must* use the full CG function call building logic here because the
587*67e74705SXin Li   // complex type has special ABI handling. We also should not forget about
588*67e74705SXin Li   // special calling convention which may be used for compiler builtins.
589*67e74705SXin Li 
590*67e74705SXin Li   // We create a function qualified type to state that this call does not have
591*67e74705SXin Li   // any exceptions.
592*67e74705SXin Li   FunctionProtoType::ExtProtoInfo EPI;
593*67e74705SXin Li   EPI = EPI.withExceptionSpec(
594*67e74705SXin Li       FunctionProtoType::ExceptionSpecInfo(EST_BasicNoexcept));
595*67e74705SXin Li   SmallVector<QualType, 4> ArgsQTys(
596*67e74705SXin Li       4, Op.Ty->castAs<ComplexType>()->getElementType());
597*67e74705SXin Li   QualType FQTy = CGF.getContext().getFunctionType(Op.Ty, ArgsQTys, EPI);
598*67e74705SXin Li   const CGFunctionInfo &FuncInfo = CGF.CGM.getTypes().arrangeFreeFunctionCall(
599*67e74705SXin Li       Args, cast<FunctionType>(FQTy.getTypePtr()), false);
600*67e74705SXin Li 
601*67e74705SXin Li   llvm::FunctionType *FTy = CGF.CGM.getTypes().GetFunctionType(FuncInfo);
602*67e74705SXin Li   llvm::Constant *Func = CGF.CGM.CreateBuiltinFunction(FTy, LibCallName);
603*67e74705SXin Li   llvm::Instruction *Call;
604*67e74705SXin Li 
605*67e74705SXin Li   RValue Res = CGF.EmitCall(FuncInfo, Func, ReturnValueSlot(), Args,
606*67e74705SXin Li                             FQTy->getAs<FunctionProtoType>(), &Call);
607*67e74705SXin Li   cast<llvm::CallInst>(Call)->setCallingConv(CGF.CGM.getBuiltinCC());
608*67e74705SXin Li   return Res.getComplexVal();
609*67e74705SXin Li }
610*67e74705SXin Li 
611*67e74705SXin Li /// \brief Lookup the libcall name for a given floating point type complex
612*67e74705SXin Li /// multiply.
getComplexMultiplyLibCallName(llvm::Type * Ty)613*67e74705SXin Li static StringRef getComplexMultiplyLibCallName(llvm::Type *Ty) {
614*67e74705SXin Li   switch (Ty->getTypeID()) {
615*67e74705SXin Li   default:
616*67e74705SXin Li     llvm_unreachable("Unsupported floating point type!");
617*67e74705SXin Li   case llvm::Type::HalfTyID:
618*67e74705SXin Li     return "__mulhc3";
619*67e74705SXin Li   case llvm::Type::FloatTyID:
620*67e74705SXin Li     return "__mulsc3";
621*67e74705SXin Li   case llvm::Type::DoubleTyID:
622*67e74705SXin Li     return "__muldc3";
623*67e74705SXin Li   case llvm::Type::PPC_FP128TyID:
624*67e74705SXin Li     return "__multc3";
625*67e74705SXin Li   case llvm::Type::X86_FP80TyID:
626*67e74705SXin Li     return "__mulxc3";
627*67e74705SXin Li   case llvm::Type::FP128TyID:
628*67e74705SXin Li     return "__multc3";
629*67e74705SXin Li   }
630*67e74705SXin Li }
631*67e74705SXin Li 
632*67e74705SXin Li // See C11 Annex G.5.1 for the semantics of multiplicative operators on complex
633*67e74705SXin Li // typed values.
EmitBinMul(const BinOpInfo & Op)634*67e74705SXin Li ComplexPairTy ComplexExprEmitter::EmitBinMul(const BinOpInfo &Op) {
635*67e74705SXin Li   using llvm::Value;
636*67e74705SXin Li   Value *ResR, *ResI;
637*67e74705SXin Li   llvm::MDBuilder MDHelper(CGF.getLLVMContext());
638*67e74705SXin Li 
639*67e74705SXin Li   if (Op.LHS.first->getType()->isFloatingPointTy()) {
640*67e74705SXin Li     // The general formulation is:
641*67e74705SXin Li     // (a + ib) * (c + id) = (a * c - b * d) + i(a * d + b * c)
642*67e74705SXin Li     //
643*67e74705SXin Li     // But we can fold away components which would be zero due to a real
644*67e74705SXin Li     // operand according to C11 Annex G.5.1p2.
645*67e74705SXin Li     // FIXME: C11 also provides for imaginary types which would allow folding
646*67e74705SXin Li     // still more of this within the type system.
647*67e74705SXin Li 
648*67e74705SXin Li     if (Op.LHS.second && Op.RHS.second) {
649*67e74705SXin Li       // If both operands are complex, emit the core math directly, and then
650*67e74705SXin Li       // test for NaNs. If we find NaNs in the result, we delegate to a libcall
651*67e74705SXin Li       // to carefully re-compute the correct infinity representation if
652*67e74705SXin Li       // possible. The expectation is that the presence of NaNs here is
653*67e74705SXin Li       // *extremely* rare, and so the cost of the libcall is almost irrelevant.
654*67e74705SXin Li       // This is good, because the libcall re-computes the core multiplication
655*67e74705SXin Li       // exactly the same as we do here and re-tests for NaNs in order to be
656*67e74705SXin Li       // a generic complex*complex libcall.
657*67e74705SXin Li 
658*67e74705SXin Li       // First compute the four products.
659*67e74705SXin Li       Value *AC = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul_ac");
660*67e74705SXin Li       Value *BD = Builder.CreateFMul(Op.LHS.second, Op.RHS.second, "mul_bd");
661*67e74705SXin Li       Value *AD = Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul_ad");
662*67e74705SXin Li       Value *BC = Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul_bc");
663*67e74705SXin Li 
664*67e74705SXin Li       // The real part is the difference of the first two, the imaginary part is
665*67e74705SXin Li       // the sum of the second.
666*67e74705SXin Li       ResR = Builder.CreateFSub(AC, BD, "mul_r");
667*67e74705SXin Li       ResI = Builder.CreateFAdd(AD, BC, "mul_i");
668*67e74705SXin Li 
669*67e74705SXin Li       // Emit the test for the real part becoming NaN and create a branch to
670*67e74705SXin Li       // handle it. We test for NaN by comparing the number to itself.
671*67e74705SXin Li       Value *IsRNaN = Builder.CreateFCmpUNO(ResR, ResR, "isnan_cmp");
672*67e74705SXin Li       llvm::BasicBlock *ContBB = CGF.createBasicBlock("complex_mul_cont");
673*67e74705SXin Li       llvm::BasicBlock *INaNBB = CGF.createBasicBlock("complex_mul_imag_nan");
674*67e74705SXin Li       llvm::Instruction *Branch = Builder.CreateCondBr(IsRNaN, INaNBB, ContBB);
675*67e74705SXin Li       llvm::BasicBlock *OrigBB = Branch->getParent();
676*67e74705SXin Li 
677*67e74705SXin Li       // Give hint that we very much don't expect to see NaNs.
678*67e74705SXin Li       // Value chosen to match UR_NONTAKEN_WEIGHT, see BranchProbabilityInfo.cpp
679*67e74705SXin Li       llvm::MDNode *BrWeight = MDHelper.createBranchWeights(1, (1U << 20) - 1);
680*67e74705SXin Li       Branch->setMetadata(llvm::LLVMContext::MD_prof, BrWeight);
681*67e74705SXin Li 
682*67e74705SXin Li       // Now test the imaginary part and create its branch.
683*67e74705SXin Li       CGF.EmitBlock(INaNBB);
684*67e74705SXin Li       Value *IsINaN = Builder.CreateFCmpUNO(ResI, ResI, "isnan_cmp");
685*67e74705SXin Li       llvm::BasicBlock *LibCallBB = CGF.createBasicBlock("complex_mul_libcall");
686*67e74705SXin Li       Branch = Builder.CreateCondBr(IsINaN, LibCallBB, ContBB);
687*67e74705SXin Li       Branch->setMetadata(llvm::LLVMContext::MD_prof, BrWeight);
688*67e74705SXin Li 
689*67e74705SXin Li       // Now emit the libcall on this slowest of the slow paths.
690*67e74705SXin Li       CGF.EmitBlock(LibCallBB);
691*67e74705SXin Li       Value *LibCallR, *LibCallI;
692*67e74705SXin Li       std::tie(LibCallR, LibCallI) = EmitComplexBinOpLibCall(
693*67e74705SXin Li           getComplexMultiplyLibCallName(Op.LHS.first->getType()), Op);
694*67e74705SXin Li       Builder.CreateBr(ContBB);
695*67e74705SXin Li 
696*67e74705SXin Li       // Finally continue execution by phi-ing together the different
697*67e74705SXin Li       // computation paths.
698*67e74705SXin Li       CGF.EmitBlock(ContBB);
699*67e74705SXin Li       llvm::PHINode *RealPHI = Builder.CreatePHI(ResR->getType(), 3, "real_mul_phi");
700*67e74705SXin Li       RealPHI->addIncoming(ResR, OrigBB);
701*67e74705SXin Li       RealPHI->addIncoming(ResR, INaNBB);
702*67e74705SXin Li       RealPHI->addIncoming(LibCallR, LibCallBB);
703*67e74705SXin Li       llvm::PHINode *ImagPHI = Builder.CreatePHI(ResI->getType(), 3, "imag_mul_phi");
704*67e74705SXin Li       ImagPHI->addIncoming(ResI, OrigBB);
705*67e74705SXin Li       ImagPHI->addIncoming(ResI, INaNBB);
706*67e74705SXin Li       ImagPHI->addIncoming(LibCallI, LibCallBB);
707*67e74705SXin Li       return ComplexPairTy(RealPHI, ImagPHI);
708*67e74705SXin Li     }
709*67e74705SXin Li     assert((Op.LHS.second || Op.RHS.second) &&
710*67e74705SXin Li            "At least one operand must be complex!");
711*67e74705SXin Li 
712*67e74705SXin Li     // If either of the operands is a real rather than a complex, the
713*67e74705SXin Li     // imaginary component is ignored when computing the real component of the
714*67e74705SXin Li     // result.
715*67e74705SXin Li     ResR = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul.rl");
716*67e74705SXin Li 
717*67e74705SXin Li     ResI = Op.LHS.second
718*67e74705SXin Li                ? Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul.il")
719*67e74705SXin Li                : Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul.ir");
720*67e74705SXin Li   } else {
721*67e74705SXin Li     assert(Op.LHS.second && Op.RHS.second &&
722*67e74705SXin Li            "Both operands of integer complex operators must be complex!");
723*67e74705SXin Li     Value *ResRl = Builder.CreateMul(Op.LHS.first, Op.RHS.first, "mul.rl");
724*67e74705SXin Li     Value *ResRr = Builder.CreateMul(Op.LHS.second, Op.RHS.second, "mul.rr");
725*67e74705SXin Li     ResR = Builder.CreateSub(ResRl, ResRr, "mul.r");
726*67e74705SXin Li 
727*67e74705SXin Li     Value *ResIl = Builder.CreateMul(Op.LHS.second, Op.RHS.first, "mul.il");
728*67e74705SXin Li     Value *ResIr = Builder.CreateMul(Op.LHS.first, Op.RHS.second, "mul.ir");
729*67e74705SXin Li     ResI = Builder.CreateAdd(ResIl, ResIr, "mul.i");
730*67e74705SXin Li   }
731*67e74705SXin Li   return ComplexPairTy(ResR, ResI);
732*67e74705SXin Li }
733*67e74705SXin Li 
734*67e74705SXin Li // See C11 Annex G.5.1 for the semantics of multiplicative operators on complex
735*67e74705SXin Li // typed values.
EmitBinDiv(const BinOpInfo & Op)736*67e74705SXin Li ComplexPairTy ComplexExprEmitter::EmitBinDiv(const BinOpInfo &Op) {
737*67e74705SXin Li   llvm::Value *LHSr = Op.LHS.first, *LHSi = Op.LHS.second;
738*67e74705SXin Li   llvm::Value *RHSr = Op.RHS.first, *RHSi = Op.RHS.second;
739*67e74705SXin Li 
740*67e74705SXin Li 
741*67e74705SXin Li   llvm::Value *DSTr, *DSTi;
742*67e74705SXin Li   if (LHSr->getType()->isFloatingPointTy()) {
743*67e74705SXin Li     // If we have a complex operand on the RHS, we delegate to a libcall to
744*67e74705SXin Li     // handle all of the complexities and minimize underflow/overflow cases.
745*67e74705SXin Li     //
746*67e74705SXin Li     // FIXME: We would be able to avoid the libcall in many places if we
747*67e74705SXin Li     // supported imaginary types in addition to complex types.
748*67e74705SXin Li     if (RHSi) {
749*67e74705SXin Li       BinOpInfo LibCallOp = Op;
750*67e74705SXin Li       // If LHS was a real, supply a null imaginary part.
751*67e74705SXin Li       if (!LHSi)
752*67e74705SXin Li         LibCallOp.LHS.second = llvm::Constant::getNullValue(LHSr->getType());
753*67e74705SXin Li 
754*67e74705SXin Li       StringRef LibCallName;
755*67e74705SXin Li       switch (LHSr->getType()->getTypeID()) {
756*67e74705SXin Li       default:
757*67e74705SXin Li         llvm_unreachable("Unsupported floating point type!");
758*67e74705SXin Li       case llvm::Type::HalfTyID:
759*67e74705SXin Li         return EmitComplexBinOpLibCall("__divhc3", LibCallOp);
760*67e74705SXin Li       case llvm::Type::FloatTyID:
761*67e74705SXin Li         return EmitComplexBinOpLibCall("__divsc3", LibCallOp);
762*67e74705SXin Li       case llvm::Type::DoubleTyID:
763*67e74705SXin Li         return EmitComplexBinOpLibCall("__divdc3", LibCallOp);
764*67e74705SXin Li       case llvm::Type::PPC_FP128TyID:
765*67e74705SXin Li         return EmitComplexBinOpLibCall("__divtc3", LibCallOp);
766*67e74705SXin Li       case llvm::Type::X86_FP80TyID:
767*67e74705SXin Li         return EmitComplexBinOpLibCall("__divxc3", LibCallOp);
768*67e74705SXin Li       case llvm::Type::FP128TyID:
769*67e74705SXin Li         return EmitComplexBinOpLibCall("__divtc3", LibCallOp);
770*67e74705SXin Li       }
771*67e74705SXin Li     }
772*67e74705SXin Li     assert(LHSi && "Can have at most one non-complex operand!");
773*67e74705SXin Li 
774*67e74705SXin Li     DSTr = Builder.CreateFDiv(LHSr, RHSr);
775*67e74705SXin Li     DSTi = Builder.CreateFDiv(LHSi, RHSr);
776*67e74705SXin Li   } else {
777*67e74705SXin Li     assert(Op.LHS.second && Op.RHS.second &&
778*67e74705SXin Li            "Both operands of integer complex operators must be complex!");
779*67e74705SXin Li     // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
780*67e74705SXin Li     llvm::Value *Tmp1 = Builder.CreateMul(LHSr, RHSr); // a*c
781*67e74705SXin Li     llvm::Value *Tmp2 = Builder.CreateMul(LHSi, RHSi); // b*d
782*67e74705SXin Li     llvm::Value *Tmp3 = Builder.CreateAdd(Tmp1, Tmp2); // ac+bd
783*67e74705SXin Li 
784*67e74705SXin Li     llvm::Value *Tmp4 = Builder.CreateMul(RHSr, RHSr); // c*c
785*67e74705SXin Li     llvm::Value *Tmp5 = Builder.CreateMul(RHSi, RHSi); // d*d
786*67e74705SXin Li     llvm::Value *Tmp6 = Builder.CreateAdd(Tmp4, Tmp5); // cc+dd
787*67e74705SXin Li 
788*67e74705SXin Li     llvm::Value *Tmp7 = Builder.CreateMul(LHSi, RHSr); // b*c
789*67e74705SXin Li     llvm::Value *Tmp8 = Builder.CreateMul(LHSr, RHSi); // a*d
790*67e74705SXin Li     llvm::Value *Tmp9 = Builder.CreateSub(Tmp7, Tmp8); // bc-ad
791*67e74705SXin Li 
792*67e74705SXin Li     if (Op.Ty->castAs<ComplexType>()->getElementType()->isUnsignedIntegerType()) {
793*67e74705SXin Li       DSTr = Builder.CreateUDiv(Tmp3, Tmp6);
794*67e74705SXin Li       DSTi = Builder.CreateUDiv(Tmp9, Tmp6);
795*67e74705SXin Li     } else {
796*67e74705SXin Li       DSTr = Builder.CreateSDiv(Tmp3, Tmp6);
797*67e74705SXin Li       DSTi = Builder.CreateSDiv(Tmp9, Tmp6);
798*67e74705SXin Li     }
799*67e74705SXin Li   }
800*67e74705SXin Li 
801*67e74705SXin Li   return ComplexPairTy(DSTr, DSTi);
802*67e74705SXin Li }
803*67e74705SXin Li 
804*67e74705SXin Li ComplexExprEmitter::BinOpInfo
EmitBinOps(const BinaryOperator * E)805*67e74705SXin Li ComplexExprEmitter::EmitBinOps(const BinaryOperator *E) {
806*67e74705SXin Li   TestAndClearIgnoreReal();
807*67e74705SXin Li   TestAndClearIgnoreImag();
808*67e74705SXin Li   BinOpInfo Ops;
809*67e74705SXin Li   if (E->getLHS()->getType()->isRealFloatingType())
810*67e74705SXin Li     Ops.LHS = ComplexPairTy(CGF.EmitScalarExpr(E->getLHS()), nullptr);
811*67e74705SXin Li   else
812*67e74705SXin Li     Ops.LHS = Visit(E->getLHS());
813*67e74705SXin Li   if (E->getRHS()->getType()->isRealFloatingType())
814*67e74705SXin Li     Ops.RHS = ComplexPairTy(CGF.EmitScalarExpr(E->getRHS()), nullptr);
815*67e74705SXin Li   else
816*67e74705SXin Li     Ops.RHS = Visit(E->getRHS());
817*67e74705SXin Li 
818*67e74705SXin Li   Ops.Ty = E->getType();
819*67e74705SXin Li   return Ops;
820*67e74705SXin Li }
821*67e74705SXin Li 
822*67e74705SXin Li 
823*67e74705SXin Li LValue ComplexExprEmitter::
EmitCompoundAssignLValue(const CompoundAssignOperator * E,ComplexPairTy (ComplexExprEmitter::* Func)(const BinOpInfo &),RValue & Val)824*67e74705SXin Li EmitCompoundAssignLValue(const CompoundAssignOperator *E,
825*67e74705SXin Li           ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&),
826*67e74705SXin Li                          RValue &Val) {
827*67e74705SXin Li   TestAndClearIgnoreReal();
828*67e74705SXin Li   TestAndClearIgnoreImag();
829*67e74705SXin Li   QualType LHSTy = E->getLHS()->getType();
830*67e74705SXin Li   if (const AtomicType *AT = LHSTy->getAs<AtomicType>())
831*67e74705SXin Li     LHSTy = AT->getValueType();
832*67e74705SXin Li 
833*67e74705SXin Li   BinOpInfo OpInfo;
834*67e74705SXin Li 
835*67e74705SXin Li   // Load the RHS and LHS operands.
836*67e74705SXin Li   // __block variables need to have the rhs evaluated first, plus this should
837*67e74705SXin Li   // improve codegen a little.
838*67e74705SXin Li   OpInfo.Ty = E->getComputationResultType();
839*67e74705SXin Li   QualType ComplexElementTy = cast<ComplexType>(OpInfo.Ty)->getElementType();
840*67e74705SXin Li 
841*67e74705SXin Li   // The RHS should have been converted to the computation type.
842*67e74705SXin Li   if (E->getRHS()->getType()->isRealFloatingType()) {
843*67e74705SXin Li     assert(
844*67e74705SXin Li         CGF.getContext()
845*67e74705SXin Li             .hasSameUnqualifiedType(ComplexElementTy, E->getRHS()->getType()));
846*67e74705SXin Li     OpInfo.RHS = ComplexPairTy(CGF.EmitScalarExpr(E->getRHS()), nullptr);
847*67e74705SXin Li   } else {
848*67e74705SXin Li     assert(CGF.getContext()
849*67e74705SXin Li                .hasSameUnqualifiedType(OpInfo.Ty, E->getRHS()->getType()));
850*67e74705SXin Li     OpInfo.RHS = Visit(E->getRHS());
851*67e74705SXin Li   }
852*67e74705SXin Li 
853*67e74705SXin Li   LValue LHS = CGF.EmitLValue(E->getLHS());
854*67e74705SXin Li 
855*67e74705SXin Li   // Load from the l-value and convert it.
856*67e74705SXin Li   SourceLocation Loc = E->getExprLoc();
857*67e74705SXin Li   if (LHSTy->isAnyComplexType()) {
858*67e74705SXin Li     ComplexPairTy LHSVal = EmitLoadOfLValue(LHS, Loc);
859*67e74705SXin Li     OpInfo.LHS = EmitComplexToComplexCast(LHSVal, LHSTy, OpInfo.Ty, Loc);
860*67e74705SXin Li   } else {
861*67e74705SXin Li     llvm::Value *LHSVal = CGF.EmitLoadOfScalar(LHS, Loc);
862*67e74705SXin Li     // For floating point real operands we can directly pass the scalar form
863*67e74705SXin Li     // to the binary operator emission and potentially get more efficient code.
864*67e74705SXin Li     if (LHSTy->isRealFloatingType()) {
865*67e74705SXin Li       if (!CGF.getContext().hasSameUnqualifiedType(ComplexElementTy, LHSTy))
866*67e74705SXin Li         LHSVal = CGF.EmitScalarConversion(LHSVal, LHSTy, ComplexElementTy, Loc);
867*67e74705SXin Li       OpInfo.LHS = ComplexPairTy(LHSVal, nullptr);
868*67e74705SXin Li     } else {
869*67e74705SXin Li       OpInfo.LHS = EmitScalarToComplexCast(LHSVal, LHSTy, OpInfo.Ty, Loc);
870*67e74705SXin Li     }
871*67e74705SXin Li   }
872*67e74705SXin Li 
873*67e74705SXin Li   // Expand the binary operator.
874*67e74705SXin Li   ComplexPairTy Result = (this->*Func)(OpInfo);
875*67e74705SXin Li 
876*67e74705SXin Li   // Truncate the result and store it into the LHS lvalue.
877*67e74705SXin Li   if (LHSTy->isAnyComplexType()) {
878*67e74705SXin Li     ComplexPairTy ResVal =
879*67e74705SXin Li         EmitComplexToComplexCast(Result, OpInfo.Ty, LHSTy, Loc);
880*67e74705SXin Li     EmitStoreOfComplex(ResVal, LHS, /*isInit*/ false);
881*67e74705SXin Li     Val = RValue::getComplex(ResVal);
882*67e74705SXin Li   } else {
883*67e74705SXin Li     llvm::Value *ResVal =
884*67e74705SXin Li         CGF.EmitComplexToScalarConversion(Result, OpInfo.Ty, LHSTy, Loc);
885*67e74705SXin Li     CGF.EmitStoreOfScalar(ResVal, LHS, /*isInit*/ false);
886*67e74705SXin Li     Val = RValue::get(ResVal);
887*67e74705SXin Li   }
888*67e74705SXin Li 
889*67e74705SXin Li   return LHS;
890*67e74705SXin Li }
891*67e74705SXin Li 
892*67e74705SXin Li // Compound assignments.
893*67e74705SXin Li ComplexPairTy ComplexExprEmitter::
EmitCompoundAssign(const CompoundAssignOperator * E,ComplexPairTy (ComplexExprEmitter::* Func)(const BinOpInfo &))894*67e74705SXin Li EmitCompoundAssign(const CompoundAssignOperator *E,
895*67e74705SXin Li                    ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&)){
896*67e74705SXin Li   RValue Val;
897*67e74705SXin Li   LValue LV = EmitCompoundAssignLValue(E, Func, Val);
898*67e74705SXin Li 
899*67e74705SXin Li   // The result of an assignment in C is the assigned r-value.
900*67e74705SXin Li   if (!CGF.getLangOpts().CPlusPlus)
901*67e74705SXin Li     return Val.getComplexVal();
902*67e74705SXin Li 
903*67e74705SXin Li   // If the lvalue is non-volatile, return the computed value of the assignment.
904*67e74705SXin Li   if (!LV.isVolatileQualified())
905*67e74705SXin Li     return Val.getComplexVal();
906*67e74705SXin Li 
907*67e74705SXin Li   return EmitLoadOfLValue(LV, E->getExprLoc());
908*67e74705SXin Li }
909*67e74705SXin Li 
EmitBinAssignLValue(const BinaryOperator * E,ComplexPairTy & Val)910*67e74705SXin Li LValue ComplexExprEmitter::EmitBinAssignLValue(const BinaryOperator *E,
911*67e74705SXin Li                                                ComplexPairTy &Val) {
912*67e74705SXin Li   assert(CGF.getContext().hasSameUnqualifiedType(E->getLHS()->getType(),
913*67e74705SXin Li                                                  E->getRHS()->getType()) &&
914*67e74705SXin Li          "Invalid assignment");
915*67e74705SXin Li   TestAndClearIgnoreReal();
916*67e74705SXin Li   TestAndClearIgnoreImag();
917*67e74705SXin Li 
918*67e74705SXin Li   // Emit the RHS.  __block variables need the RHS evaluated first.
919*67e74705SXin Li   Val = Visit(E->getRHS());
920*67e74705SXin Li 
921*67e74705SXin Li   // Compute the address to store into.
922*67e74705SXin Li   LValue LHS = CGF.EmitLValue(E->getLHS());
923*67e74705SXin Li 
924*67e74705SXin Li   // Store the result value into the LHS lvalue.
925*67e74705SXin Li   EmitStoreOfComplex(Val, LHS, /*isInit*/ false);
926*67e74705SXin Li 
927*67e74705SXin Li   return LHS;
928*67e74705SXin Li }
929*67e74705SXin Li 
VisitBinAssign(const BinaryOperator * E)930*67e74705SXin Li ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) {
931*67e74705SXin Li   ComplexPairTy Val;
932*67e74705SXin Li   LValue LV = EmitBinAssignLValue(E, Val);
933*67e74705SXin Li 
934*67e74705SXin Li   // The result of an assignment in C is the assigned r-value.
935*67e74705SXin Li   if (!CGF.getLangOpts().CPlusPlus)
936*67e74705SXin Li     return Val;
937*67e74705SXin Li 
938*67e74705SXin Li   // If the lvalue is non-volatile, return the computed value of the assignment.
939*67e74705SXin Li   if (!LV.isVolatileQualified())
940*67e74705SXin Li     return Val;
941*67e74705SXin Li 
942*67e74705SXin Li   return EmitLoadOfLValue(LV, E->getExprLoc());
943*67e74705SXin Li }
944*67e74705SXin Li 
VisitBinComma(const BinaryOperator * E)945*67e74705SXin Li ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) {
946*67e74705SXin Li   CGF.EmitIgnoredExpr(E->getLHS());
947*67e74705SXin Li   return Visit(E->getRHS());
948*67e74705SXin Li }
949*67e74705SXin Li 
950*67e74705SXin Li ComplexPairTy ComplexExprEmitter::
VisitAbstractConditionalOperator(const AbstractConditionalOperator * E)951*67e74705SXin Li VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
952*67e74705SXin Li   TestAndClearIgnoreReal();
953*67e74705SXin Li   TestAndClearIgnoreImag();
954*67e74705SXin Li   llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true");
955*67e74705SXin Li   llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false");
956*67e74705SXin Li   llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
957*67e74705SXin Li 
958*67e74705SXin Li   // Bind the common expression if necessary.
959*67e74705SXin Li   CodeGenFunction::OpaqueValueMapping binding(CGF, E);
960*67e74705SXin Li 
961*67e74705SXin Li 
962*67e74705SXin Li   CodeGenFunction::ConditionalEvaluation eval(CGF);
963*67e74705SXin Li   CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock,
964*67e74705SXin Li                            CGF.getProfileCount(E));
965*67e74705SXin Li 
966*67e74705SXin Li   eval.begin(CGF);
967*67e74705SXin Li   CGF.EmitBlock(LHSBlock);
968*67e74705SXin Li   CGF.incrementProfileCounter(E);
969*67e74705SXin Li   ComplexPairTy LHS = Visit(E->getTrueExpr());
970*67e74705SXin Li   LHSBlock = Builder.GetInsertBlock();
971*67e74705SXin Li   CGF.EmitBranch(ContBlock);
972*67e74705SXin Li   eval.end(CGF);
973*67e74705SXin Li 
974*67e74705SXin Li   eval.begin(CGF);
975*67e74705SXin Li   CGF.EmitBlock(RHSBlock);
976*67e74705SXin Li   ComplexPairTy RHS = Visit(E->getFalseExpr());
977*67e74705SXin Li   RHSBlock = Builder.GetInsertBlock();
978*67e74705SXin Li   CGF.EmitBlock(ContBlock);
979*67e74705SXin Li   eval.end(CGF);
980*67e74705SXin Li 
981*67e74705SXin Li   // Create a PHI node for the real part.
982*67e74705SXin Li   llvm::PHINode *RealPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.r");
983*67e74705SXin Li   RealPN->addIncoming(LHS.first, LHSBlock);
984*67e74705SXin Li   RealPN->addIncoming(RHS.first, RHSBlock);
985*67e74705SXin Li 
986*67e74705SXin Li   // Create a PHI node for the imaginary part.
987*67e74705SXin Li   llvm::PHINode *ImagPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.i");
988*67e74705SXin Li   ImagPN->addIncoming(LHS.second, LHSBlock);
989*67e74705SXin Li   ImagPN->addIncoming(RHS.second, RHSBlock);
990*67e74705SXin Li 
991*67e74705SXin Li   return ComplexPairTy(RealPN, ImagPN);
992*67e74705SXin Li }
993*67e74705SXin Li 
VisitChooseExpr(ChooseExpr * E)994*67e74705SXin Li ComplexPairTy ComplexExprEmitter::VisitChooseExpr(ChooseExpr *E) {
995*67e74705SXin Li   return Visit(E->getChosenSubExpr());
996*67e74705SXin Li }
997*67e74705SXin Li 
VisitInitListExpr(InitListExpr * E)998*67e74705SXin Li ComplexPairTy ComplexExprEmitter::VisitInitListExpr(InitListExpr *E) {
999*67e74705SXin Li     bool Ignore = TestAndClearIgnoreReal();
1000*67e74705SXin Li     (void)Ignore;
1001*67e74705SXin Li     assert (Ignore == false && "init list ignored");
1002*67e74705SXin Li     Ignore = TestAndClearIgnoreImag();
1003*67e74705SXin Li     (void)Ignore;
1004*67e74705SXin Li     assert (Ignore == false && "init list ignored");
1005*67e74705SXin Li 
1006*67e74705SXin Li   if (E->getNumInits() == 2) {
1007*67e74705SXin Li     llvm::Value *Real = CGF.EmitScalarExpr(E->getInit(0));
1008*67e74705SXin Li     llvm::Value *Imag = CGF.EmitScalarExpr(E->getInit(1));
1009*67e74705SXin Li     return ComplexPairTy(Real, Imag);
1010*67e74705SXin Li   } else if (E->getNumInits() == 1) {
1011*67e74705SXin Li     return Visit(E->getInit(0));
1012*67e74705SXin Li   }
1013*67e74705SXin Li 
1014*67e74705SXin Li   // Empty init list intializes to null
1015*67e74705SXin Li   assert(E->getNumInits() == 0 && "Unexpected number of inits");
1016*67e74705SXin Li   QualType Ty = E->getType()->castAs<ComplexType>()->getElementType();
1017*67e74705SXin Li   llvm::Type* LTy = CGF.ConvertType(Ty);
1018*67e74705SXin Li   llvm::Value* zeroConstant = llvm::Constant::getNullValue(LTy);
1019*67e74705SXin Li   return ComplexPairTy(zeroConstant, zeroConstant);
1020*67e74705SXin Li }
1021*67e74705SXin Li 
VisitVAArgExpr(VAArgExpr * E)1022*67e74705SXin Li ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) {
1023*67e74705SXin Li   Address ArgValue = Address::invalid();
1024*67e74705SXin Li   Address ArgPtr = CGF.EmitVAArg(E, ArgValue);
1025*67e74705SXin Li 
1026*67e74705SXin Li   if (!ArgPtr.isValid()) {
1027*67e74705SXin Li     CGF.ErrorUnsupported(E, "complex va_arg expression");
1028*67e74705SXin Li     llvm::Type *EltTy =
1029*67e74705SXin Li       CGF.ConvertType(E->getType()->castAs<ComplexType>()->getElementType());
1030*67e74705SXin Li     llvm::Value *U = llvm::UndefValue::get(EltTy);
1031*67e74705SXin Li     return ComplexPairTy(U, U);
1032*67e74705SXin Li   }
1033*67e74705SXin Li 
1034*67e74705SXin Li   return EmitLoadOfLValue(CGF.MakeAddrLValue(ArgPtr, E->getType()),
1035*67e74705SXin Li                           E->getExprLoc());
1036*67e74705SXin Li }
1037*67e74705SXin Li 
1038*67e74705SXin Li //===----------------------------------------------------------------------===//
1039*67e74705SXin Li //                         Entry Point into this File
1040*67e74705SXin Li //===----------------------------------------------------------------------===//
1041*67e74705SXin Li 
1042*67e74705SXin Li /// EmitComplexExpr - Emit the computation of the specified expression of
1043*67e74705SXin Li /// complex type, ignoring the result.
EmitComplexExpr(const Expr * E,bool IgnoreReal,bool IgnoreImag)1044*67e74705SXin Li ComplexPairTy CodeGenFunction::EmitComplexExpr(const Expr *E, bool IgnoreReal,
1045*67e74705SXin Li                                                bool IgnoreImag) {
1046*67e74705SXin Li   assert(E && getComplexType(E->getType()) &&
1047*67e74705SXin Li          "Invalid complex expression to emit");
1048*67e74705SXin Li 
1049*67e74705SXin Li   return ComplexExprEmitter(*this, IgnoreReal, IgnoreImag)
1050*67e74705SXin Li       .Visit(const_cast<Expr *>(E));
1051*67e74705SXin Li }
1052*67e74705SXin Li 
EmitComplexExprIntoLValue(const Expr * E,LValue dest,bool isInit)1053*67e74705SXin Li void CodeGenFunction::EmitComplexExprIntoLValue(const Expr *E, LValue dest,
1054*67e74705SXin Li                                                 bool isInit) {
1055*67e74705SXin Li   assert(E && getComplexType(E->getType()) &&
1056*67e74705SXin Li          "Invalid complex expression to emit");
1057*67e74705SXin Li   ComplexExprEmitter Emitter(*this);
1058*67e74705SXin Li   ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E));
1059*67e74705SXin Li   Emitter.EmitStoreOfComplex(Val, dest, isInit);
1060*67e74705SXin Li }
1061*67e74705SXin Li 
1062*67e74705SXin Li /// EmitStoreOfComplex - Store a complex number into the specified l-value.
EmitStoreOfComplex(ComplexPairTy V,LValue dest,bool isInit)1063*67e74705SXin Li void CodeGenFunction::EmitStoreOfComplex(ComplexPairTy V, LValue dest,
1064*67e74705SXin Li                                          bool isInit) {
1065*67e74705SXin Li   ComplexExprEmitter(*this).EmitStoreOfComplex(V, dest, isInit);
1066*67e74705SXin Li }
1067*67e74705SXin Li 
1068*67e74705SXin Li /// EmitLoadOfComplex - Load a complex number from the specified address.
EmitLoadOfComplex(LValue src,SourceLocation loc)1069*67e74705SXin Li ComplexPairTy CodeGenFunction::EmitLoadOfComplex(LValue src,
1070*67e74705SXin Li                                                  SourceLocation loc) {
1071*67e74705SXin Li   return ComplexExprEmitter(*this).EmitLoadOfLValue(src, loc);
1072*67e74705SXin Li }
1073*67e74705SXin Li 
EmitComplexAssignmentLValue(const BinaryOperator * E)1074*67e74705SXin Li LValue CodeGenFunction::EmitComplexAssignmentLValue(const BinaryOperator *E) {
1075*67e74705SXin Li   assert(E->getOpcode() == BO_Assign);
1076*67e74705SXin Li   ComplexPairTy Val; // ignored
1077*67e74705SXin Li   return ComplexExprEmitter(*this).EmitBinAssignLValue(E, Val);
1078*67e74705SXin Li }
1079*67e74705SXin Li 
1080*67e74705SXin Li typedef ComplexPairTy (ComplexExprEmitter::*CompoundFunc)(
1081*67e74705SXin Li     const ComplexExprEmitter::BinOpInfo &);
1082*67e74705SXin Li 
getComplexOp(BinaryOperatorKind Op)1083*67e74705SXin Li static CompoundFunc getComplexOp(BinaryOperatorKind Op) {
1084*67e74705SXin Li   switch (Op) {
1085*67e74705SXin Li   case BO_MulAssign: return &ComplexExprEmitter::EmitBinMul;
1086*67e74705SXin Li   case BO_DivAssign: return &ComplexExprEmitter::EmitBinDiv;
1087*67e74705SXin Li   case BO_SubAssign: return &ComplexExprEmitter::EmitBinSub;
1088*67e74705SXin Li   case BO_AddAssign: return &ComplexExprEmitter::EmitBinAdd;
1089*67e74705SXin Li   default:
1090*67e74705SXin Li     llvm_unreachable("unexpected complex compound assignment");
1091*67e74705SXin Li   }
1092*67e74705SXin Li }
1093*67e74705SXin Li 
1094*67e74705SXin Li LValue CodeGenFunction::
EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator * E)1095*67e74705SXin Li EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator *E) {
1096*67e74705SXin Li   CompoundFunc Op = getComplexOp(E->getOpcode());
1097*67e74705SXin Li   RValue Val;
1098*67e74705SXin Li   return ComplexExprEmitter(*this).EmitCompoundAssignLValue(E, Op, Val);
1099*67e74705SXin Li }
1100*67e74705SXin Li 
1101*67e74705SXin Li LValue CodeGenFunction::
EmitScalarCompoundAssignWithComplex(const CompoundAssignOperator * E,llvm::Value * & Result)1102*67e74705SXin Li EmitScalarCompoundAssignWithComplex(const CompoundAssignOperator *E,
1103*67e74705SXin Li                                     llvm::Value *&Result) {
1104*67e74705SXin Li   CompoundFunc Op = getComplexOp(E->getOpcode());
1105*67e74705SXin Li   RValue Val;
1106*67e74705SXin Li   LValue Ret = ComplexExprEmitter(*this).EmitCompoundAssignLValue(E, Op, Val);
1107*67e74705SXin Li   Result = Val.getScalarVal();
1108*67e74705SXin Li   return Ret;
1109*67e74705SXin Li }
1110