CGExprComplex.cpp 42 KB

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