CGExprComplex.cpp 42 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118
  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. // HLSL Change Start
  426. case CK_FlatConversion:
  427. case CK_HLSLVectorSplat:
  428. case CK_HLSLMatrixSplat:
  429. case CK_HLSLVectorToScalarCast:
  430. case CK_HLSLMatrixToScalarCast:
  431. case CK_HLSLVectorTruncationCast:
  432. case CK_HLSLMatrixTruncationCast:
  433. case CK_HLSLVectorToMatrixCast:
  434. case CK_HLSLMatrixToVectorCast:
  435. case CK_HLSLDerivedToBase:
  436. case CK_HLSLCC_IntegralCast:
  437. case CK_HLSLCC_IntegralToBoolean:
  438. case CK_HLSLCC_IntegralToFloating:
  439. case CK_HLSLCC_FloatingToIntegral:
  440. case CK_HLSLCC_FloatingToBoolean:
  441. case CK_HLSLCC_FloatingCast:
  442. // HLSL Change End
  443. llvm_unreachable("invalid cast kind for complex value");
  444. case CK_FloatingRealToComplex:
  445. case CK_IntegralRealToComplex:
  446. return EmitScalarToComplexCast(CGF.EmitScalarExpr(Op),
  447. Op->getType(), DestTy);
  448. case CK_FloatingComplexCast:
  449. case CK_FloatingComplexToIntegralComplex:
  450. case CK_IntegralComplexCast:
  451. case CK_IntegralComplexToFloatingComplex:
  452. return EmitComplexToComplexCast(Visit(Op), Op->getType(), DestTy);
  453. }
  454. llvm_unreachable("unknown cast resulting in complex value");
  455. }
  456. ComplexPairTy ComplexExprEmitter::VisitUnaryMinus(const UnaryOperator *E) {
  457. TestAndClearIgnoreReal();
  458. TestAndClearIgnoreImag();
  459. ComplexPairTy Op = Visit(E->getSubExpr());
  460. llvm::Value *ResR, *ResI;
  461. if (Op.first->getType()->isFloatingPointTy()) {
  462. ResR = Builder.CreateFNeg(Op.first, "neg.r");
  463. ResI = Builder.CreateFNeg(Op.second, "neg.i");
  464. } else {
  465. ResR = Builder.CreateNeg(Op.first, "neg.r");
  466. ResI = Builder.CreateNeg(Op.second, "neg.i");
  467. }
  468. return ComplexPairTy(ResR, ResI);
  469. }
  470. ComplexPairTy ComplexExprEmitter::VisitUnaryNot(const UnaryOperator *E) {
  471. TestAndClearIgnoreReal();
  472. TestAndClearIgnoreImag();
  473. // ~(a+ib) = a + i*-b
  474. ComplexPairTy Op = Visit(E->getSubExpr());
  475. llvm::Value *ResI;
  476. if (Op.second->getType()->isFloatingPointTy())
  477. ResI = Builder.CreateFNeg(Op.second, "conj.i");
  478. else
  479. ResI = Builder.CreateNeg(Op.second, "conj.i");
  480. return ComplexPairTy(Op.first, ResI);
  481. }
  482. ComplexPairTy ComplexExprEmitter::EmitBinAdd(const BinOpInfo &Op) {
  483. llvm::Value *ResR, *ResI;
  484. if (Op.LHS.first->getType()->isFloatingPointTy()) {
  485. ResR = Builder.CreateFAdd(Op.LHS.first, Op.RHS.first, "add.r");
  486. if (Op.LHS.second && Op.RHS.second)
  487. ResI = Builder.CreateFAdd(Op.LHS.second, Op.RHS.second, "add.i");
  488. else
  489. ResI = Op.LHS.second ? Op.LHS.second : Op.RHS.second;
  490. assert(ResI && "Only one operand may be real!");
  491. } else {
  492. ResR = Builder.CreateAdd(Op.LHS.first, Op.RHS.first, "add.r");
  493. assert(Op.LHS.second && Op.RHS.second &&
  494. "Both operands of integer complex operators must be complex!");
  495. ResI = Builder.CreateAdd(Op.LHS.second, Op.RHS.second, "add.i");
  496. }
  497. return ComplexPairTy(ResR, ResI);
  498. }
  499. ComplexPairTy ComplexExprEmitter::EmitBinSub(const BinOpInfo &Op) {
  500. llvm::Value *ResR, *ResI;
  501. if (Op.LHS.first->getType()->isFloatingPointTy()) {
  502. ResR = Builder.CreateFSub(Op.LHS.first, Op.RHS.first, "sub.r");
  503. if (Op.LHS.second && Op.RHS.second)
  504. ResI = Builder.CreateFSub(Op.LHS.second, Op.RHS.second, "sub.i");
  505. else
  506. ResI = Op.LHS.second ? Op.LHS.second
  507. : Builder.CreateFNeg(Op.RHS.second, "sub.i");
  508. assert(ResI && "Only one operand may be real!");
  509. } else {
  510. ResR = Builder.CreateSub(Op.LHS.first, Op.RHS.first, "sub.r");
  511. assert(Op.LHS.second && Op.RHS.second &&
  512. "Both operands of integer complex operators must be complex!");
  513. ResI = Builder.CreateSub(Op.LHS.second, Op.RHS.second, "sub.i");
  514. }
  515. return ComplexPairTy(ResR, ResI);
  516. }
  517. /// \brief Emit a libcall for a binary operation on complex types.
  518. ComplexPairTy ComplexExprEmitter::EmitComplexBinOpLibCall(StringRef LibCallName,
  519. const BinOpInfo &Op) {
  520. CallArgList Args;
  521. Args.add(RValue::get(Op.LHS.first),
  522. Op.Ty->castAs<ComplexType>()->getElementType());
  523. Args.add(RValue::get(Op.LHS.second),
  524. Op.Ty->castAs<ComplexType>()->getElementType());
  525. Args.add(RValue::get(Op.RHS.first),
  526. Op.Ty->castAs<ComplexType>()->getElementType());
  527. Args.add(RValue::get(Op.RHS.second),
  528. Op.Ty->castAs<ComplexType>()->getElementType());
  529. // We *must* use the full CG function call building logic here because the
  530. // complex type has special ABI handling. We also should not forget about
  531. // special calling convention which may be used for compiler builtins.
  532. const CGFunctionInfo &FuncInfo =
  533. CGF.CGM.getTypes().arrangeFreeFunctionCall(
  534. Op.Ty, Args, FunctionType::ExtInfo(/* No CC here - will be added later */),
  535. RequiredArgs::All);
  536. llvm::FunctionType *FTy = CGF.CGM.getTypes().GetFunctionType(FuncInfo);
  537. llvm::Constant *Func = CGF.CGM.CreateBuiltinFunction(FTy, LibCallName);
  538. llvm::Instruction *Call;
  539. RValue Res = CGF.EmitCall(FuncInfo, Func, ReturnValueSlot(), Args,
  540. nullptr, &Call);
  541. cast<llvm::CallInst>(Call)->setCallingConv(CGF.CGM.getBuiltinCC());
  542. cast<llvm::CallInst>(Call)->setDoesNotThrow();
  543. return Res.getComplexVal();
  544. }
  545. /// \brief Lookup the libcall name for a given floating point type complex
  546. /// multiply.
  547. static StringRef getComplexMultiplyLibCallName(llvm::Type *Ty) {
  548. switch (Ty->getTypeID()) {
  549. default:
  550. llvm_unreachable("Unsupported floating point type!");
  551. case llvm::Type::HalfTyID:
  552. return "__mulhc3";
  553. case llvm::Type::FloatTyID:
  554. return "__mulsc3";
  555. case llvm::Type::DoubleTyID:
  556. return "__muldc3";
  557. case llvm::Type::PPC_FP128TyID:
  558. return "__multc3";
  559. case llvm::Type::X86_FP80TyID:
  560. return "__mulxc3";
  561. case llvm::Type::FP128TyID:
  562. return "__multc3";
  563. }
  564. }
  565. // See C11 Annex G.5.1 for the semantics of multiplicative operators on complex
  566. // typed values.
  567. ComplexPairTy ComplexExprEmitter::EmitBinMul(const BinOpInfo &Op) {
  568. using llvm::Value;
  569. Value *ResR, *ResI;
  570. llvm::MDBuilder MDHelper(CGF.getLLVMContext());
  571. if (Op.LHS.first->getType()->isFloatingPointTy()) {
  572. // The general formulation is:
  573. // (a + ib) * (c + id) = (a * c - b * d) + i(a * d + b * c)
  574. //
  575. // But we can fold away components which would be zero due to a real
  576. // operand according to C11 Annex G.5.1p2.
  577. // FIXME: C11 also provides for imaginary types which would allow folding
  578. // still more of this within the type system.
  579. if (Op.LHS.second && Op.RHS.second) {
  580. // If both operands are complex, emit the core math directly, and then
  581. // test for NaNs. If we find NaNs in the result, we delegate to a libcall
  582. // to carefully re-compute the correct infinity representation if
  583. // possible. The expectation is that the presence of NaNs here is
  584. // *extremely* rare, and so the cost of the libcall is almost irrelevant.
  585. // This is good, because the libcall re-computes the core multiplication
  586. // exactly the same as we do here and re-tests for NaNs in order to be
  587. // a generic complex*complex libcall.
  588. // First compute the four products.
  589. Value *AC = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul_ac");
  590. Value *BD = Builder.CreateFMul(Op.LHS.second, Op.RHS.second, "mul_bd");
  591. Value *AD = Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul_ad");
  592. Value *BC = Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul_bc");
  593. // The real part is the difference of the first two, the imaginary part is
  594. // the sum of the second.
  595. ResR = Builder.CreateFSub(AC, BD, "mul_r");
  596. ResI = Builder.CreateFAdd(AD, BC, "mul_i");
  597. // Emit the test for the real part becoming NaN and create a branch to
  598. // handle it. We test for NaN by comparing the number to itself.
  599. Value *IsRNaN = Builder.CreateFCmpUNO(ResR, ResR, "isnan_cmp");
  600. llvm::BasicBlock *ContBB = CGF.createBasicBlock("complex_mul_cont");
  601. llvm::BasicBlock *INaNBB = CGF.createBasicBlock("complex_mul_imag_nan");
  602. llvm::Instruction *Branch = Builder.CreateCondBr(IsRNaN, INaNBB, ContBB);
  603. llvm::BasicBlock *OrigBB = Branch->getParent();
  604. // Give hint that we very much don't expect to see NaNs.
  605. // Value chosen to match UR_NONTAKEN_WEIGHT, see BranchProbabilityInfo.cpp
  606. llvm::MDNode *BrWeight = MDHelper.createBranchWeights(1, (1U << 20) - 1);
  607. Branch->setMetadata(llvm::LLVMContext::MD_prof, BrWeight);
  608. // Now test the imaginary part and create its branch.
  609. CGF.EmitBlock(INaNBB);
  610. Value *IsINaN = Builder.CreateFCmpUNO(ResI, ResI, "isnan_cmp");
  611. llvm::BasicBlock *LibCallBB = CGF.createBasicBlock("complex_mul_libcall");
  612. Branch = Builder.CreateCondBr(IsINaN, LibCallBB, ContBB);
  613. Branch->setMetadata(llvm::LLVMContext::MD_prof, BrWeight);
  614. // Now emit the libcall on this slowest of the slow paths.
  615. CGF.EmitBlock(LibCallBB);
  616. Value *LibCallR, *LibCallI;
  617. std::tie(LibCallR, LibCallI) = EmitComplexBinOpLibCall(
  618. getComplexMultiplyLibCallName(Op.LHS.first->getType()), Op);
  619. Builder.CreateBr(ContBB);
  620. // Finally continue execution by phi-ing together the different
  621. // computation paths.
  622. CGF.EmitBlock(ContBB);
  623. llvm::PHINode *RealPHI = Builder.CreatePHI(ResR->getType(), 3, "real_mul_phi");
  624. RealPHI->addIncoming(ResR, OrigBB);
  625. RealPHI->addIncoming(ResR, INaNBB);
  626. RealPHI->addIncoming(LibCallR, LibCallBB);
  627. llvm::PHINode *ImagPHI = Builder.CreatePHI(ResI->getType(), 3, "imag_mul_phi");
  628. ImagPHI->addIncoming(ResI, OrigBB);
  629. ImagPHI->addIncoming(ResI, INaNBB);
  630. ImagPHI->addIncoming(LibCallI, LibCallBB);
  631. return ComplexPairTy(RealPHI, ImagPHI);
  632. }
  633. assert((Op.LHS.second || Op.RHS.second) &&
  634. "At least one operand must be complex!");
  635. // If either of the operands is a real rather than a complex, the
  636. // imaginary component is ignored when computing the real component of the
  637. // result.
  638. ResR = Builder.CreateFMul(Op.LHS.first, Op.RHS.first, "mul.rl");
  639. ResI = Op.LHS.second
  640. ? Builder.CreateFMul(Op.LHS.second, Op.RHS.first, "mul.il")
  641. : Builder.CreateFMul(Op.LHS.first, Op.RHS.second, "mul.ir");
  642. } else {
  643. assert(Op.LHS.second && Op.RHS.second &&
  644. "Both operands of integer complex operators must be complex!");
  645. Value *ResRl = Builder.CreateMul(Op.LHS.first, Op.RHS.first, "mul.rl");
  646. Value *ResRr = Builder.CreateMul(Op.LHS.second, Op.RHS.second, "mul.rr");
  647. ResR = Builder.CreateSub(ResRl, ResRr, "mul.r");
  648. Value *ResIl = Builder.CreateMul(Op.LHS.second, Op.RHS.first, "mul.il");
  649. Value *ResIr = Builder.CreateMul(Op.LHS.first, Op.RHS.second, "mul.ir");
  650. ResI = Builder.CreateAdd(ResIl, ResIr, "mul.i");
  651. }
  652. return ComplexPairTy(ResR, ResI);
  653. }
  654. // See C11 Annex G.5.1 for the semantics of multiplicative operators on complex
  655. // typed values.
  656. ComplexPairTy ComplexExprEmitter::EmitBinDiv(const BinOpInfo &Op) {
  657. llvm::Value *LHSr = Op.LHS.first, *LHSi = Op.LHS.second;
  658. llvm::Value *RHSr = Op.RHS.first, *RHSi = Op.RHS.second;
  659. llvm::Value *DSTr, *DSTi;
  660. if (LHSr->getType()->isFloatingPointTy()) {
  661. // If we have a complex operand on the RHS, we delegate to a libcall to
  662. // handle all of the complexities and minimize underflow/overflow cases.
  663. //
  664. // FIXME: We would be able to avoid the libcall in many places if we
  665. // supported imaginary types in addition to complex types.
  666. if (RHSi) {
  667. BinOpInfo LibCallOp = Op;
  668. // If LHS was a real, supply a null imaginary part.
  669. if (!LHSi)
  670. LibCallOp.LHS.second = llvm::Constant::getNullValue(LHSr->getType());
  671. StringRef LibCallName;
  672. switch (LHSr->getType()->getTypeID()) {
  673. default:
  674. llvm_unreachable("Unsupported floating point type!");
  675. case llvm::Type::HalfTyID:
  676. return EmitComplexBinOpLibCall("__divhc3", LibCallOp);
  677. case llvm::Type::FloatTyID:
  678. return EmitComplexBinOpLibCall("__divsc3", LibCallOp);
  679. case llvm::Type::DoubleTyID:
  680. return EmitComplexBinOpLibCall("__divdc3", LibCallOp);
  681. case llvm::Type::PPC_FP128TyID:
  682. return EmitComplexBinOpLibCall("__divtc3", LibCallOp);
  683. case llvm::Type::X86_FP80TyID:
  684. return EmitComplexBinOpLibCall("__divxc3", LibCallOp);
  685. case llvm::Type::FP128TyID:
  686. return EmitComplexBinOpLibCall("__divtc3", LibCallOp);
  687. }
  688. }
  689. assert(LHSi && "Can have at most one non-complex operand!");
  690. DSTr = Builder.CreateFDiv(LHSr, RHSr);
  691. DSTi = Builder.CreateFDiv(LHSi, RHSr);
  692. } else {
  693. assert(Op.LHS.second && Op.RHS.second &&
  694. "Both operands of integer complex operators must be complex!");
  695. // (a+ib) / (c+id) = ((ac+bd)/(cc+dd)) + i((bc-ad)/(cc+dd))
  696. llvm::Value *Tmp1 = Builder.CreateMul(LHSr, RHSr); // a*c
  697. llvm::Value *Tmp2 = Builder.CreateMul(LHSi, RHSi); // b*d
  698. llvm::Value *Tmp3 = Builder.CreateAdd(Tmp1, Tmp2); // ac+bd
  699. llvm::Value *Tmp4 = Builder.CreateMul(RHSr, RHSr); // c*c
  700. llvm::Value *Tmp5 = Builder.CreateMul(RHSi, RHSi); // d*d
  701. llvm::Value *Tmp6 = Builder.CreateAdd(Tmp4, Tmp5); // cc+dd
  702. llvm::Value *Tmp7 = Builder.CreateMul(LHSi, RHSr); // b*c
  703. llvm::Value *Tmp8 = Builder.CreateMul(LHSr, RHSi); // a*d
  704. llvm::Value *Tmp9 = Builder.CreateSub(Tmp7, Tmp8); // bc-ad
  705. if (Op.Ty->castAs<ComplexType>()->getElementType()->isUnsignedIntegerType()) {
  706. DSTr = Builder.CreateUDiv(Tmp3, Tmp6);
  707. DSTi = Builder.CreateUDiv(Tmp9, Tmp6);
  708. } else {
  709. DSTr = Builder.CreateSDiv(Tmp3, Tmp6);
  710. DSTi = Builder.CreateSDiv(Tmp9, Tmp6);
  711. }
  712. }
  713. return ComplexPairTy(DSTr, DSTi);
  714. }
  715. ComplexExprEmitter::BinOpInfo
  716. ComplexExprEmitter::EmitBinOps(const BinaryOperator *E) {
  717. TestAndClearIgnoreReal();
  718. TestAndClearIgnoreImag();
  719. BinOpInfo Ops;
  720. if (E->getLHS()->getType()->isRealFloatingType())
  721. Ops.LHS = ComplexPairTy(CGF.EmitScalarExpr(E->getLHS()), nullptr);
  722. else
  723. Ops.LHS = Visit(E->getLHS());
  724. if (E->getRHS()->getType()->isRealFloatingType())
  725. Ops.RHS = ComplexPairTy(CGF.EmitScalarExpr(E->getRHS()), nullptr);
  726. else
  727. Ops.RHS = Visit(E->getRHS());
  728. Ops.Ty = E->getType();
  729. return Ops;
  730. }
  731. LValue ComplexExprEmitter::
  732. EmitCompoundAssignLValue(const CompoundAssignOperator *E,
  733. ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&),
  734. RValue &Val) {
  735. TestAndClearIgnoreReal();
  736. TestAndClearIgnoreImag();
  737. QualType LHSTy = E->getLHS()->getType();
  738. if (const AtomicType *AT = LHSTy->getAs<AtomicType>())
  739. LHSTy = AT->getValueType();
  740. BinOpInfo OpInfo;
  741. // Load the RHS and LHS operands.
  742. // __block variables need to have the rhs evaluated first, plus this should
  743. // improve codegen a little.
  744. OpInfo.Ty = E->getComputationResultType();
  745. QualType ComplexElementTy = cast<ComplexType>(OpInfo.Ty)->getElementType();
  746. // The RHS should have been converted to the computation type.
  747. if (E->getRHS()->getType()->isRealFloatingType()) {
  748. assert(
  749. CGF.getContext()
  750. .hasSameUnqualifiedType(ComplexElementTy, E->getRHS()->getType()));
  751. OpInfo.RHS = ComplexPairTy(CGF.EmitScalarExpr(E->getRHS()), nullptr);
  752. } else {
  753. assert(CGF.getContext()
  754. .hasSameUnqualifiedType(OpInfo.Ty, E->getRHS()->getType()));
  755. OpInfo.RHS = Visit(E->getRHS());
  756. }
  757. LValue LHS = CGF.EmitLValue(E->getLHS());
  758. // Load from the l-value and convert it.
  759. if (LHSTy->isAnyComplexType()) {
  760. ComplexPairTy LHSVal = EmitLoadOfLValue(LHS, E->getExprLoc());
  761. OpInfo.LHS = EmitComplexToComplexCast(LHSVal, LHSTy, OpInfo.Ty);
  762. } else {
  763. llvm::Value *LHSVal = CGF.EmitLoadOfScalar(LHS, E->getExprLoc());
  764. // For floating point real operands we can directly pass the scalar form
  765. // to the binary operator emission and potentially get more efficient code.
  766. if (LHSTy->isRealFloatingType()) {
  767. if (!CGF.getContext().hasSameUnqualifiedType(ComplexElementTy, LHSTy))
  768. LHSVal = CGF.EmitScalarConversion(LHSVal, LHSTy, ComplexElementTy);
  769. OpInfo.LHS = ComplexPairTy(LHSVal, nullptr);
  770. } else {
  771. OpInfo.LHS = EmitScalarToComplexCast(LHSVal, LHSTy, OpInfo.Ty);
  772. }
  773. }
  774. // Expand the binary operator.
  775. ComplexPairTy Result = (this->*Func)(OpInfo);
  776. // Truncate the result and store it into the LHS lvalue.
  777. if (LHSTy->isAnyComplexType()) {
  778. ComplexPairTy ResVal = EmitComplexToComplexCast(Result, OpInfo.Ty, LHSTy);
  779. EmitStoreOfComplex(ResVal, LHS, /*isInit*/ false);
  780. Val = RValue::getComplex(ResVal);
  781. } else {
  782. llvm::Value *ResVal =
  783. CGF.EmitComplexToScalarConversion(Result, OpInfo.Ty, LHSTy);
  784. CGF.EmitStoreOfScalar(ResVal, LHS, /*isInit*/ false);
  785. Val = RValue::get(ResVal);
  786. }
  787. return LHS;
  788. }
  789. // Compound assignments.
  790. ComplexPairTy ComplexExprEmitter::
  791. EmitCompoundAssign(const CompoundAssignOperator *E,
  792. ComplexPairTy (ComplexExprEmitter::*Func)(const BinOpInfo&)){
  793. RValue Val;
  794. LValue LV = EmitCompoundAssignLValue(E, Func, Val);
  795. // The result of an assignment in C is the assigned r-value.
  796. if (!CGF.getLangOpts().CPlusPlus)
  797. return Val.getComplexVal();
  798. // If the lvalue is non-volatile, return the computed value of the assignment.
  799. if (!LV.isVolatileQualified())
  800. return Val.getComplexVal();
  801. return EmitLoadOfLValue(LV, E->getExprLoc());
  802. }
  803. LValue ComplexExprEmitter::EmitBinAssignLValue(const BinaryOperator *E,
  804. ComplexPairTy &Val) {
  805. assert(CGF.getContext().hasSameUnqualifiedType(E->getLHS()->getType(),
  806. E->getRHS()->getType()) &&
  807. "Invalid assignment");
  808. TestAndClearIgnoreReal();
  809. TestAndClearIgnoreImag();
  810. // Emit the RHS. __block variables need the RHS evaluated first.
  811. Val = Visit(E->getRHS());
  812. // Compute the address to store into.
  813. LValue LHS = CGF.EmitLValue(E->getLHS());
  814. // Store the result value into the LHS lvalue.
  815. EmitStoreOfComplex(Val, LHS, /*isInit*/ false);
  816. return LHS;
  817. }
  818. ComplexPairTy ComplexExprEmitter::VisitBinAssign(const BinaryOperator *E) {
  819. ComplexPairTy Val;
  820. LValue LV = EmitBinAssignLValue(E, Val);
  821. // The result of an assignment in C is the assigned r-value.
  822. if (!CGF.getLangOpts().CPlusPlus)
  823. return Val;
  824. // If the lvalue is non-volatile, return the computed value of the assignment.
  825. if (!LV.isVolatileQualified())
  826. return Val;
  827. return EmitLoadOfLValue(LV, E->getExprLoc());
  828. }
  829. ComplexPairTy ComplexExprEmitter::VisitBinComma(const BinaryOperator *E) {
  830. CGF.EmitIgnoredExpr(E->getLHS());
  831. return Visit(E->getRHS());
  832. }
  833. ComplexPairTy ComplexExprEmitter::
  834. VisitAbstractConditionalOperator(const AbstractConditionalOperator *E) {
  835. TestAndClearIgnoreReal();
  836. TestAndClearIgnoreImag();
  837. llvm::BasicBlock *LHSBlock = CGF.createBasicBlock("cond.true");
  838. llvm::BasicBlock *RHSBlock = CGF.createBasicBlock("cond.false");
  839. llvm::BasicBlock *ContBlock = CGF.createBasicBlock("cond.end");
  840. // Bind the common expression if necessary.
  841. CodeGenFunction::OpaqueValueMapping binding(CGF, E);
  842. CodeGenFunction::ConditionalEvaluation eval(CGF);
  843. CGF.EmitBranchOnBoolExpr(E->getCond(), LHSBlock, RHSBlock,
  844. CGF.getProfileCount(E));
  845. eval.begin(CGF);
  846. CGF.EmitBlock(LHSBlock);
  847. CGF.incrementProfileCounter(E);
  848. ComplexPairTy LHS = Visit(E->getTrueExpr());
  849. LHSBlock = Builder.GetInsertBlock();
  850. CGF.EmitBranch(ContBlock);
  851. eval.end(CGF);
  852. eval.begin(CGF);
  853. CGF.EmitBlock(RHSBlock);
  854. ComplexPairTy RHS = Visit(E->getFalseExpr());
  855. RHSBlock = Builder.GetInsertBlock();
  856. CGF.EmitBlock(ContBlock);
  857. eval.end(CGF);
  858. // Create a PHI node for the real part.
  859. llvm::PHINode *RealPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.r");
  860. RealPN->addIncoming(LHS.first, LHSBlock);
  861. RealPN->addIncoming(RHS.first, RHSBlock);
  862. // Create a PHI node for the imaginary part.
  863. llvm::PHINode *ImagPN = Builder.CreatePHI(LHS.first->getType(), 2, "cond.i");
  864. ImagPN->addIncoming(LHS.second, LHSBlock);
  865. ImagPN->addIncoming(RHS.second, RHSBlock);
  866. return ComplexPairTy(RealPN, ImagPN);
  867. }
  868. ComplexPairTy ComplexExprEmitter::VisitChooseExpr(ChooseExpr *E) {
  869. return Visit(E->getChosenSubExpr());
  870. }
  871. ComplexPairTy ComplexExprEmitter::VisitInitListExpr(InitListExpr *E) {
  872. bool Ignore = TestAndClearIgnoreReal();
  873. (void)Ignore;
  874. assert (Ignore == false && "init list ignored");
  875. Ignore = TestAndClearIgnoreImag();
  876. (void)Ignore;
  877. assert (Ignore == false && "init list ignored");
  878. if (E->getNumInits() == 2) {
  879. llvm::Value *Real = CGF.EmitScalarExpr(E->getInit(0));
  880. llvm::Value *Imag = CGF.EmitScalarExpr(E->getInit(1));
  881. return ComplexPairTy(Real, Imag);
  882. } else if (E->getNumInits() == 1) {
  883. return Visit(E->getInit(0));
  884. }
  885. // Empty init list intializes to null
  886. assert(E->getNumInits() == 0 && "Unexpected number of inits");
  887. QualType Ty = E->getType()->castAs<ComplexType>()->getElementType();
  888. llvm::Type* LTy = CGF.ConvertType(Ty);
  889. llvm::Value* zeroConstant = llvm::Constant::getNullValue(LTy);
  890. return ComplexPairTy(zeroConstant, zeroConstant);
  891. }
  892. ComplexPairTy ComplexExprEmitter::VisitVAArgExpr(VAArgExpr *E) {
  893. llvm::Value *ArgValue = CGF.EmitVAListRef(E->getSubExpr());
  894. llvm::Value *ArgPtr = CGF.EmitVAArg(ArgValue, E->getType());
  895. if (!ArgPtr) {
  896. CGF.ErrorUnsupported(E, "complex va_arg expression");
  897. llvm::Type *EltTy =
  898. CGF.ConvertType(E->getType()->castAs<ComplexType>()->getElementType());
  899. llvm::Value *U = llvm::UndefValue::get(EltTy);
  900. return ComplexPairTy(U, U);
  901. }
  902. return EmitLoadOfLValue(CGF.MakeNaturalAlignAddrLValue(ArgPtr, E->getType()),
  903. E->getExprLoc());
  904. }
  905. //===----------------------------------------------------------------------===//
  906. // Entry Point into this File
  907. //===----------------------------------------------------------------------===//
  908. /// EmitComplexExpr - Emit the computation of the specified expression of
  909. /// complex type, ignoring the result.
  910. ComplexPairTy CodeGenFunction::EmitComplexExpr(const Expr *E, bool IgnoreReal,
  911. bool IgnoreImag) {
  912. assert(E && getComplexType(E->getType()) &&
  913. "Invalid complex expression to emit");
  914. return ComplexExprEmitter(*this, IgnoreReal, IgnoreImag)
  915. .Visit(const_cast<Expr *>(E));
  916. }
  917. void CodeGenFunction::EmitComplexExprIntoLValue(const Expr *E, LValue dest,
  918. bool isInit) {
  919. assert(E && getComplexType(E->getType()) &&
  920. "Invalid complex expression to emit");
  921. ComplexExprEmitter Emitter(*this);
  922. ComplexPairTy Val = Emitter.Visit(const_cast<Expr*>(E));
  923. Emitter.EmitStoreOfComplex(Val, dest, isInit);
  924. }
  925. /// EmitStoreOfComplex - Store a complex number into the specified l-value.
  926. void CodeGenFunction::EmitStoreOfComplex(ComplexPairTy V, LValue dest,
  927. bool isInit) {
  928. ComplexExprEmitter(*this).EmitStoreOfComplex(V, dest, isInit);
  929. }
  930. /// EmitLoadOfComplex - Load a complex number from the specified address.
  931. ComplexPairTy CodeGenFunction::EmitLoadOfComplex(LValue src,
  932. SourceLocation loc) {
  933. return ComplexExprEmitter(*this).EmitLoadOfLValue(src, loc);
  934. }
  935. LValue CodeGenFunction::EmitComplexAssignmentLValue(const BinaryOperator *E) {
  936. assert(E->getOpcode() == BO_Assign);
  937. ComplexPairTy Val; // ignored
  938. return ComplexExprEmitter(*this).EmitBinAssignLValue(E, Val);
  939. }
  940. typedef ComplexPairTy (ComplexExprEmitter::*CompoundFunc)(
  941. const ComplexExprEmitter::BinOpInfo &);
  942. static CompoundFunc getComplexOp(BinaryOperatorKind Op) {
  943. switch (Op) {
  944. case BO_MulAssign: return &ComplexExprEmitter::EmitBinMul;
  945. case BO_DivAssign: return &ComplexExprEmitter::EmitBinDiv;
  946. case BO_SubAssign: return &ComplexExprEmitter::EmitBinSub;
  947. case BO_AddAssign: return &ComplexExprEmitter::EmitBinAdd;
  948. default:
  949. llvm_unreachable("unexpected complex compound assignment");
  950. }
  951. }
  952. LValue CodeGenFunction::
  953. EmitComplexCompoundAssignmentLValue(const CompoundAssignOperator *E) {
  954. CompoundFunc Op = getComplexOp(E->getOpcode());
  955. RValue Val;
  956. return ComplexExprEmitter(*this).EmitCompoundAssignLValue(E, Op, Val);
  957. }
  958. LValue CodeGenFunction::
  959. EmitScalarCompoundAssignWithComplex(const CompoundAssignOperator *E,
  960. llvm::Value *&Result) {
  961. CompoundFunc Op = getComplexOp(E->getOpcode());
  962. RValue Val;
  963. LValue Ret = ComplexExprEmitter(*this).EmitCompoundAssignLValue(E, Op, Val);
  964. Result = Val.getScalarVal();
  965. return Ret;
  966. }