CGExprComplex.cpp 44 KB

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