CGExprComplex.cpp 44 KB

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