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