CGExprComplex.cpp 52 KB

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