xref: /freebsd-src/contrib/llvm-project/clang/lib/CodeGen/CGExprComplex.cpp (revision 1db9f3b21e39176dd5b67cf8ac378633b172463e)
1 //===--- CGExprComplex.cpp - Emit LLVM Code for Complex Exprs -------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This contains code to emit Expr nodes with complex types as LLVM code.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "CGOpenMPRuntime.h"
14 #include "CodeGenFunction.h"
15 #include "CodeGenModule.h"
16 #include "ConstantEmitter.h"
17 #include "clang/AST/StmtVisitor.h"
18 #include "llvm/ADT/STLExtras.h"
19 #include "llvm/IR/Constants.h"
20 #include "llvm/IR/Instructions.h"
21 #include "llvm/IR/MDBuilder.h"
22 #include "llvm/IR/Metadata.h"
23 #include <algorithm>
24 using namespace clang;
25 using namespace CodeGen;
26 
27 //===----------------------------------------------------------------------===//
28 //                        Complex Expression Emitter
29 //===----------------------------------------------------------------------===//
30 
31 typedef CodeGenFunction::ComplexPairTy ComplexPairTy;
32 
33 /// Return the complex type that we are meant to emit.
34 static const ComplexType *getComplexType(QualType type) {
35   type = type.getCanonicalType();
36   if (const ComplexType *comp = dyn_cast<ComplexType>(type)) {
37     return comp;
38   } else {
39     return cast<ComplexType>(cast<AtomicType>(type)->getValueType());
40   }
41 }
42 
43 namespace  {
44 class ComplexExprEmitter
45   : public StmtVisitor<ComplexExprEmitter, ComplexPairTy> {
46   CodeGenFunction &CGF;
47   CGBuilderTy &Builder;
48   bool IgnoreReal;
49   bool IgnoreImag;
50 public:
51   ComplexExprEmitter(CodeGenFunction &cgf, bool ir=false, bool ii=false)
52     : CGF(cgf), Builder(CGF.Builder), IgnoreReal(ir), IgnoreImag(ii) {
53   }
54 
55 
56   //===--------------------------------------------------------------------===//
57   //                               Utilities
58   //===--------------------------------------------------------------------===//
59 
60   bool TestAndClearIgnoreReal() {
61     bool I = IgnoreReal;
62     IgnoreReal = false;
63     return I;
64   }
65   bool TestAndClearIgnoreImag() {
66     bool I = IgnoreImag;
67     IgnoreImag = false;
68     return I;
69   }
70 
71   /// EmitLoadOfLValue - Given an expression with complex type that represents a
72   /// value l-value, this method emits the address of the l-value, then loads
73   /// and returns the result.
74   ComplexPairTy EmitLoadOfLValue(const Expr *E) {
75     return EmitLoadOfLValue(CGF.EmitLValue(E), E->getExprLoc());
76   }
77 
78   ComplexPairTy EmitLoadOfLValue(LValue LV, SourceLocation Loc);
79 
80   /// EmitStoreOfComplex - Store the specified real/imag parts into the
81   /// specified value pointer.
82   void EmitStoreOfComplex(ComplexPairTy Val, LValue LV, bool isInit);
83 
84   /// Emit a cast from complex value Val to DestType.
85   ComplexPairTy EmitComplexToComplexCast(ComplexPairTy Val, QualType SrcType,
86                                          QualType DestType, SourceLocation Loc);
87   /// Emit a cast from scalar value Val to DestType.
88   ComplexPairTy EmitScalarToComplexCast(llvm::Value *Val, QualType SrcType,
89                                         QualType DestType, SourceLocation Loc);
90 
91   //===--------------------------------------------------------------------===//
92   //                            Visitor Methods
93   //===--------------------------------------------------------------------===//
94 
95   ComplexPairTy Visit(Expr *E) {
96     ApplyDebugLocation DL(CGF, E);
97     return StmtVisitor<ComplexExprEmitter, ComplexPairTy>::Visit(E);
98   }
99 
100   ComplexPairTy VisitStmt(Stmt *S) {
101     S->dump(llvm::errs(), CGF.getContext());
102     llvm_unreachable("Stmt can't have complex result type!");
103   }
104   ComplexPairTy VisitExpr(Expr *S);
105   ComplexPairTy VisitConstantExpr(ConstantExpr *E) {
106     if (llvm::Constant *Result = ConstantEmitter(CGF).tryEmitConstantExpr(E))
107       return ComplexPairTy(Result->getAggregateElement(0U),
108                            Result->getAggregateElement(1U));
109     return Visit(E->getSubExpr());
110   }
111   ComplexPairTy VisitParenExpr(ParenExpr *PE) { return Visit(PE->getSubExpr());}
112   ComplexPairTy VisitGenericSelectionExpr(GenericSelectionExpr *GE) {
113     return Visit(GE->getResultExpr());
114   }
115   ComplexPairTy VisitImaginaryLiteral(const ImaginaryLiteral *IL);
116   ComplexPairTy
117   VisitSubstNonTypeTemplateParmExpr(SubstNonTypeTemplateParmExpr *PE) {
118     return Visit(PE->getReplacement());
119   }
120   ComplexPairTy VisitCoawaitExpr(CoawaitExpr *S) {
121     return CGF.EmitCoawaitExpr(*S).getComplexVal();
122   }
123   ComplexPairTy VisitCoyieldExpr(CoyieldExpr *S) {
124     return CGF.EmitCoyieldExpr(*S).getComplexVal();
125   }
126   ComplexPairTy VisitUnaryCoawait(const UnaryOperator *E) {
127     return Visit(E->getSubExpr());
128   }
129 
130   ComplexPairTy emitConstant(const CodeGenFunction::ConstantEmission &Constant,
131                              Expr *E) {
132     assert(Constant && "not a constant");
133     if (Constant.isReference())
134       return EmitLoadOfLValue(Constant.getReferenceLValue(CGF, E),
135                               E->getExprLoc());
136 
137     llvm::Constant *pair = Constant.getValue();
138     return ComplexPairTy(pair->getAggregateElement(0U),
139                          pair->getAggregateElement(1U));
140   }
141 
142   // l-values.
143   ComplexPairTy VisitDeclRefExpr(DeclRefExpr *E) {
144     if (CodeGenFunction::ConstantEmission Constant = CGF.tryEmitAsConstant(E))
145       return emitConstant(Constant, E);
146     return EmitLoadOfLValue(E);
147   }
148   ComplexPairTy VisitObjCIvarRefExpr(ObjCIvarRefExpr *E) {
149     return EmitLoadOfLValue(E);
150   }
151   ComplexPairTy VisitObjCMessageExpr(ObjCMessageExpr *E) {
152     return CGF.EmitObjCMessageExpr(E).getComplexVal();
153   }
154   ComplexPairTy VisitArraySubscriptExpr(Expr *E) { return EmitLoadOfLValue(E); }
155   ComplexPairTy VisitMemberExpr(MemberExpr *ME) {
156     if (CodeGenFunction::ConstantEmission Constant =
157             CGF.tryEmitAsConstant(ME)) {
158       CGF.EmitIgnoredExpr(ME->getBase());
159       return emitConstant(Constant, ME);
160     }
161     return EmitLoadOfLValue(ME);
162   }
163   ComplexPairTy VisitOpaqueValueExpr(OpaqueValueExpr *E) {
164     if (E->isGLValue())
165       return EmitLoadOfLValue(CGF.getOrCreateOpaqueLValueMapping(E),
166                               E->getExprLoc());
167     return CGF.getOrCreateOpaqueRValueMapping(E).getComplexVal();
168   }
169 
170   ComplexPairTy VisitPseudoObjectExpr(PseudoObjectExpr *E) {
171     return CGF.EmitPseudoObjectRValue(E).getComplexVal();
172   }
173 
174   // FIXME: CompoundLiteralExpr
175 
176   ComplexPairTy EmitCast(CastKind CK, Expr *Op, QualType DestTy);
177   ComplexPairTy VisitImplicitCastExpr(ImplicitCastExpr *E) {
178     // Unlike for scalars, we don't have to worry about function->ptr demotion
179     // here.
180     if (E->changesVolatileQualification())
181       return EmitLoadOfLValue(E);
182     return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType());
183   }
184   ComplexPairTy VisitCastExpr(CastExpr *E) {
185     if (const auto *ECE = dyn_cast<ExplicitCastExpr>(E))
186       CGF.CGM.EmitExplicitCastExprType(ECE, &CGF);
187     if (E->changesVolatileQualification())
188        return EmitLoadOfLValue(E);
189     return EmitCast(E->getCastKind(), E->getSubExpr(), E->getType());
190   }
191   ComplexPairTy VisitCallExpr(const CallExpr *E);
192   ComplexPairTy VisitStmtExpr(const StmtExpr *E);
193 
194   // Operators.
195   ComplexPairTy VisitPrePostIncDec(const UnaryOperator *E,
196                                    bool isInc, bool isPre) {
197     LValue LV = CGF.EmitLValue(E->getSubExpr());
198     return CGF.EmitComplexPrePostIncDec(E, LV, isInc, isPre);
199   }
200   ComplexPairTy VisitUnaryPostDec(const UnaryOperator *E) {
201     return VisitPrePostIncDec(E, false, false);
202   }
203   ComplexPairTy VisitUnaryPostInc(const UnaryOperator *E) {
204     return VisitPrePostIncDec(E, true, false);
205   }
206   ComplexPairTy VisitUnaryPreDec(const UnaryOperator *E) {
207     return VisitPrePostIncDec(E, false, true);
208   }
209   ComplexPairTy VisitUnaryPreInc(const UnaryOperator *E) {
210     return VisitPrePostIncDec(E, true, true);
211   }
212   ComplexPairTy VisitUnaryDeref(const Expr *E) { return EmitLoadOfLValue(E); }
213 
214   ComplexPairTy VisitUnaryPlus(const UnaryOperator *E,
215                                QualType PromotionType = QualType());
216   ComplexPairTy VisitPlus(const UnaryOperator *E, QualType PromotionType);
217   ComplexPairTy VisitUnaryMinus(const UnaryOperator *E,
218                                 QualType PromotionType = QualType());
219   ComplexPairTy VisitMinus(const UnaryOperator *E, QualType PromotionType);
220   ComplexPairTy VisitUnaryNot      (const UnaryOperator *E);
221   // LNot,Real,Imag never return complex.
222   ComplexPairTy VisitUnaryExtension(const UnaryOperator *E) {
223     return Visit(E->getSubExpr());
224   }
225   ComplexPairTy VisitCXXDefaultArgExpr(CXXDefaultArgExpr *DAE) {
226     CodeGenFunction::CXXDefaultArgExprScope Scope(CGF, DAE);
227     return Visit(DAE->getExpr());
228   }
229   ComplexPairTy VisitCXXDefaultInitExpr(CXXDefaultInitExpr *DIE) {
230     CodeGenFunction::CXXDefaultInitExprScope Scope(CGF, DIE);
231     return Visit(DIE->getExpr());
232   }
233   ComplexPairTy VisitExprWithCleanups(ExprWithCleanups *E) {
234     CodeGenFunction::RunCleanupsScope Scope(CGF);
235     ComplexPairTy Vals = Visit(E->getSubExpr());
236     // Defend against dominance problems caused by jumps out of expression
237     // evaluation through the shared cleanup block.
238     Scope.ForceCleanup({&Vals.first, &Vals.second});
239     return Vals;
240   }
241   ComplexPairTy VisitCXXScalarValueInitExpr(CXXScalarValueInitExpr *E) {
242     assert(E->getType()->isAnyComplexType() && "Expected complex type!");
243     QualType Elem = E->getType()->castAs<ComplexType>()->getElementType();
244     llvm::Constant *Null = llvm::Constant::getNullValue(CGF.ConvertType(Elem));
245     return ComplexPairTy(Null, Null);
246   }
247   ComplexPairTy VisitImplicitValueInitExpr(ImplicitValueInitExpr *E) {
248     assert(E->getType()->isAnyComplexType() && "Expected complex type!");
249     QualType Elem = E->getType()->castAs<ComplexType>()->getElementType();
250     llvm::Constant *Null =
251                        llvm::Constant::getNullValue(CGF.ConvertType(Elem));
252     return ComplexPairTy(Null, Null);
253   }
254 
255   struct BinOpInfo {
256     ComplexPairTy LHS;
257     ComplexPairTy RHS;
258     QualType Ty;  // Computation Type.
259     FPOptions FPFeatures;
260   };
261 
262   BinOpInfo EmitBinOps(const BinaryOperator *E,
263                        QualType PromotionTy = QualType());
264   ComplexPairTy EmitPromoted(const Expr *E, QualType PromotionTy);
265   ComplexPairTy EmitPromotedComplexOperand(const Expr *E, QualType PromotionTy);
266   LValue EmitCompoundAssignLValue(const CompoundAssignOperator *E,
267                                   ComplexPairTy (ComplexExprEmitter::*Func)
268                                   (const BinOpInfo &),
269                                   RValue &Val);
270   ComplexPairTy EmitCompoundAssign(const CompoundAssignOperator *E,
271                                    ComplexPairTy (ComplexExprEmitter::*Func)
272                                    (const BinOpInfo &));
273 
274   ComplexPairTy EmitBinAdd(const BinOpInfo &Op);
275   ComplexPairTy EmitBinSub(const BinOpInfo &Op);
276   ComplexPairTy EmitBinMul(const BinOpInfo &Op);
277   ComplexPairTy EmitBinDiv(const BinOpInfo &Op);
278   ComplexPairTy EmitAlgebraicDiv(llvm::Value *A, llvm::Value *B, llvm::Value *C,
279                                  llvm::Value *D);
280   ComplexPairTy EmitRangeReductionDiv(llvm::Value *A, llvm::Value *B,
281                                       llvm::Value *C, llvm::Value *D);
282 
283   ComplexPairTy EmitComplexBinOpLibCall(StringRef LibCallName,
284                                         const BinOpInfo &Op);
285 
286   QualType getPromotionType(QualType Ty) {
287     if (auto *CT = Ty->getAs<ComplexType>()) {
288       QualType ElementType = CT->getElementType();
289       if (ElementType.UseExcessPrecision(CGF.getContext()))
290         return CGF.getContext().getComplexType(CGF.getContext().FloatTy);
291     }
292     if (Ty.UseExcessPrecision(CGF.getContext()))
293       return CGF.getContext().FloatTy;
294     return QualType();
295   }
296 
297 #define HANDLEBINOP(OP)                                                        \
298   ComplexPairTy VisitBin##OP(const BinaryOperator *E) {                        \
299     QualType promotionTy = getPromotionType(E->getType());                     \
300     ComplexPairTy result = EmitBin##OP(EmitBinOps(E, promotionTy));            \
301     if (!promotionTy.isNull())                                                 \
302       result =                                                                 \
303           CGF.EmitUnPromotedValue(result, E->getType());                       \
304     return result;                                                             \
305   }
306 
307   HANDLEBINOP(Mul)
308   HANDLEBINOP(Div)
309   HANDLEBINOP(Add)
310   HANDLEBINOP(Sub)
311 #undef HANDLEBINOP
312 
313   ComplexPairTy VisitCXXRewrittenBinaryOperator(CXXRewrittenBinaryOperator *E) {
314     return Visit(E->getSemanticForm());
315   }
316 
317   // Compound assignments.
318   ComplexPairTy VisitBinAddAssign(const CompoundAssignOperator *E) {
319     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinAdd);
320   }
321   ComplexPairTy VisitBinSubAssign(const CompoundAssignOperator *E) {
322     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinSub);
323   }
324   ComplexPairTy VisitBinMulAssign(const CompoundAssignOperator *E) {
325     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinMul);
326   }
327   ComplexPairTy VisitBinDivAssign(const CompoundAssignOperator *E) {
328     return EmitCompoundAssign(E, &ComplexExprEmitter::EmitBinDiv);
329   }
330 
331   // GCC rejects rem/and/or/xor for integer complex.
332   // Logical and/or always return int, never complex.
333 
334   // No comparisons produce a complex result.
335 
336   LValue EmitBinAssignLValue(const BinaryOperator *E,
337                              ComplexPairTy &Val);
338   ComplexPairTy VisitBinAssign     (const BinaryOperator *E);
339   ComplexPairTy VisitBinComma      (const BinaryOperator *E);
340 
341 
342   ComplexPairTy
343   VisitAbstractConditionalOperator(const AbstractConditionalOperator *CO);
344   ComplexPairTy VisitChooseExpr(ChooseExpr *CE);
345 
346   ComplexPairTy VisitInitListExpr(InitListExpr *E);
347 
348   ComplexPairTy VisitCompoundLiteralExpr(CompoundLiteralExpr *E) {
349     return EmitLoadOfLValue(E);
350   }
351 
352   ComplexPairTy VisitVAArgExpr(VAArgExpr *E);
353 
354   ComplexPairTy VisitAtomicExpr(AtomicExpr *E) {
355     return CGF.EmitAtomicExpr(E).getComplexVal();
356   }
357 };
358 }  // end anonymous namespace.
359 
360 //===----------------------------------------------------------------------===//
361 //                                Utilities
362 //===----------------------------------------------------------------------===//
363 
364 Address CodeGenFunction::emitAddrOfRealComponent(Address addr,
365                                                  QualType complexType) {
366   return Builder.CreateStructGEP(addr, 0, addr.getName() + ".realp");
367 }
368 
369 Address CodeGenFunction::emitAddrOfImagComponent(Address addr,
370                                                  QualType complexType) {
371   return Builder.CreateStructGEP(addr, 1, addr.getName() + ".imagp");
372 }
373 
374 /// EmitLoadOfLValue - Given an RValue reference for a complex, emit code to
375 /// load the real and imaginary pieces, returning them as Real/Imag.
376 ComplexPairTy ComplexExprEmitter::EmitLoadOfLValue(LValue lvalue,
377                                                    SourceLocation loc) {
378   assert(lvalue.isSimple() && "non-simple complex l-value?");
379   if (lvalue.getType()->isAtomicType())
380     return CGF.EmitAtomicLoad(lvalue, loc).getComplexVal();
381 
382   Address SrcPtr = lvalue.getAddress(CGF);
383   bool isVolatile = lvalue.isVolatileQualified();
384 
385   llvm::Value *Real = nullptr, *Imag = nullptr;
386 
387   if (!IgnoreReal || isVolatile) {
388     Address RealP = CGF.emitAddrOfRealComponent(SrcPtr, lvalue.getType());
389     Real = Builder.CreateLoad(RealP, isVolatile, SrcPtr.getName() + ".real");
390   }
391 
392   if (!IgnoreImag || isVolatile) {
393     Address ImagP = CGF.emitAddrOfImagComponent(SrcPtr, lvalue.getType());
394     Imag = Builder.CreateLoad(ImagP, isVolatile, SrcPtr.getName() + ".imag");
395   }
396 
397   return ComplexPairTy(Real, Imag);
398 }
399 
400 /// EmitStoreOfComplex - Store the specified real/imag parts into the
401 /// specified value pointer.
402 void ComplexExprEmitter::EmitStoreOfComplex(ComplexPairTy Val, LValue lvalue,
403                                             bool isInit) {
404   if (lvalue.getType()->isAtomicType() ||
405       (!isInit && CGF.LValueIsSuitableForInlineAtomic(lvalue)))
406     return CGF.EmitAtomicStore(RValue::getComplex(Val), lvalue, isInit);
407 
408   Address Ptr = lvalue.getAddress(CGF);
409   Address RealPtr = CGF.emitAddrOfRealComponent(Ptr, lvalue.getType());
410   Address ImagPtr = CGF.emitAddrOfImagComponent(Ptr, lvalue.getType());
411 
412   Builder.CreateStore(Val.first, RealPtr, lvalue.isVolatileQualified());
413   Builder.CreateStore(Val.second, ImagPtr, lvalue.isVolatileQualified());
414 }
415 
416 
417 
418 //===----------------------------------------------------------------------===//
419 //                            Visitor Methods
420 //===----------------------------------------------------------------------===//
421 
422 ComplexPairTy ComplexExprEmitter::VisitExpr(Expr *E) {
423   CGF.ErrorUnsupported(E, "complex expression");
424   llvm::Type *EltTy =
425     CGF.ConvertType(getComplexType(E->getType())->getElementType());
426   llvm::Value *U = llvm::UndefValue::get(EltTy);
427   return ComplexPairTy(U, U);
428 }
429 
430 ComplexPairTy ComplexExprEmitter::
431 VisitImaginaryLiteral(const ImaginaryLiteral *IL) {
432   llvm::Value *Imag = CGF.EmitScalarExpr(IL->getSubExpr());
433   return ComplexPairTy(llvm::Constant::getNullValue(Imag->getType()), Imag);
434 }
435 
436 
437 ComplexPairTy ComplexExprEmitter::VisitCallExpr(const CallExpr *E) {
438   if (E->getCallReturnType(CGF.getContext())->isReferenceType())
439     return EmitLoadOfLValue(E);
440 
441   return CGF.EmitCallExpr(E).getComplexVal();
442 }
443 
444 ComplexPairTy ComplexExprEmitter::VisitStmtExpr(const StmtExpr *E) {
445   CodeGenFunction::StmtExprEvaluation eval(CGF);
446   Address RetAlloca = CGF.EmitCompoundStmt(*E->getSubStmt(), true);
447   assert(RetAlloca.isValid() && "Expected complex return value");
448   return EmitLoadOfLValue(CGF.MakeAddrLValue(RetAlloca, E->getType()),
449                           E->getExprLoc());
450 }
451 
452 /// Emit a cast from complex value Val to DestType.
453 ComplexPairTy ComplexExprEmitter::EmitComplexToComplexCast(ComplexPairTy Val,
454                                                            QualType SrcType,
455                                                            QualType DestType,
456                                                            SourceLocation Loc) {
457   // Get the src/dest element type.
458   SrcType = SrcType->castAs<ComplexType>()->getElementType();
459   DestType = DestType->castAs<ComplexType>()->getElementType();
460 
461   // C99 6.3.1.6: When a value of complex type is converted to another
462   // complex type, both the real and imaginary parts follow the conversion
463   // rules for the corresponding real types.
464   if (Val.first)
465     Val.first = CGF.EmitScalarConversion(Val.first, SrcType, DestType, Loc);
466   if (Val.second)
467     Val.second = CGF.EmitScalarConversion(Val.second, SrcType, DestType, Loc);
468   return Val;
469 }
470 
471 ComplexPairTy ComplexExprEmitter::EmitScalarToComplexCast(llvm::Value *Val,
472                                                           QualType SrcType,
473                                                           QualType DestType,
474                                                           SourceLocation Loc) {
475   // Convert the input element to the element type of the complex.
476   DestType = DestType->castAs<ComplexType>()->getElementType();
477   Val = CGF.EmitScalarConversion(Val, SrcType, DestType, Loc);
478 
479   // Return (realval, 0).
480   return ComplexPairTy(Val, llvm::Constant::getNullValue(Val->getType()));
481 }
482 
483 ComplexPairTy ComplexExprEmitter::EmitCast(CastKind CK, Expr *Op,
484                                            QualType DestTy) {
485   switch (CK) {
486   case CK_Dependent: llvm_unreachable("dependent cast kind in IR gen!");
487 
488   // Atomic to non-atomic casts may be more than a no-op for some platforms and
489   // for some types.
490   case CK_AtomicToNonAtomic:
491   case CK_NonAtomicToAtomic:
492   case CK_NoOp:
493   case CK_LValueToRValue:
494   case CK_UserDefinedConversion:
495     return Visit(Op);
496 
497   case CK_LValueBitCast: {
498     LValue origLV = CGF.EmitLValue(Op);
499     Address V = origLV.getAddress(CGF).withElementType(CGF.ConvertType(DestTy));
500     return EmitLoadOfLValue(CGF.MakeAddrLValue(V, DestTy), Op->getExprLoc());
501   }
502 
503   case CK_LValueToRValueBitCast: {
504     LValue SourceLVal = CGF.EmitLValue(Op);
505     Address Addr = SourceLVal.getAddress(CGF).withElementType(
506         CGF.ConvertTypeForMem(DestTy));
507     LValue DestLV = CGF.MakeAddrLValue(Addr, DestTy);
508     DestLV.setTBAAInfo(TBAAAccessInfo::getMayAliasInfo());
509     return EmitLoadOfLValue(DestLV, Op->getExprLoc());
510   }
511 
512   case CK_BitCast:
513   case CK_BaseToDerived:
514   case CK_DerivedToBase:
515   case CK_UncheckedDerivedToBase:
516   case CK_Dynamic:
517   case CK_ToUnion:
518   case CK_ArrayToPointerDecay:
519   case CK_FunctionToPointerDecay:
520   case CK_NullToPointer:
521   case CK_NullToMemberPointer:
522   case CK_BaseToDerivedMemberPointer:
523   case CK_DerivedToBaseMemberPointer:
524   case CK_MemberPointerToBoolean:
525   case CK_ReinterpretMemberPointer:
526   case CK_ConstructorConversion:
527   case CK_IntegralToPointer:
528   case CK_PointerToIntegral:
529   case CK_PointerToBoolean:
530   case CK_ToVoid:
531   case CK_VectorSplat:
532   case CK_IntegralCast:
533   case CK_BooleanToSignedIntegral:
534   case CK_IntegralToBoolean:
535   case CK_IntegralToFloating:
536   case CK_FloatingToIntegral:
537   case CK_FloatingToBoolean:
538   case CK_FloatingCast:
539   case CK_CPointerToObjCPointerCast:
540   case CK_BlockPointerToObjCPointerCast:
541   case CK_AnyPointerToBlockPointerCast:
542   case CK_ObjCObjectLValueCast:
543   case CK_FloatingComplexToReal:
544   case CK_FloatingComplexToBoolean:
545   case CK_IntegralComplexToReal:
546   case CK_IntegralComplexToBoolean:
547   case CK_ARCProduceObject:
548   case CK_ARCConsumeObject:
549   case CK_ARCReclaimReturnedObject:
550   case CK_ARCExtendBlockObject:
551   case CK_CopyAndAutoreleaseBlockObject:
552   case CK_BuiltinFnToFnPtr:
553   case CK_ZeroToOCLOpaqueType:
554   case CK_AddressSpaceConversion:
555   case CK_IntToOCLSampler:
556   case CK_FloatingToFixedPoint:
557   case CK_FixedPointToFloating:
558   case CK_FixedPointCast:
559   case CK_FixedPointToBoolean:
560   case CK_FixedPointToIntegral:
561   case CK_IntegralToFixedPoint:
562   case CK_MatrixCast:
563     llvm_unreachable("invalid cast kind for complex value");
564 
565   case CK_FloatingRealToComplex:
566   case CK_IntegralRealToComplex: {
567     CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op);
568     return EmitScalarToComplexCast(CGF.EmitScalarExpr(Op), Op->getType(),
569                                    DestTy, Op->getExprLoc());
570   }
571 
572   case CK_FloatingComplexCast:
573   case CK_FloatingComplexToIntegralComplex:
574   case CK_IntegralComplexCast:
575   case CK_IntegralComplexToFloatingComplex: {
576     CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op);
577     return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy,
578                                     Op->getExprLoc());
579   }
580   }
581 
582   llvm_unreachable("unknown cast resulting in complex value");
583 }
584 
585 ComplexPairTy ComplexExprEmitter::VisitUnaryPlus(const UnaryOperator *E,
586                                                  QualType PromotionType) {
587   QualType promotionTy = PromotionType.isNull()
588                              ? getPromotionType(E->getSubExpr()->getType())
589                              : PromotionType;
590   ComplexPairTy result = VisitPlus(E, promotionTy);
591   if (!promotionTy.isNull())
592     return CGF.EmitUnPromotedValue(result, E->getSubExpr()->getType());
593   return result;
594 }
595 
596 ComplexPairTy ComplexExprEmitter::VisitPlus(const UnaryOperator *E,
597                                             QualType PromotionType) {
598   TestAndClearIgnoreReal();
599   TestAndClearIgnoreImag();
600   if (!PromotionType.isNull())
601     return CGF.EmitPromotedComplexExpr(E->getSubExpr(), PromotionType);
602   return Visit(E->getSubExpr());
603 }
604 
605 ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E,
606                                                   QualType PromotionType) {
607   QualType promotionTy = PromotionType.isNull()
608                              ? getPromotionType(E->getSubExpr()->getType())
609                              : PromotionType;
610   ComplexPairTy result = VisitMinus(E, promotionTy);
611   if (!promotionTy.isNull())
612     return CGF.EmitUnPromotedValue(result, E->getSubExpr()->getType());
613   return result;
614 }
615 ComplexPairTy ComplexExprEmitter::VisitMinus(const UnaryOperator *E,
616                                              QualType PromotionType) {
617   TestAndClearIgnoreReal();
618   TestAndClearIgnoreImag();
619   ComplexPairTy Op;
620   if (!PromotionType.isNull())
621     Op = CGF.EmitPromotedComplexExpr(E->getSubExpr(), PromotionType);
622   else
623     Op = Visit(E->getSubExpr());
624 
625   llvm::Value *ResR, *ResI;
626   if (Op.first->getType()->isFloatingPointTy()) {
627     ResR = Builder.CreateFNeg(Op.first,  "neg.r");
628     ResI = Builder.CreateFNeg(Op.second, "neg.i");
629   } else {
630     ResR = Builder.CreateNeg(Op.first,  "neg.r");
631     ResI = Builder.CreateNeg(Op.second, "neg.i");
632   }
633   return ComplexPairTy(ResR, ResI);
634 }
635 
636 ComplexPairTy ComplexExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
637   TestAndClearIgnoreReal();
638   TestAndClearIgnoreImag();
639   // ~(a+ib) = a + i*-b
640   ComplexPairTy Op = Visit(E->getSubExpr());
641   llvm::Value *ResI;
642   if (Op.second->getType()->isFloatingPointTy())
643     ResI = Builder.CreateFNeg(Op.second, "conj.i");
644   else
645     ResI = Builder.CreateNeg(Op.second, "conj.i");
646 
647   return ComplexPairTy(Op.first, ResI);
648 }
649 
650 ComplexPairTy ComplexExprEmitter::EmitBinAdd(const BinOpInfo &Op) {
651   llvm::Value *ResR, *ResI;
652 
653   if (Op.LHS.first->getType()->isFloatingPointTy()) {
654     CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op.FPFeatures);
655     ResR = Builder.CreateFAdd(Op.LHS.first,  Op.RHS.first,  "add.r");
656     if (Op.LHS.second && Op.RHS.second)
657       ResI = Builder.CreateFAdd(Op.LHS.second, Op.RHS.second, "add.i");
658     else
659       ResI = Op.LHS.second ? Op.LHS.second : Op.RHS.second;
660     assert(ResI && "Only one operand may be real!");
661   } else {
662     ResR = Builder.CreateAdd(Op.LHS.first,  Op.RHS.first,  "add.r");
663     assert(Op.LHS.second && Op.RHS.second &&
664            "Both operands of integer complex operators must be complex!");
665     ResI = Builder.CreateAdd(Op.LHS.second, Op.RHS.second, "add.i");
666   }
667   return ComplexPairTy(ResR, ResI);
668 }
669 
670 ComplexPairTy ComplexExprEmitter::EmitBinSub(const BinOpInfo &Op) {
671   llvm::Value *ResR, *ResI;
672   if (Op.LHS.first->getType()->isFloatingPointTy()) {
673     CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op.FPFeatures);
674     ResR = Builder.CreateFSub(Op.LHS.first, Op.RHS.first, "sub.r");
675     if (Op.LHS.second && Op.RHS.second)
676       ResI = Builder.CreateFSub(Op.LHS.second, Op.RHS.second, "sub.i");
677     else
678       ResI = Op.LHS.second ? Op.LHS.second
679                            : Builder.CreateFNeg(Op.RHS.second, "sub.i");
680     assert(ResI && "Only one operand may be real!");
681   } else {
682     ResR = Builder.CreateSub(Op.LHS.first, Op.RHS.first, "sub.r");
683     assert(Op.LHS.second && Op.RHS.second &&
684            "Both operands of integer complex operators must be complex!");
685     ResI = Builder.CreateSub(Op.LHS.second, Op.RHS.second, "sub.i");
686   }
687   return ComplexPairTy(ResR, ResI);
688 }
689 
690 /// Emit a libcall for a binary operation on complex types.
691 ComplexPairTy ComplexExprEmitter::EmitComplexBinOpLibCall(StringRef LibCallName,
692                                                           const BinOpInfo &Op) {
693   CallArgList Args;
694   Args.add(RValue::get(Op.LHS.first),
695            Op.Ty->castAs<ComplexType>()->getElementType());
696   Args.add(RValue::get(Op.LHS.second),
697            Op.Ty->castAs<ComplexType>()->getElementType());
698   Args.add(RValue::get(Op.RHS.first),
699            Op.Ty->castAs<ComplexType>()->getElementType());
700   Args.add(RValue::get(Op.RHS.second),
701            Op.Ty->castAs<ComplexType>()->getElementType());
702 
703   // We *must* use the full CG function call building logic here because the
704   // complex type has special ABI handling. We also should not forget about
705   // special calling convention which may be used for compiler builtins.
706 
707   // We create a function qualified type to state that this call does not have
708   // any exceptions.
709   FunctionProtoType::ExtProtoInfo EPI;
710   EPI = EPI.withExceptionSpec(
711       FunctionProtoType::ExceptionSpecInfo(EST_BasicNoexcept));
712   SmallVector<QualType, 4> ArgsQTys(
713       4, Op.Ty->castAs<ComplexType>()->getElementType());
714   QualType FQTy = CGF.getContext().getFunctionType(Op.Ty, ArgsQTys, EPI);
715   const CGFunctionInfo &FuncInfo = CGF.CGM.getTypes().arrangeFreeFunctionCall(
716       Args, cast<FunctionType>(FQTy.getTypePtr()), false);
717 
718   llvm::FunctionType *FTy = CGF.CGM.getTypes().GetFunctionType(FuncInfo);
719   llvm::FunctionCallee Func = CGF.CGM.CreateRuntimeFunction(
720       FTy, LibCallName, llvm::AttributeList(), true);
721   CGCallee Callee = CGCallee::forDirect(Func, FQTy->getAs<FunctionProtoType>());
722 
723   llvm::CallBase *Call;
724   RValue Res = CGF.EmitCall(FuncInfo, Callee, ReturnValueSlot(), Args, &Call);
725   Call->setCallingConv(CGF.CGM.getRuntimeCC());
726   return Res.getComplexVal();
727 }
728 
729 /// Lookup the libcall name for a given floating point type complex
730 /// multiply.
731 static StringRef getComplexMultiplyLibCallName(llvm::Type *Ty) {
732   switch (Ty->getTypeID()) {
733   default:
734     llvm_unreachable("Unsupported floating point type!");
735   case llvm::Type::HalfTyID:
736     return "__mulhc3";
737   case llvm::Type::FloatTyID:
738     return "__mulsc3";
739   case llvm::Type::DoubleTyID:
740     return "__muldc3";
741   case llvm::Type::PPC_FP128TyID:
742     return "__multc3";
743   case llvm::Type::X86_FP80TyID:
744     return "__mulxc3";
745   case llvm::Type::FP128TyID:
746     return "__multc3";
747   }
748 }
749 
750 // See C11 Annex G.5.1 for the semantics of multiplicative operators on complex
751 // typed values.
752 ComplexPairTy ComplexExprEmitter::EmitBinMul(const BinOpInfo &Op) {
753   using llvm::Value;
754   Value *ResR, *ResI;
755   llvm::MDBuilder MDHelper(CGF.getLLVMContext());
756 
757   if (Op.LHS.first->getType()->isFloatingPointTy()) {
758     // The general formulation is:
759     // (a + ib) * (c + id) = (a * c - b * d) + i(a * d + b * c)
760     //
761     // But we can fold away components which would be zero due to a real
762     // operand according to C11 Annex G.5.1p2.
763     // FIXME: C11 also provides for imaginary types which would allow folding
764     // still more of this within the type system.
765 
766     CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op.FPFeatures);
767     if (Op.LHS.second && Op.RHS.second) {
768       // If both operands are complex, emit the core math directly, and then
769       // test for NaNs. If we find NaNs in the result, we delegate to a libcall
770       // to carefully re-compute the correct infinity representation if
771       // possible. The expectation is that the presence of NaNs here is
772       // *extremely* rare, and so the cost of the libcall is almost irrelevant.
773       // This is good, because the libcall re-computes the core multiplication
774       // exactly the same as we do here and re-tests for NaNs in order to be
775       // a generic complex*complex libcall.
776 
777       // First compute the four products.
778       Value *AC = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul_ac");
779       Value *BD = Builder.CreateFMul(Op.LHS.second, Op.RHS.second, "mul_bd");
780       Value *AD = Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul_ad");
781       Value *BC = Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul_bc");
782 
783       // The real part is the difference of the first two, the imaginary part is
784       // the sum of the second.
785       ResR = Builder.CreateFSub(AC, BD, "mul_r");
786       ResI = Builder.CreateFAdd(AD, BC, "mul_i");
787 
788       if (Op.FPFeatures.getComplexRange() == LangOptions::CX_Limited ||
789           Op.FPFeatures.getComplexRange() == LangOptions::CX_Fortran)
790         return ComplexPairTy(ResR, ResI);
791 
792       // Emit the test for the real part becoming NaN and create a branch to
793       // handle it. We test for NaN by comparing the number to itself.
794       Value *IsRNaN = Builder.CreateFCmpUNO(ResR, ResR, "isnan_cmp");
795       llvm::BasicBlock *ContBB = CGF.createBasicBlock("complex_mul_cont");
796       llvm::BasicBlock *INaNBB = CGF.createBasicBlock("complex_mul_imag_nan");
797       llvm::Instruction *Branch = Builder.CreateCondBr(IsRNaN, INaNBB, ContBB);
798       llvm::BasicBlock *OrigBB = Branch->getParent();
799 
800       // Give hint that we very much don't expect to see NaNs.
801       // Value chosen to match UR_NONTAKEN_WEIGHT, see BranchProbabilityInfo.cpp
802       llvm::MDNode *BrWeight = MDHelper.createBranchWeights(1, (1U << 20) - 1);
803       Branch->setMetadata(llvm::LLVMContext::MD_prof, BrWeight);
804 
805       // Now test the imaginary part and create its branch.
806       CGF.EmitBlock(INaNBB);
807       Value *IsINaN = Builder.CreateFCmpUNO(ResI, ResI, "isnan_cmp");
808       llvm::BasicBlock *LibCallBB = CGF.createBasicBlock("complex_mul_libcall");
809       Branch = Builder.CreateCondBr(IsINaN, LibCallBB, ContBB);
810       Branch->setMetadata(llvm::LLVMContext::MD_prof, BrWeight);
811 
812       // Now emit the libcall on this slowest of the slow paths.
813       CGF.EmitBlock(LibCallBB);
814       Value *LibCallR, *LibCallI;
815       std::tie(LibCallR, LibCallI) = EmitComplexBinOpLibCall(
816           getComplexMultiplyLibCallName(Op.LHS.first->getType()), Op);
817       Builder.CreateBr(ContBB);
818 
819       // Finally continue execution by phi-ing together the different
820       // computation paths.
821       CGF.EmitBlock(ContBB);
822       llvm::PHINode *RealPHI = Builder.CreatePHI(ResR->getType(), 3, "real_mul_phi");
823       RealPHI->addIncoming(ResR, OrigBB);
824       RealPHI->addIncoming(ResR, INaNBB);
825       RealPHI->addIncoming(LibCallR, LibCallBB);
826       llvm::PHINode *ImagPHI = Builder.CreatePHI(ResI->getType(), 3, "imag_mul_phi");
827       ImagPHI->addIncoming(ResI, OrigBB);
828       ImagPHI->addIncoming(ResI, INaNBB);
829       ImagPHI->addIncoming(LibCallI, LibCallBB);
830       return ComplexPairTy(RealPHI, ImagPHI);
831     }
832     assert((Op.LHS.second || Op.RHS.second) &&
833            "At least one operand must be complex!");
834 
835     // If either of the operands is a real rather than a complex, the
836     // imaginary component is ignored when computing the real component of the
837     // result.
838     ResR = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul.rl");
839 
840     ResI = Op.LHS.second
841                ? Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul.il")
842                : Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul.ir");
843   } else {
844     assert(Op.LHS.second && Op.RHS.second &&
845            "Both operands of integer complex operators must be complex!");
846     Value *ResRl = Builder.CreateMul(Op.LHS.first, Op.RHS.first, "mul.rl");
847     Value *ResRr = Builder.CreateMul(Op.LHS.second, Op.RHS.second, "mul.rr");
848     ResR = Builder.CreateSub(ResRl, ResRr, "mul.r");
849 
850     Value *ResIl = Builder.CreateMul(Op.LHS.second, Op.RHS.first, "mul.il");
851     Value *ResIr = Builder.CreateMul(Op.LHS.first, Op.RHS.second, "mul.ir");
852     ResI = Builder.CreateAdd(ResIl, ResIr, "mul.i");
853   }
854   return ComplexPairTy(ResR, ResI);
855 }
856 
857 ComplexPairTy ComplexExprEmitter::EmitAlgebraicDiv(llvm::Value *LHSr,
858                                                    llvm::Value *LHSi,
859                                                    llvm::Value *RHSr,
860                                                    llvm::Value *RHSi) {
861   // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
862   llvm::Value *DSTr, *DSTi;
863 
864   llvm::Value *AC = Builder.CreateFMul(LHSr, RHSr); // a*c
865   llvm::Value *BD = Builder.CreateFMul(LHSi, RHSi); // b*d
866   llvm::Value *ACpBD = Builder.CreateFAdd(AC, BD);  // ac+bd
867 
868   llvm::Value *CC = Builder.CreateFMul(RHSr, RHSr); // c*c
869   llvm::Value *DD = Builder.CreateFMul(RHSi, RHSi); // d*d
870   llvm::Value *CCpDD = Builder.CreateFAdd(CC, DD);  // cc+dd
871 
872   llvm::Value *BC = Builder.CreateFMul(LHSi, RHSr); // b*c
873   llvm::Value *AD = Builder.CreateFMul(LHSr, RHSi); // a*d
874   llvm::Value *BCmAD = Builder.CreateFSub(BC, AD);  // bc-ad
875 
876   DSTr = Builder.CreateFDiv(ACpBD, CCpDD);
877   DSTi = Builder.CreateFDiv(BCmAD, CCpDD);
878   return ComplexPairTy(DSTr, DSTi);
879 }
880 
881 // EmitFAbs - Emit a call to @llvm.fabs.
882 static llvm::Value *EmitllvmFAbs(CodeGenFunction &CGF, llvm::Value *Value) {
883   llvm::Function *Func =
884       CGF.CGM.getIntrinsic(llvm::Intrinsic::fabs, Value->getType());
885   llvm::Value *Call = CGF.Builder.CreateCall(Func, Value);
886   return Call;
887 }
888 
889 // EmitRangeReductionDiv - Implements Smith's algorithm for complex division.
890 // SMITH, R. L. Algorithm 116: Complex division. Commun. ACM 5, 8 (1962).
891 ComplexPairTy ComplexExprEmitter::EmitRangeReductionDiv(llvm::Value *LHSr,
892                                                         llvm::Value *LHSi,
893                                                         llvm::Value *RHSr,
894                                                         llvm::Value *RHSi) {
895   // (a + ib) / (c + id) = (e + if)
896   llvm::Value *FAbsRHSr = EmitllvmFAbs(CGF, RHSr); // |c|
897   llvm::Value *FAbsRHSi = EmitllvmFAbs(CGF, RHSi); // |d|
898   // |c| >= |d|
899   llvm::Value *IsR = Builder.CreateFCmpUGT(FAbsRHSr, FAbsRHSi, "abs_cmp");
900 
901   llvm::BasicBlock *TrueBB =
902       CGF.createBasicBlock("abs_rhsr_greater_or_equal_abs_rhsi");
903   llvm::BasicBlock *FalseBB =
904       CGF.createBasicBlock("abs_rhsr_less_than_abs_rhsi");
905   llvm::BasicBlock *ContBB = CGF.createBasicBlock("complex_div");
906   Builder.CreateCondBr(IsR, TrueBB, FalseBB);
907 
908   CGF.EmitBlock(TrueBB);
909   // abs(c) >= abs(d)
910   // r = d/c
911   // tmp = c + rd
912   // e = (a + br)/tmp
913   // f = (b - ar)/tmp
914   llvm::Value *DdC = Builder.CreateFDiv(RHSi, RHSr); // r=d/c
915 
916   llvm::Value *RD = Builder.CreateFMul(DdC, RHSi);  // rd
917   llvm::Value *CpRD = Builder.CreateFAdd(RHSr, RD); // tmp=c+rd
918 
919   llvm::Value *T3 = Builder.CreateFMul(LHSi, DdC);   // br
920   llvm::Value *T4 = Builder.CreateFAdd(LHSr, T3);    // a+br
921   llvm::Value *DSTTr = Builder.CreateFDiv(T4, CpRD); // (a+br)/tmp
922 
923   llvm::Value *T5 = Builder.CreateFMul(LHSr, DdC);   // ar
924   llvm::Value *T6 = Builder.CreateFSub(LHSi, T5);    // b-ar
925   llvm::Value *DSTTi = Builder.CreateFDiv(T6, CpRD); // (b-ar)/tmp
926   Builder.CreateBr(ContBB);
927 
928   CGF.EmitBlock(FalseBB);
929   // abs(c) < abs(d)
930   // r = c/d
931   // tmp = d + rc
932   // e = (ar + b)/tmp
933   // f = (br - a)/tmp
934   llvm::Value *CdD = Builder.CreateFDiv(RHSr, RHSi); // r=c/d
935 
936   llvm::Value *RC = Builder.CreateFMul(CdD, RHSr);  // rc
937   llvm::Value *DpRC = Builder.CreateFAdd(RHSi, RC); // tmp=d+rc
938 
939   llvm::Value *T7 = Builder.CreateFMul(LHSr, RC);    // ar
940   llvm::Value *T8 = Builder.CreateFAdd(T7, LHSi);    // ar+b
941   llvm::Value *DSTFr = Builder.CreateFDiv(T8, DpRC); // (ar+b)/tmp
942 
943   llvm::Value *T9 = Builder.CreateFMul(LHSi, CdD);    // br
944   llvm::Value *T10 = Builder.CreateFSub(T9, LHSr);    // br-a
945   llvm::Value *DSTFi = Builder.CreateFDiv(T10, DpRC); // (br-a)/tmp
946   Builder.CreateBr(ContBB);
947 
948   // Phi together the computation paths.
949   CGF.EmitBlock(ContBB);
950   llvm::PHINode *VALr = Builder.CreatePHI(DSTTr->getType(), 2);
951   VALr->addIncoming(DSTTr, TrueBB);
952   VALr->addIncoming(DSTFr, FalseBB);
953   llvm::PHINode *VALi = Builder.CreatePHI(DSTTi->getType(), 2);
954   VALi->addIncoming(DSTTi, TrueBB);
955   VALi->addIncoming(DSTFi, FalseBB);
956   return ComplexPairTy(VALr, VALi);
957 }
958 
959 // See C11 Annex G.5.1 for the semantics of multiplicative operators on complex
960 // typed values.
961 ComplexPairTy ComplexExprEmitter::EmitBinDiv(const BinOpInfo &Op) {
962   llvm::Value *LHSr = Op.LHS.first, *LHSi = Op.LHS.second;
963   llvm::Value *RHSr = Op.RHS.first, *RHSi = Op.RHS.second;
964   llvm::Value *DSTr, *DSTi;
965   if (LHSr->getType()->isFloatingPointTy()) {
966     CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, Op.FPFeatures);
967     if (!RHSi) {
968       assert(LHSi && "Can have at most one non-complex operand!");
969 
970       DSTr = Builder.CreateFDiv(LHSr, RHSr);
971       DSTi = Builder.CreateFDiv(LHSi, RHSr);
972       return ComplexPairTy(DSTr, DSTi);
973     }
974     llvm::Value *OrigLHSi = LHSi;
975     if (!LHSi)
976       LHSi = llvm::Constant::getNullValue(RHSi->getType());
977     if (Op.FPFeatures.getComplexRange() == LangOptions::CX_Fortran)
978       return EmitRangeReductionDiv(LHSr, LHSi, RHSr, RHSi);
979     else if (Op.FPFeatures.getComplexRange() == LangOptions::CX_Limited)
980       return EmitAlgebraicDiv(LHSr, LHSi, RHSr, RHSi);
981     else if (!CGF.getLangOpts().FastMath) {
982       LHSi = OrigLHSi;
983       // If we have a complex operand on the RHS and FastMath is not allowed, we
984       // delegate to a libcall to handle all of the complexities and minimize
985       // underflow/overflow cases. When FastMath is allowed we construct the
986       // divide inline using the same algorithm as for integer operands.
987       //
988       // FIXME: We would be able to avoid the libcall in many places if we
989       // supported imaginary types in addition to complex types.
990       BinOpInfo LibCallOp = Op;
991       // If LHS was a real, supply a null imaginary part.
992       if (!LHSi)
993         LibCallOp.LHS.second = llvm::Constant::getNullValue(LHSr->getType());
994 
995       switch (LHSr->getType()->getTypeID()) {
996       default:
997         llvm_unreachable("Unsupported floating point type!");
998       case llvm::Type::HalfTyID:
999         return EmitComplexBinOpLibCall("__divhc3", LibCallOp);
1000       case llvm::Type::FloatTyID:
1001         return EmitComplexBinOpLibCall("__divsc3", LibCallOp);
1002       case llvm::Type::DoubleTyID:
1003         return EmitComplexBinOpLibCall("__divdc3", LibCallOp);
1004       case llvm::Type::PPC_FP128TyID:
1005         return EmitComplexBinOpLibCall("__divtc3", LibCallOp);
1006       case llvm::Type::X86_FP80TyID:
1007         return EmitComplexBinOpLibCall("__divxc3", LibCallOp);
1008       case llvm::Type::FP128TyID:
1009         return EmitComplexBinOpLibCall("__divtc3", LibCallOp);
1010       }
1011     } else {
1012       return EmitAlgebraicDiv(LHSr, LHSi, RHSr, RHSi);
1013     }
1014   } else {
1015     assert(Op.LHS.second && Op.RHS.second &&
1016            "Both operands of integer complex operators must be complex!");
1017     // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
1018     llvm::Value *Tmp1 = Builder.CreateMul(LHSr, RHSr); // a*c
1019     llvm::Value *Tmp2 = Builder.CreateMul(LHSi, RHSi); // b*d
1020     llvm::Value *Tmp3 = Builder.CreateAdd(Tmp1, Tmp2); // ac+bd
1021 
1022     llvm::Value *Tmp4 = Builder.CreateMul(RHSr, RHSr); // c*c
1023     llvm::Value *Tmp5 = Builder.CreateMul(RHSi, RHSi); // d*d
1024     llvm::Value *Tmp6 = Builder.CreateAdd(Tmp4, Tmp5); // cc+dd
1025 
1026     llvm::Value *Tmp7 = Builder.CreateMul(LHSi, RHSr); // b*c
1027     llvm::Value *Tmp8 = Builder.CreateMul(LHSr, RHSi); // a*d
1028     llvm::Value *Tmp9 = Builder.CreateSub(Tmp7, Tmp8); // bc-ad
1029 
1030     if (Op.Ty->castAs<ComplexType>()->getElementType()->isUnsignedIntegerType()) {
1031       DSTr = Builder.CreateUDiv(Tmp3, Tmp6);
1032       DSTi = Builder.CreateUDiv(Tmp9, Tmp6);
1033     } else {
1034       DSTr = Builder.CreateSDiv(Tmp3, Tmp6);
1035       DSTi = Builder.CreateSDiv(Tmp9, Tmp6);
1036     }
1037   }
1038 
1039   return ComplexPairTy(DSTr, DSTi);
1040 }
1041 
1042 ComplexPairTy CodeGenFunction::EmitUnPromotedValue(ComplexPairTy result,
1043                                                    QualType UnPromotionType) {
1044   llvm::Type *ComplexElementTy =
1045       ConvertType(UnPromotionType->castAs<ComplexType>()->getElementType());
1046   if (result.first)
1047     result.first =
1048         Builder.CreateFPTrunc(result.first, ComplexElementTy, "unpromotion");
1049   if (result.second)
1050     result.second =
1051         Builder.CreateFPTrunc(result.second, ComplexElementTy, "unpromotion");
1052   return result;
1053 }
1054 
1055 ComplexPairTy CodeGenFunction::EmitPromotedValue(ComplexPairTy result,
1056                                                  QualType PromotionType) {
1057   llvm::Type *ComplexElementTy =
1058       ConvertType(PromotionType->castAs<ComplexType>()->getElementType());
1059   if (result.first)
1060     result.first = Builder.CreateFPExt(result.first, ComplexElementTy, "ext");
1061   if (result.second)
1062     result.second = Builder.CreateFPExt(result.second, ComplexElementTy, "ext");
1063 
1064   return result;
1065 }
1066 
1067 ComplexPairTy ComplexExprEmitter::EmitPromoted(const Expr *E,
1068                                                QualType PromotionType) {
1069   E = E->IgnoreParens();
1070   if (auto BO = dyn_cast<BinaryOperator>(E)) {
1071     switch (BO->getOpcode()) {
1072 #define HANDLE_BINOP(OP)                                                       \
1073   case BO_##OP:                                                                \
1074     return EmitBin##OP(EmitBinOps(BO, PromotionType));
1075       HANDLE_BINOP(Add)
1076       HANDLE_BINOP(Sub)
1077       HANDLE_BINOP(Mul)
1078       HANDLE_BINOP(Div)
1079 #undef HANDLE_BINOP
1080     default:
1081       break;
1082     }
1083   } else if (auto UO = dyn_cast<UnaryOperator>(E)) {
1084     switch (UO->getOpcode()) {
1085     case UO_Minus:
1086       return VisitMinus(UO, PromotionType);
1087     case UO_Plus:
1088       return VisitPlus(UO, PromotionType);
1089     default:
1090       break;
1091     }
1092   }
1093   auto result = Visit(const_cast<Expr *>(E));
1094   if (!PromotionType.isNull())
1095     return CGF.EmitPromotedValue(result, PromotionType);
1096   else
1097     return result;
1098 }
1099 
1100 ComplexPairTy CodeGenFunction::EmitPromotedComplexExpr(const Expr *E,
1101                                                        QualType DstTy) {
1102   return ComplexExprEmitter(*this).EmitPromoted(E, DstTy);
1103 }
1104 
1105 ComplexPairTy
1106 ComplexExprEmitter::EmitPromotedComplexOperand(const Expr *E,
1107                                                QualType OverallPromotionType) {
1108   if (E->getType()->isAnyComplexType()) {
1109     if (!OverallPromotionType.isNull())
1110       return CGF.EmitPromotedComplexExpr(E, OverallPromotionType);
1111     else
1112       return Visit(const_cast<Expr *>(E));
1113   } else {
1114     if (!OverallPromotionType.isNull()) {
1115       QualType ComplexElementTy =
1116           OverallPromotionType->castAs<ComplexType>()->getElementType();
1117       return ComplexPairTy(CGF.EmitPromotedScalarExpr(E, ComplexElementTy),
1118                            nullptr);
1119     } else {
1120       return ComplexPairTy(CGF.EmitScalarExpr(E), nullptr);
1121     }
1122   }
1123 }
1124 
1125 ComplexExprEmitter::BinOpInfo
1126 ComplexExprEmitter::EmitBinOps(const BinaryOperator *E,
1127                                QualType PromotionType) {
1128   TestAndClearIgnoreReal();
1129   TestAndClearIgnoreImag();
1130   BinOpInfo Ops;
1131 
1132   Ops.LHS = EmitPromotedComplexOperand(E->getLHS(), PromotionType);
1133   Ops.RHS = EmitPromotedComplexOperand(E->getRHS(), PromotionType);
1134   if (!PromotionType.isNull())
1135     Ops.Ty = PromotionType;
1136   else
1137     Ops.Ty = E->getType();
1138   Ops.FPFeatures = E->getFPFeaturesInEffect(CGF.getLangOpts());
1139   return Ops;
1140 }
1141 
1142 
1143 LValue ComplexExprEmitter::
1144 EmitCompoundAssignLValue(const CompoundAssignOperator *E,
1145           ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&),
1146                          RValue &Val) {
1147   TestAndClearIgnoreReal();
1148   TestAndClearIgnoreImag();
1149   QualType LHSTy = E->getLHS()->getType();
1150   if (const AtomicType *AT = LHSTy->getAs<AtomicType>())
1151     LHSTy = AT->getValueType();
1152 
1153   BinOpInfo OpInfo;
1154   OpInfo.FPFeatures = E->getFPFeaturesInEffect(CGF.getLangOpts());
1155   CodeGenFunction::CGFPOptionsRAII FPOptsRAII(CGF, OpInfo.FPFeatures);
1156 
1157   // Load the RHS and LHS operands.
1158   // __block variables need to have the rhs evaluated first, plus this should
1159   // improve codegen a little.
1160   QualType PromotionTypeCR;
1161   PromotionTypeCR = getPromotionType(E->getComputationResultType());
1162   if (PromotionTypeCR.isNull())
1163     PromotionTypeCR = E->getComputationResultType();
1164   OpInfo.Ty = PromotionTypeCR;
1165   QualType ComplexElementTy =
1166       OpInfo.Ty->castAs<ComplexType>()->getElementType();
1167   QualType PromotionTypeRHS = getPromotionType(E->getRHS()->getType());
1168 
1169   // The RHS should have been converted to the computation type.
1170   if (E->getRHS()->getType()->isRealFloatingType()) {
1171     if (!PromotionTypeRHS.isNull())
1172       OpInfo.RHS = ComplexPairTy(
1173           CGF.EmitPromotedScalarExpr(E->getRHS(), PromotionTypeRHS), nullptr);
1174     else {
1175       assert(CGF.getContext().hasSameUnqualifiedType(ComplexElementTy,
1176                                                      E->getRHS()->getType()));
1177 
1178       OpInfo.RHS = ComplexPairTy(CGF.EmitScalarExpr(E->getRHS()), nullptr);
1179     }
1180   } else {
1181     if (!PromotionTypeRHS.isNull()) {
1182       OpInfo.RHS = ComplexPairTy(
1183           CGF.EmitPromotedComplexExpr(E->getRHS(), PromotionTypeRHS));
1184     } else {
1185       assert(CGF.getContext().hasSameUnqualifiedType(OpInfo.Ty,
1186                                                      E->getRHS()->getType()));
1187       OpInfo.RHS = Visit(E->getRHS());
1188     }
1189   }
1190 
1191   LValue LHS = CGF.EmitLValue(E->getLHS());
1192 
1193   // Load from the l-value and convert it.
1194   SourceLocation Loc = E->getExprLoc();
1195   QualType PromotionTypeLHS = getPromotionType(E->getComputationLHSType());
1196   if (LHSTy->isAnyComplexType()) {
1197     ComplexPairTy LHSVal = EmitLoadOfLValue(LHS, Loc);
1198     if (!PromotionTypeLHS.isNull())
1199       OpInfo.LHS =
1200           EmitComplexToComplexCast(LHSVal, LHSTy, PromotionTypeLHS, Loc);
1201     else
1202       OpInfo.LHS = EmitComplexToComplexCast(LHSVal, LHSTy, OpInfo.Ty, Loc);
1203   } else {
1204     llvm::Value *LHSVal = CGF.EmitLoadOfScalar(LHS, Loc);
1205     // For floating point real operands we can directly pass the scalar form
1206     // to the binary operator emission and potentially get more efficient code.
1207     if (LHSTy->isRealFloatingType()) {
1208       QualType PromotedComplexElementTy;
1209       if (!PromotionTypeLHS.isNull()) {
1210         PromotedComplexElementTy =
1211             cast<ComplexType>(PromotionTypeLHS)->getElementType();
1212         if (!CGF.getContext().hasSameUnqualifiedType(PromotedComplexElementTy,
1213                                                      PromotionTypeLHS))
1214           LHSVal = CGF.EmitScalarConversion(LHSVal, LHSTy,
1215                                             PromotedComplexElementTy, Loc);
1216       } else {
1217         if (!CGF.getContext().hasSameUnqualifiedType(ComplexElementTy, LHSTy))
1218           LHSVal =
1219               CGF.EmitScalarConversion(LHSVal, LHSTy, ComplexElementTy, Loc);
1220       }
1221       OpInfo.LHS = ComplexPairTy(LHSVal, nullptr);
1222     } else {
1223       OpInfo.LHS = EmitScalarToComplexCast(LHSVal, LHSTy, OpInfo.Ty, Loc);
1224     }
1225   }
1226 
1227   // Expand the binary operator.
1228   ComplexPairTy Result = (this->*Func)(OpInfo);
1229 
1230   // Truncate the result and store it into the LHS lvalue.
1231   if (LHSTy->isAnyComplexType()) {
1232     ComplexPairTy ResVal =
1233         EmitComplexToComplexCast(Result, OpInfo.Ty, LHSTy, Loc);
1234     EmitStoreOfComplex(ResVal, LHS, /*isInit*/ false);
1235     Val = RValue::getComplex(ResVal);
1236   } else {
1237     llvm::Value *ResVal =
1238         CGF.EmitComplexToScalarConversion(Result, OpInfo.Ty, LHSTy, Loc);
1239     CGF.EmitStoreOfScalar(ResVal, LHS, /*isInit*/ false);
1240     Val = RValue::get(ResVal);
1241   }
1242 
1243   return LHS;
1244 }
1245 
1246 // Compound assignments.
1247 ComplexPairTy ComplexExprEmitter::
1248 EmitCompoundAssign(const CompoundAssignOperator *E,
1249                    ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&)){
1250   RValue Val;
1251   LValue LV = EmitCompoundAssignLValue(E, Func, Val);
1252 
1253   // The result of an assignment in C is the assigned r-value.
1254   if (!CGF.getLangOpts().CPlusPlus)
1255     return Val.getComplexVal();
1256 
1257   // If the lvalue is non-volatile, return the computed value of the assignment.
1258   if (!LV.isVolatileQualified())
1259     return Val.getComplexVal();
1260 
1261   return EmitLoadOfLValue(LV, E->getExprLoc());
1262 }
1263 
1264 LValue ComplexExprEmitter::EmitBinAssignLValue(const BinaryOperator *E,
1265                                                ComplexPairTy &Val) {
1266   assert(CGF.getContext().hasSameUnqualifiedType(E->getLHS()->getType(),
1267                                                  E->getRHS()->getType()) &&
1268          "Invalid assignment");
1269   TestAndClearIgnoreReal();
1270   TestAndClearIgnoreImag();
1271 
1272   // Emit the RHS.  __block variables need the RHS evaluated first.
1273   Val = Visit(E->getRHS());
1274 
1275   // Compute the address to store into.
1276   LValue LHS = CGF.EmitLValue(E->getLHS());
1277 
1278   // Store the result value into the LHS lvalue.
1279   EmitStoreOfComplex(Val, LHS, /*isInit*/ false);
1280 
1281   return LHS;
1282 }
1283 
1284 ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) {
1285   ComplexPairTy Val;
1286   LValue LV = EmitBinAssignLValue(E, Val);
1287 
1288   // The result of an assignment in C is the assigned r-value.
1289   if (!CGF.getLangOpts().CPlusPlus)
1290     return Val;
1291 
1292   // If the lvalue is non-volatile, return the computed value of the assignment.
1293   if (!LV.isVolatileQualified())
1294     return Val;
1295 
1296   return EmitLoadOfLValue(LV, E->getExprLoc());
1297 }
1298 
1299 ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) {
1300   CGF.EmitIgnoredExpr(E->getLHS());
1301   return Visit(E->getRHS());
1302 }
1303 
1304 ComplexPairTy ComplexExprEmitter::
1305 VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
1306   TestAndClearIgnoreReal();
1307   TestAndClearIgnoreImag();
1308   llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true");
1309   llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false");
1310   llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
1311 
1312   // Bind the common expression if necessary.
1313   CodeGenFunction::OpaqueValueMapping binding(CGF, E);
1314 
1315 
1316   CodeGenFunction::ConditionalEvaluation eval(CGF);
1317   CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock,
1318                            CGF.getProfileCount(E));
1319 
1320   eval.begin(CGF);
1321   CGF.EmitBlock(LHSBlock);
1322   CGF.incrementProfileCounter(E);
1323   ComplexPairTy LHS = Visit(E->getTrueExpr());
1324   LHSBlock = Builder.GetInsertBlock();
1325   CGF.EmitBranch(ContBlock);
1326   eval.end(CGF);
1327 
1328   eval.begin(CGF);
1329   CGF.EmitBlock(RHSBlock);
1330   ComplexPairTy RHS = Visit(E->getFalseExpr());
1331   RHSBlock = Builder.GetInsertBlock();
1332   CGF.EmitBlock(ContBlock);
1333   eval.end(CGF);
1334 
1335   // Create a PHI node for the real part.
1336   llvm::PHINode *RealPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.r");
1337   RealPN->addIncoming(LHS.first, LHSBlock);
1338   RealPN->addIncoming(RHS.first, RHSBlock);
1339 
1340   // Create a PHI node for the imaginary part.
1341   llvm::PHINode *ImagPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.i");
1342   ImagPN->addIncoming(LHS.second, LHSBlock);
1343   ImagPN->addIncoming(RHS.second, RHSBlock);
1344 
1345   return ComplexPairTy(RealPN, ImagPN);
1346 }
1347 
1348 ComplexPairTy ComplexExprEmitter::VisitChooseExpr(ChooseExpr *E) {
1349   return Visit(E->getChosenSubExpr());
1350 }
1351 
1352 ComplexPairTy ComplexExprEmitter::VisitInitListExpr(InitListExpr *E) {
1353     bool Ignore = TestAndClearIgnoreReal();
1354     (void)Ignore;
1355     assert (Ignore == false && "init list ignored");
1356     Ignore = TestAndClearIgnoreImag();
1357     (void)Ignore;
1358     assert (Ignore == false && "init list ignored");
1359 
1360   if (E->getNumInits() == 2) {
1361     llvm::Value *Real = CGF.EmitScalarExpr(E->getInit(0));
1362     llvm::Value *Imag = CGF.EmitScalarExpr(E->getInit(1));
1363     return ComplexPairTy(Real, Imag);
1364   } else if (E->getNumInits() == 1) {
1365     return Visit(E->getInit(0));
1366   }
1367 
1368   // Empty init list initializes to null
1369   assert(E->getNumInits() == 0 && "Unexpected number of inits");
1370   QualType Ty = E->getType()->castAs<ComplexType>()->getElementType();
1371   llvm::Type* LTy = CGF.ConvertType(Ty);
1372   llvm::Value* zeroConstant = llvm::Constant::getNullValue(LTy);
1373   return ComplexPairTy(zeroConstant, zeroConstant);
1374 }
1375 
1376 ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) {
1377   Address ArgValue = Address::invalid();
1378   Address ArgPtr = CGF.EmitVAArg(E, ArgValue);
1379 
1380   if (!ArgPtr.isValid()) {
1381     CGF.ErrorUnsupported(E, "complex va_arg expression");
1382     llvm::Type *EltTy =
1383       CGF.ConvertType(E->getType()->castAs<ComplexType>()->getElementType());
1384     llvm::Value *U = llvm::UndefValue::get(EltTy);
1385     return ComplexPairTy(U, U);
1386   }
1387 
1388   return EmitLoadOfLValue(CGF.MakeAddrLValue(ArgPtr, E->getType()),
1389                           E->getExprLoc());
1390 }
1391 
1392 //===----------------------------------------------------------------------===//
1393 //                         Entry Point into this File
1394 //===----------------------------------------------------------------------===//
1395 
1396 /// EmitComplexExpr - Emit the computation of the specified expression of
1397 /// complex type, ignoring the result.
1398 ComplexPairTy CodeGenFunction::EmitComplexExpr(const Expr *E, bool IgnoreReal,
1399                                                bool IgnoreImag) {
1400   assert(E && getComplexType(E->getType()) &&
1401          "Invalid complex expression to emit");
1402 
1403   return ComplexExprEmitter(*this, IgnoreReal, IgnoreImag)
1404       .Visit(const_cast<Expr *>(E));
1405 }
1406 
1407 void CodeGenFunction::EmitComplexExprIntoLValue(const Expr *E, LValue dest,
1408                                                 bool isInit) {
1409   assert(E && getComplexType(E->getType()) &&
1410          "Invalid complex expression to emit");
1411   ComplexExprEmitter Emitter(*this);
1412   ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E));
1413   Emitter.EmitStoreOfComplex(Val, dest, isInit);
1414 }
1415 
1416 /// EmitStoreOfComplex - Store a complex number into the specified l-value.
1417 void CodeGenFunction::EmitStoreOfComplex(ComplexPairTy V, LValue dest,
1418                                          bool isInit) {
1419   ComplexExprEmitter(*this).EmitStoreOfComplex(V, dest, isInit);
1420 }
1421 
1422 /// EmitLoadOfComplex - Load a complex number from the specified address.
1423 ComplexPairTy CodeGenFunction::EmitLoadOfComplex(LValue src,
1424                                                  SourceLocation loc) {
1425   return ComplexExprEmitter(*this).EmitLoadOfLValue(src, loc);
1426 }
1427 
1428 LValue CodeGenFunction::EmitComplexAssignmentLValue(const BinaryOperator *E) {
1429   assert(E->getOpcode() == BO_Assign);
1430   ComplexPairTy Val; // ignored
1431   LValue LVal = ComplexExprEmitter(*this).EmitBinAssignLValue(E, Val);
1432   if (getLangOpts().OpenMP)
1433     CGM.getOpenMPRuntime().checkAndEmitLastprivateConditional(*this,
1434                                                               E->getLHS());
1435   return LVal;
1436 }
1437 
1438 typedef ComplexPairTy (ComplexExprEmitter::*CompoundFunc)(
1439     const ComplexExprEmitter::BinOpInfo &);
1440 
1441 static CompoundFunc getComplexOp(BinaryOperatorKind Op) {
1442   switch (Op) {
1443   case BO_MulAssign: return &ComplexExprEmitter::EmitBinMul;
1444   case BO_DivAssign: return &ComplexExprEmitter::EmitBinDiv;
1445   case BO_SubAssign: return &ComplexExprEmitter::EmitBinSub;
1446   case BO_AddAssign: return &ComplexExprEmitter::EmitBinAdd;
1447   default:
1448     llvm_unreachable("unexpected complex compound assignment");
1449   }
1450 }
1451 
1452 LValue CodeGenFunction::
1453 EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator *E) {
1454   CompoundFunc Op = getComplexOp(E->getOpcode());
1455   RValue Val;
1456   return ComplexExprEmitter(*this).EmitCompoundAssignLValue(E, Op, Val);
1457 }
1458 
1459 LValue CodeGenFunction::
1460 EmitScalarCompoundAssignWithComplex(const CompoundAssignOperator *E,
1461                                     llvm::Value *&Result) {
1462   CompoundFunc Op = getComplexOp(E->getOpcode());
1463   RValue Val;
1464   LValue Ret = ComplexExprEmitter(*this).EmitCompoundAssignLValue(E, Op, Val);
1465   Result = Val.getScalarVal();
1466   return Ret;
1467 }
1468