CGExprComplex.cpp 44 KB

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