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