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