1 //===- llvm/IRBuilder.h - Builder for LLVM Instructions ---------*- C++ -*-===// 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 file defines the IRBuilder class, which is used as a convenient way 10 // to create LLVM instructions with a consistent and simplified interface. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_IR_IRBUILDER_H 15 #define LLVM_IR_IRBUILDER_H 16 17 #include "llvm-c/Types.h" 18 #include "llvm/ADT/ArrayRef.h" 19 #include "llvm/ADT/None.h" 20 #include "llvm/ADT/STLExtras.h" 21 #include "llvm/ADT/StringRef.h" 22 #include "llvm/ADT/Twine.h" 23 #include "llvm/IR/BasicBlock.h" 24 #include "llvm/IR/Constant.h" 25 #include "llvm/IR/ConstantFolder.h" 26 #include "llvm/IR/Constants.h" 27 #include "llvm/IR/DataLayout.h" 28 #include "llvm/IR/DebugInfoMetadata.h" 29 #include "llvm/IR/DebugLoc.h" 30 #include "llvm/IR/DerivedTypes.h" 31 #include "llvm/IR/Function.h" 32 #include "llvm/IR/GlobalVariable.h" 33 #include "llvm/IR/InstrTypes.h" 34 #include "llvm/IR/Instruction.h" 35 #include "llvm/IR/Instructions.h" 36 #include "llvm/IR/IntrinsicInst.h" 37 #include "llvm/IR/LLVMContext.h" 38 #include "llvm/IR/Module.h" 39 #include "llvm/IR/Operator.h" 40 #include "llvm/IR/Type.h" 41 #include "llvm/IR/Value.h" 42 #include "llvm/IR/ValueHandle.h" 43 #include "llvm/Support/AtomicOrdering.h" 44 #include "llvm/Support/CBindingWrapping.h" 45 #include "llvm/Support/Casting.h" 46 #include <cassert> 47 #include <cstddef> 48 #include <cstdint> 49 #include <functional> 50 #include <utility> 51 52 namespace llvm { 53 54 class APInt; 55 class MDNode; 56 class Use; 57 58 /// This provides the default implementation of the IRBuilder 59 /// 'InsertHelper' method that is called whenever an instruction is created by 60 /// IRBuilder and needs to be inserted. 61 /// 62 /// By default, this inserts the instruction at the insertion point. 63 class IRBuilderDefaultInserter { 64 public: 65 virtual ~IRBuilderDefaultInserter(); 66 InsertHelper(Instruction * I,const Twine & Name,BasicBlock * BB,BasicBlock::iterator InsertPt)67 virtual void InsertHelper(Instruction *I, const Twine &Name, 68 BasicBlock *BB, 69 BasicBlock::iterator InsertPt) const { 70 if (BB) BB->getInstList().insert(InsertPt, I); 71 I->setName(Name); 72 } 73 }; 74 75 /// Provides an 'InsertHelper' that calls a user-provided callback after 76 /// performing the default insertion. 77 class IRBuilderCallbackInserter : public IRBuilderDefaultInserter { 78 std::function<void(Instruction *)> Callback; 79 80 public: 81 virtual ~IRBuilderCallbackInserter(); 82 IRBuilderCallbackInserter(std::function<void (Instruction *)> Callback)83 IRBuilderCallbackInserter(std::function<void(Instruction *)> Callback) 84 : Callback(std::move(Callback)) {} 85 InsertHelper(Instruction * I,const Twine & Name,BasicBlock * BB,BasicBlock::iterator InsertPt)86 void InsertHelper(Instruction *I, const Twine &Name, 87 BasicBlock *BB, 88 BasicBlock::iterator InsertPt) const override { 89 IRBuilderDefaultInserter::InsertHelper(I, Name, BB, InsertPt); 90 Callback(I); 91 } 92 }; 93 94 /// Common base class shared among various IRBuilders. 95 class IRBuilderBase { 96 /// Pairs of (metadata kind, MDNode *) that should be added to all newly 97 /// created instructions, like !dbg metadata. 98 SmallVector<std::pair<unsigned, MDNode *>, 2> MetadataToCopy; 99 100 /// Add or update the an entry (Kind, MD) to MetadataToCopy, if \p MD is not 101 /// null. If \p MD is null, remove the entry with \p Kind. AddOrRemoveMetadataToCopy(unsigned Kind,MDNode * MD)102 void AddOrRemoveMetadataToCopy(unsigned Kind, MDNode *MD) { 103 if (!MD) { 104 erase_if(MetadataToCopy, [Kind](const std::pair<unsigned, MDNode *> &KV) { 105 return KV.first == Kind; 106 }); 107 return; 108 } 109 110 for (auto &KV : MetadataToCopy) 111 if (KV.first == Kind) { 112 KV.second = MD; 113 return; 114 } 115 116 MetadataToCopy.emplace_back(Kind, MD); 117 } 118 119 protected: 120 BasicBlock *BB; 121 BasicBlock::iterator InsertPt; 122 LLVMContext &Context; 123 const IRBuilderFolder &Folder; 124 const IRBuilderDefaultInserter &Inserter; 125 126 MDNode *DefaultFPMathTag; 127 FastMathFlags FMF; 128 129 bool IsFPConstrained; 130 fp::ExceptionBehavior DefaultConstrainedExcept; 131 RoundingMode DefaultConstrainedRounding; 132 133 ArrayRef<OperandBundleDef> DefaultOperandBundles; 134 135 public: IRBuilderBase(LLVMContext & context,const IRBuilderFolder & Folder,const IRBuilderDefaultInserter & Inserter,MDNode * FPMathTag,ArrayRef<OperandBundleDef> OpBundles)136 IRBuilderBase(LLVMContext &context, const IRBuilderFolder &Folder, 137 const IRBuilderDefaultInserter &Inserter, 138 MDNode *FPMathTag, ArrayRef<OperandBundleDef> OpBundles) 139 : Context(context), Folder(Folder), Inserter(Inserter), 140 DefaultFPMathTag(FPMathTag), IsFPConstrained(false), 141 DefaultConstrainedExcept(fp::ebStrict), 142 DefaultConstrainedRounding(RoundingMode::Dynamic), 143 DefaultOperandBundles(OpBundles) { 144 ClearInsertionPoint(); 145 } 146 147 /// Insert and return the specified instruction. 148 template<typename InstTy> 149 InstTy *Insert(InstTy *I, const Twine &Name = "") const { 150 Inserter.InsertHelper(I, Name, BB, InsertPt); 151 AddMetadataToInst(I); 152 return I; 153 } 154 155 /// No-op overload to handle constants. 156 Constant *Insert(Constant *C, const Twine& = "") const { 157 return C; 158 } 159 160 Value *Insert(Value *V, const Twine &Name = "") const { 161 if (Instruction *I = dyn_cast<Instruction>(V)) 162 return Insert(I, Name); 163 assert(isa<Constant>(V)); 164 return V; 165 } 166 167 //===--------------------------------------------------------------------===// 168 // Builder configuration methods 169 //===--------------------------------------------------------------------===// 170 171 /// Clear the insertion point: created instructions will not be 172 /// inserted into a block. ClearInsertionPoint()173 void ClearInsertionPoint() { 174 BB = nullptr; 175 InsertPt = BasicBlock::iterator(); 176 } 177 GetInsertBlock()178 BasicBlock *GetInsertBlock() const { return BB; } GetInsertPoint()179 BasicBlock::iterator GetInsertPoint() const { return InsertPt; } getContext()180 LLVMContext &getContext() const { return Context; } 181 182 /// This specifies that created instructions should be appended to the 183 /// end of the specified block. SetInsertPoint(BasicBlock * TheBB)184 void SetInsertPoint(BasicBlock *TheBB) { 185 BB = TheBB; 186 InsertPt = BB->end(); 187 } 188 189 /// This specifies that created instructions should be inserted before 190 /// the specified instruction. SetInsertPoint(Instruction * I)191 void SetInsertPoint(Instruction *I) { 192 BB = I->getParent(); 193 InsertPt = I->getIterator(); 194 assert(InsertPt != BB->end() && "Can't read debug loc from end()"); 195 SetCurrentDebugLocation(I->getDebugLoc()); 196 } 197 198 /// This specifies that created instructions should be inserted at the 199 /// specified point. SetInsertPoint(BasicBlock * TheBB,BasicBlock::iterator IP)200 void SetInsertPoint(BasicBlock *TheBB, BasicBlock::iterator IP) { 201 BB = TheBB; 202 InsertPt = IP; 203 if (IP != TheBB->end()) 204 SetCurrentDebugLocation(IP->getDebugLoc()); 205 } 206 207 /// Set location information used by debugging information. SetCurrentDebugLocation(DebugLoc L)208 void SetCurrentDebugLocation(DebugLoc L) { 209 AddOrRemoveMetadataToCopy(LLVMContext::MD_dbg, L.getAsMDNode()); 210 } 211 212 /// Collect metadata with IDs \p MetadataKinds from \p Src which should be 213 /// added to all created instructions. Entries present in MedataDataToCopy but 214 /// not on \p Src will be dropped from MetadataToCopy. CollectMetadataToCopy(Instruction * Src,ArrayRef<unsigned> MetadataKinds)215 void CollectMetadataToCopy(Instruction *Src, 216 ArrayRef<unsigned> MetadataKinds) { 217 for (unsigned K : MetadataKinds) 218 AddOrRemoveMetadataToCopy(K, Src->getMetadata(K)); 219 } 220 221 /// Get location information used by debugging information. getCurrentDebugLocation()222 DebugLoc getCurrentDebugLocation() const { 223 for (auto &KV : MetadataToCopy) 224 if (KV.first == LLVMContext::MD_dbg) 225 return {cast<DILocation>(KV.second)}; 226 227 return {}; 228 } 229 230 /// If this builder has a current debug location, set it on the 231 /// specified instruction. SetInstDebugLocation(Instruction * I)232 void SetInstDebugLocation(Instruction *I) const { 233 for (const auto &KV : MetadataToCopy) 234 if (KV.first == LLVMContext::MD_dbg) { 235 I->setDebugLoc(DebugLoc(KV.second)); 236 return; 237 } 238 } 239 240 /// Add all entries in MetadataToCopy to \p I. AddMetadataToInst(Instruction * I)241 void AddMetadataToInst(Instruction *I) const { 242 for (auto &KV : MetadataToCopy) 243 I->setMetadata(KV.first, KV.second); 244 } 245 246 /// Get the return type of the current function that we're emitting 247 /// into. 248 Type *getCurrentFunctionReturnType() const; 249 250 /// InsertPoint - A saved insertion point. 251 class InsertPoint { 252 BasicBlock *Block = nullptr; 253 BasicBlock::iterator Point; 254 255 public: 256 /// Creates a new insertion point which doesn't point to anything. 257 InsertPoint() = default; 258 259 /// Creates a new insertion point at the given location. InsertPoint(BasicBlock * InsertBlock,BasicBlock::iterator InsertPoint)260 InsertPoint(BasicBlock *InsertBlock, BasicBlock::iterator InsertPoint) 261 : Block(InsertBlock), Point(InsertPoint) {} 262 263 /// Returns true if this insert point is set. isSet()264 bool isSet() const { return (Block != nullptr); } 265 getBlock()266 BasicBlock *getBlock() const { return Block; } getPoint()267 BasicBlock::iterator getPoint() const { return Point; } 268 }; 269 270 /// Returns the current insert point. saveIP()271 InsertPoint saveIP() const { 272 return InsertPoint(GetInsertBlock(), GetInsertPoint()); 273 } 274 275 /// Returns the current insert point, clearing it in the process. saveAndClearIP()276 InsertPoint saveAndClearIP() { 277 InsertPoint IP(GetInsertBlock(), GetInsertPoint()); 278 ClearInsertionPoint(); 279 return IP; 280 } 281 282 /// Sets the current insert point to a previously-saved location. restoreIP(InsertPoint IP)283 void restoreIP(InsertPoint IP) { 284 if (IP.isSet()) 285 SetInsertPoint(IP.getBlock(), IP.getPoint()); 286 else 287 ClearInsertionPoint(); 288 } 289 290 /// Get the floating point math metadata being used. getDefaultFPMathTag()291 MDNode *getDefaultFPMathTag() const { return DefaultFPMathTag; } 292 293 /// Get the flags to be applied to created floating point ops getFastMathFlags()294 FastMathFlags getFastMathFlags() const { return FMF; } 295 getFastMathFlags()296 FastMathFlags &getFastMathFlags() { return FMF; } 297 298 /// Clear the fast-math flags. clearFastMathFlags()299 void clearFastMathFlags() { FMF.clear(); } 300 301 /// Set the floating point math metadata to be used. setDefaultFPMathTag(MDNode * FPMathTag)302 void setDefaultFPMathTag(MDNode *FPMathTag) { DefaultFPMathTag = FPMathTag; } 303 304 /// Set the fast-math flags to be used with generated fp-math operators setFastMathFlags(FastMathFlags NewFMF)305 void setFastMathFlags(FastMathFlags NewFMF) { FMF = NewFMF; } 306 307 /// Enable/Disable use of constrained floating point math. When 308 /// enabled the CreateF<op>() calls instead create constrained 309 /// floating point intrinsic calls. Fast math flags are unaffected 310 /// by this setting. setIsFPConstrained(bool IsCon)311 void setIsFPConstrained(bool IsCon) { IsFPConstrained = IsCon; } 312 313 /// Query for the use of constrained floating point math getIsFPConstrained()314 bool getIsFPConstrained() { return IsFPConstrained; } 315 316 /// Set the exception handling to be used with constrained floating point setDefaultConstrainedExcept(fp::ExceptionBehavior NewExcept)317 void setDefaultConstrainedExcept(fp::ExceptionBehavior NewExcept) { 318 #ifndef NDEBUG 319 Optional<StringRef> ExceptStr = ExceptionBehaviorToStr(NewExcept); 320 assert(ExceptStr.hasValue() && "Garbage strict exception behavior!"); 321 #endif 322 DefaultConstrainedExcept = NewExcept; 323 } 324 325 /// Set the rounding mode handling to be used with constrained floating point setDefaultConstrainedRounding(RoundingMode NewRounding)326 void setDefaultConstrainedRounding(RoundingMode NewRounding) { 327 #ifndef NDEBUG 328 Optional<StringRef> RoundingStr = RoundingModeToStr(NewRounding); 329 assert(RoundingStr.hasValue() && "Garbage strict rounding mode!"); 330 #endif 331 DefaultConstrainedRounding = NewRounding; 332 } 333 334 /// Get the exception handling used with constrained floating point getDefaultConstrainedExcept()335 fp::ExceptionBehavior getDefaultConstrainedExcept() { 336 return DefaultConstrainedExcept; 337 } 338 339 /// Get the rounding mode handling used with constrained floating point getDefaultConstrainedRounding()340 RoundingMode getDefaultConstrainedRounding() { 341 return DefaultConstrainedRounding; 342 } 343 setConstrainedFPFunctionAttr()344 void setConstrainedFPFunctionAttr() { 345 assert(BB && "Must have a basic block to set any function attributes!"); 346 347 Function *F = BB->getParent(); 348 if (!F->hasFnAttribute(Attribute::StrictFP)) { 349 F->addFnAttr(Attribute::StrictFP); 350 } 351 } 352 setConstrainedFPCallAttr(CallBase * I)353 void setConstrainedFPCallAttr(CallBase *I) { 354 I->addAttribute(AttributeList::FunctionIndex, Attribute::StrictFP); 355 } 356 setDefaultOperandBundles(ArrayRef<OperandBundleDef> OpBundles)357 void setDefaultOperandBundles(ArrayRef<OperandBundleDef> OpBundles) { 358 DefaultOperandBundles = OpBundles; 359 } 360 361 //===--------------------------------------------------------------------===// 362 // RAII helpers. 363 //===--------------------------------------------------------------------===// 364 365 // RAII object that stores the current insertion point and restores it 366 // when the object is destroyed. This includes the debug location. 367 class InsertPointGuard { 368 IRBuilderBase &Builder; 369 AssertingVH<BasicBlock> Block; 370 BasicBlock::iterator Point; 371 DebugLoc DbgLoc; 372 373 public: InsertPointGuard(IRBuilderBase & B)374 InsertPointGuard(IRBuilderBase &B) 375 : Builder(B), Block(B.GetInsertBlock()), Point(B.GetInsertPoint()), 376 DbgLoc(B.getCurrentDebugLocation()) {} 377 378 InsertPointGuard(const InsertPointGuard &) = delete; 379 InsertPointGuard &operator=(const InsertPointGuard &) = delete; 380 ~InsertPointGuard()381 ~InsertPointGuard() { 382 Builder.restoreIP(InsertPoint(Block, Point)); 383 Builder.SetCurrentDebugLocation(DbgLoc); 384 } 385 }; 386 387 // RAII object that stores the current fast math settings and restores 388 // them when the object is destroyed. 389 class FastMathFlagGuard { 390 IRBuilderBase &Builder; 391 FastMathFlags FMF; 392 MDNode *FPMathTag; 393 bool IsFPConstrained; 394 fp::ExceptionBehavior DefaultConstrainedExcept; 395 RoundingMode DefaultConstrainedRounding; 396 397 public: FastMathFlagGuard(IRBuilderBase & B)398 FastMathFlagGuard(IRBuilderBase &B) 399 : Builder(B), FMF(B.FMF), FPMathTag(B.DefaultFPMathTag), 400 IsFPConstrained(B.IsFPConstrained), 401 DefaultConstrainedExcept(B.DefaultConstrainedExcept), 402 DefaultConstrainedRounding(B.DefaultConstrainedRounding) {} 403 404 FastMathFlagGuard(const FastMathFlagGuard &) = delete; 405 FastMathFlagGuard &operator=(const FastMathFlagGuard &) = delete; 406 ~FastMathFlagGuard()407 ~FastMathFlagGuard() { 408 Builder.FMF = FMF; 409 Builder.DefaultFPMathTag = FPMathTag; 410 Builder.IsFPConstrained = IsFPConstrained; 411 Builder.DefaultConstrainedExcept = DefaultConstrainedExcept; 412 Builder.DefaultConstrainedRounding = DefaultConstrainedRounding; 413 } 414 }; 415 416 // RAII object that stores the current default operand bundles and restores 417 // them when the object is destroyed. 418 class OperandBundlesGuard { 419 IRBuilderBase &Builder; 420 ArrayRef<OperandBundleDef> DefaultOperandBundles; 421 422 public: OperandBundlesGuard(IRBuilderBase & B)423 OperandBundlesGuard(IRBuilderBase &B) 424 : Builder(B), DefaultOperandBundles(B.DefaultOperandBundles) {} 425 426 OperandBundlesGuard(const OperandBundlesGuard &) = delete; 427 OperandBundlesGuard &operator=(const OperandBundlesGuard &) = delete; 428 ~OperandBundlesGuard()429 ~OperandBundlesGuard() { 430 Builder.DefaultOperandBundles = DefaultOperandBundles; 431 } 432 }; 433 434 435 //===--------------------------------------------------------------------===// 436 // Miscellaneous creation methods. 437 //===--------------------------------------------------------------------===// 438 439 /// Make a new global variable with initializer type i8* 440 /// 441 /// Make a new global variable with an initializer that has array of i8 type 442 /// filled in with the null terminated string value specified. The new global 443 /// variable will be marked mergable with any others of the same contents. If 444 /// Name is specified, it is the name of the global variable created. 445 /// 446 /// If no module is given via \p M, it is take from the insertion point basic 447 /// block. 448 GlobalVariable *CreateGlobalString(StringRef Str, const Twine &Name = "", 449 unsigned AddressSpace = 0, 450 Module *M = nullptr); 451 452 /// Get a constant value representing either true or false. getInt1(bool V)453 ConstantInt *getInt1(bool V) { 454 return ConstantInt::get(getInt1Ty(), V); 455 } 456 457 /// Get the constant value for i1 true. getTrue()458 ConstantInt *getTrue() { 459 return ConstantInt::getTrue(Context); 460 } 461 462 /// Get the constant value for i1 false. getFalse()463 ConstantInt *getFalse() { 464 return ConstantInt::getFalse(Context); 465 } 466 467 /// Get a constant 8-bit value. getInt8(uint8_t C)468 ConstantInt *getInt8(uint8_t C) { 469 return ConstantInt::get(getInt8Ty(), C); 470 } 471 472 /// Get a constant 16-bit value. getInt16(uint16_t C)473 ConstantInt *getInt16(uint16_t C) { 474 return ConstantInt::get(getInt16Ty(), C); 475 } 476 477 /// Get a constant 32-bit value. getInt32(uint32_t C)478 ConstantInt *getInt32(uint32_t C) { 479 return ConstantInt::get(getInt32Ty(), C); 480 } 481 482 /// Get a constant 64-bit value. getInt64(uint64_t C)483 ConstantInt *getInt64(uint64_t C) { 484 return ConstantInt::get(getInt64Ty(), C); 485 } 486 487 /// Get a constant N-bit value, zero extended or truncated from 488 /// a 64-bit value. getIntN(unsigned N,uint64_t C)489 ConstantInt *getIntN(unsigned N, uint64_t C) { 490 return ConstantInt::get(getIntNTy(N), C); 491 } 492 493 /// Get a constant integer value. getInt(const APInt & AI)494 ConstantInt *getInt(const APInt &AI) { 495 return ConstantInt::get(Context, AI); 496 } 497 498 //===--------------------------------------------------------------------===// 499 // Type creation methods 500 //===--------------------------------------------------------------------===// 501 502 /// Fetch the type representing a single bit getInt1Ty()503 IntegerType *getInt1Ty() { 504 return Type::getInt1Ty(Context); 505 } 506 507 /// Fetch the type representing an 8-bit integer. getInt8Ty()508 IntegerType *getInt8Ty() { 509 return Type::getInt8Ty(Context); 510 } 511 512 /// Fetch the type representing a 16-bit integer. getInt16Ty()513 IntegerType *getInt16Ty() { 514 return Type::getInt16Ty(Context); 515 } 516 517 /// Fetch the type representing a 32-bit integer. getInt32Ty()518 IntegerType *getInt32Ty() { 519 return Type::getInt32Ty(Context); 520 } 521 522 /// Fetch the type representing a 64-bit integer. getInt64Ty()523 IntegerType *getInt64Ty() { 524 return Type::getInt64Ty(Context); 525 } 526 527 /// Fetch the type representing a 128-bit integer. getInt128Ty()528 IntegerType *getInt128Ty() { return Type::getInt128Ty(Context); } 529 530 /// Fetch the type representing an N-bit integer. getIntNTy(unsigned N)531 IntegerType *getIntNTy(unsigned N) { 532 return Type::getIntNTy(Context, N); 533 } 534 535 /// Fetch the type representing a 16-bit floating point value. getHalfTy()536 Type *getHalfTy() { 537 return Type::getHalfTy(Context); 538 } 539 540 /// Fetch the type representing a 16-bit brain floating point value. getBFloatTy()541 Type *getBFloatTy() { 542 return Type::getBFloatTy(Context); 543 } 544 545 /// Fetch the type representing a 32-bit floating point value. getFloatTy()546 Type *getFloatTy() { 547 return Type::getFloatTy(Context); 548 } 549 550 /// Fetch the type representing a 64-bit floating point value. getDoubleTy()551 Type *getDoubleTy() { 552 return Type::getDoubleTy(Context); 553 } 554 555 /// Fetch the type representing void. getVoidTy()556 Type *getVoidTy() { 557 return Type::getVoidTy(Context); 558 } 559 560 /// Fetch the type representing a pointer to an 8-bit integer value. 561 PointerType *getInt8PtrTy(unsigned AddrSpace = 0) { 562 return Type::getInt8PtrTy(Context, AddrSpace); 563 } 564 565 /// Fetch the type representing a pointer to an integer value. 566 IntegerType *getIntPtrTy(const DataLayout &DL, unsigned AddrSpace = 0) { 567 return DL.getIntPtrType(Context, AddrSpace); 568 } 569 570 //===--------------------------------------------------------------------===// 571 // Intrinsic creation methods 572 //===--------------------------------------------------------------------===// 573 574 /// Create and insert a memset to the specified pointer and the 575 /// specified value. 576 /// 577 /// If the pointer isn't an i8*, it will be converted. If a TBAA tag is 578 /// specified, it will be added to the instruction. Likewise with alias.scope 579 /// and noalias tags. 580 CallInst *CreateMemSet(Value *Ptr, Value *Val, uint64_t Size, 581 MaybeAlign Align, bool isVolatile = false, 582 MDNode *TBAATag = nullptr, MDNode *ScopeTag = nullptr, 583 MDNode *NoAliasTag = nullptr) { 584 return CreateMemSet(Ptr, Val, getInt64(Size), Align, isVolatile, 585 TBAATag, ScopeTag, NoAliasTag); 586 } 587 588 CallInst *CreateMemSet(Value *Ptr, Value *Val, Value *Size, MaybeAlign Align, 589 bool isVolatile = false, MDNode *TBAATag = nullptr, 590 MDNode *ScopeTag = nullptr, 591 MDNode *NoAliasTag = nullptr); 592 593 /// Create and insert an element unordered-atomic memset of the region of 594 /// memory starting at the given pointer to the given value. 595 /// 596 /// If the pointer isn't an i8*, it will be converted. If a TBAA tag is 597 /// specified, it will be added to the instruction. Likewise with alias.scope 598 /// and noalias tags. 599 CallInst *CreateElementUnorderedAtomicMemSet(Value *Ptr, Value *Val, 600 uint64_t Size, Align Alignment, 601 uint32_t ElementSize, 602 MDNode *TBAATag = nullptr, 603 MDNode *ScopeTag = nullptr, 604 MDNode *NoAliasTag = nullptr) { 605 return CreateElementUnorderedAtomicMemSet(Ptr, Val, getInt64(Size), 606 Align(Alignment), ElementSize, 607 TBAATag, ScopeTag, NoAliasTag); 608 } 609 610 CallInst *CreateElementUnorderedAtomicMemSet(Value *Ptr, Value *Val, 611 Value *Size, Align Alignment, 612 uint32_t ElementSize, 613 MDNode *TBAATag = nullptr, 614 MDNode *ScopeTag = nullptr, 615 MDNode *NoAliasTag = nullptr); 616 617 /// Create and insert a memcpy between the specified pointers. 618 /// 619 /// If the pointers aren't i8*, they will be converted. If a TBAA tag is 620 /// specified, it will be added to the instruction. Likewise with alias.scope 621 /// and noalias tags. 622 CallInst *CreateMemCpy(Value *Dst, MaybeAlign DstAlign, Value *Src, 623 MaybeAlign SrcAlign, uint64_t Size, 624 bool isVolatile = false, MDNode *TBAATag = nullptr, 625 MDNode *TBAAStructTag = nullptr, 626 MDNode *ScopeTag = nullptr, 627 MDNode *NoAliasTag = nullptr) { 628 return CreateMemCpy(Dst, DstAlign, Src, SrcAlign, getInt64(Size), 629 isVolatile, TBAATag, TBAAStructTag, ScopeTag, 630 NoAliasTag); 631 } 632 633 CallInst *CreateMemTransferInst( 634 Intrinsic::ID IntrID, Value *Dst, MaybeAlign DstAlign, Value *Src, 635 MaybeAlign SrcAlign, Value *Size, bool isVolatile = false, 636 MDNode *TBAATag = nullptr, MDNode *TBAAStructTag = nullptr, 637 MDNode *ScopeTag = nullptr, MDNode *NoAliasTag = nullptr); 638 639 CallInst *CreateMemCpy(Value *Dst, MaybeAlign DstAlign, Value *Src, 640 MaybeAlign SrcAlign, Value *Size, 641 bool isVolatile = false, MDNode *TBAATag = nullptr, 642 MDNode *TBAAStructTag = nullptr, 643 MDNode *ScopeTag = nullptr, 644 MDNode *NoAliasTag = nullptr) { 645 return CreateMemTransferInst(Intrinsic::memcpy, Dst, DstAlign, Src, 646 SrcAlign, Size, isVolatile, TBAATag, 647 TBAAStructTag, ScopeTag, NoAliasTag); 648 } 649 650 CallInst * 651 CreateMemCpyInline(Value *Dst, MaybeAlign DstAlign, Value *Src, 652 MaybeAlign SrcAlign, Value *Size, bool IsVolatile = false, 653 MDNode *TBAATag = nullptr, MDNode *TBAAStructTag = nullptr, 654 MDNode *ScopeTag = nullptr, MDNode *NoAliasTag = nullptr); 655 656 /// Create and insert an element unordered-atomic memcpy between the 657 /// specified pointers. 658 /// 659 /// DstAlign/SrcAlign are the alignments of the Dst/Src pointers, respectively. 660 /// 661 /// If the pointers aren't i8*, they will be converted. If a TBAA tag is 662 /// specified, it will be added to the instruction. Likewise with alias.scope 663 /// and noalias tags. 664 CallInst *CreateElementUnorderedAtomicMemCpy( 665 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size, 666 uint32_t ElementSize, MDNode *TBAATag = nullptr, 667 MDNode *TBAAStructTag = nullptr, MDNode *ScopeTag = nullptr, 668 MDNode *NoAliasTag = nullptr); 669 670 CallInst *CreateMemMove(Value *Dst, MaybeAlign DstAlign, Value *Src, 671 MaybeAlign SrcAlign, uint64_t Size, 672 bool isVolatile = false, MDNode *TBAATag = nullptr, 673 MDNode *ScopeTag = nullptr, 674 MDNode *NoAliasTag = nullptr) { 675 return CreateMemMove(Dst, DstAlign, Src, SrcAlign, getInt64(Size), 676 isVolatile, TBAATag, ScopeTag, NoAliasTag); 677 } 678 679 CallInst *CreateMemMove(Value *Dst, MaybeAlign DstAlign, Value *Src, 680 MaybeAlign SrcAlign, Value *Size, 681 bool isVolatile = false, MDNode *TBAATag = nullptr, 682 MDNode *ScopeTag = nullptr, 683 MDNode *NoAliasTag = nullptr); 684 685 /// \brief Create and insert an element unordered-atomic memmove between the 686 /// specified pointers. 687 /// 688 /// DstAlign/SrcAlign are the alignments of the Dst/Src pointers, 689 /// respectively. 690 /// 691 /// If the pointers aren't i8*, they will be converted. If a TBAA tag is 692 /// specified, it will be added to the instruction. Likewise with alias.scope 693 /// and noalias tags. 694 CallInst *CreateElementUnorderedAtomicMemMove( 695 Value *Dst, Align DstAlign, Value *Src, Align SrcAlign, Value *Size, 696 uint32_t ElementSize, MDNode *TBAATag = nullptr, 697 MDNode *TBAAStructTag = nullptr, MDNode *ScopeTag = nullptr, 698 MDNode *NoAliasTag = nullptr); 699 700 /// Create a vector fadd reduction intrinsic of the source vector. 701 /// The first parameter is a scalar accumulator value for ordered reductions. 702 CallInst *CreateFAddReduce(Value *Acc, Value *Src); 703 704 /// Create a vector fmul reduction intrinsic of the source vector. 705 /// The first parameter is a scalar accumulator value for ordered reductions. 706 CallInst *CreateFMulReduce(Value *Acc, Value *Src); 707 708 /// Create a vector int add reduction intrinsic of the source vector. 709 CallInst *CreateAddReduce(Value *Src); 710 711 /// Create a vector int mul reduction intrinsic of the source vector. 712 CallInst *CreateMulReduce(Value *Src); 713 714 /// Create a vector int AND reduction intrinsic of the source vector. 715 CallInst *CreateAndReduce(Value *Src); 716 717 /// Create a vector int OR reduction intrinsic of the source vector. 718 CallInst *CreateOrReduce(Value *Src); 719 720 /// Create a vector int XOR reduction intrinsic of the source vector. 721 CallInst *CreateXorReduce(Value *Src); 722 723 /// Create a vector integer max reduction intrinsic of the source 724 /// vector. 725 CallInst *CreateIntMaxReduce(Value *Src, bool IsSigned = false); 726 727 /// Create a vector integer min reduction intrinsic of the source 728 /// vector. 729 CallInst *CreateIntMinReduce(Value *Src, bool IsSigned = false); 730 731 /// Create a vector float max reduction intrinsic of the source 732 /// vector. 733 CallInst *CreateFPMaxReduce(Value *Src); 734 735 /// Create a vector float min reduction intrinsic of the source 736 /// vector. 737 CallInst *CreateFPMinReduce(Value *Src); 738 739 /// Create a lifetime.start intrinsic. 740 /// 741 /// If the pointer isn't i8* it will be converted. 742 CallInst *CreateLifetimeStart(Value *Ptr, ConstantInt *Size = nullptr); 743 744 /// Create a lifetime.end intrinsic. 745 /// 746 /// If the pointer isn't i8* it will be converted. 747 CallInst *CreateLifetimeEnd(Value *Ptr, ConstantInt *Size = nullptr); 748 749 /// Create a call to invariant.start intrinsic. 750 /// 751 /// If the pointer isn't i8* it will be converted. 752 CallInst *CreateInvariantStart(Value *Ptr, ConstantInt *Size = nullptr); 753 754 /// Create a call to Masked Load intrinsic 755 CallInst *CreateMaskedLoad(Type *Ty, Value *Ptr, Align Alignment, Value *Mask, 756 Value *PassThru = nullptr, const Twine &Name = ""); 757 758 /// Create a call to Masked Store intrinsic 759 CallInst *CreateMaskedStore(Value *Val, Value *Ptr, Align Alignment, 760 Value *Mask); 761 762 /// Create a call to Masked Gather intrinsic 763 CallInst *CreateMaskedGather(Type *Ty, Value *Ptrs, Align Alignment, 764 Value *Mask = nullptr, Value *PassThru = nullptr, 765 const Twine &Name = ""); 766 767 /// Create a call to Masked Scatter intrinsic 768 CallInst *CreateMaskedScatter(Value *Val, Value *Ptrs, Align Alignment, 769 Value *Mask = nullptr); 770 771 /// Create an assume intrinsic call that allows the optimizer to 772 /// assume that the provided condition will be true. 773 /// 774 /// The optional argument \p OpBundles specifies operand bundles that are 775 /// added to the call instruction. 776 CallInst *CreateAssumption(Value *Cond, 777 ArrayRef<OperandBundleDef> OpBundles = llvm::None); 778 779 /// Create a llvm.experimental.noalias.scope.decl intrinsic call. 780 Instruction *CreateNoAliasScopeDeclaration(Value *Scope); CreateNoAliasScopeDeclaration(MDNode * ScopeTag)781 Instruction *CreateNoAliasScopeDeclaration(MDNode *ScopeTag) { 782 return CreateNoAliasScopeDeclaration( 783 MetadataAsValue::get(Context, ScopeTag)); 784 } 785 786 /// Create a call to the experimental.gc.statepoint intrinsic to 787 /// start a new statepoint sequence. 788 CallInst *CreateGCStatepointCall(uint64_t ID, uint32_t NumPatchBytes, 789 Value *ActualCallee, 790 ArrayRef<Value *> CallArgs, 791 Optional<ArrayRef<Value *>> DeoptArgs, 792 ArrayRef<Value *> GCArgs, 793 const Twine &Name = ""); 794 795 /// Create a call to the experimental.gc.statepoint intrinsic to 796 /// start a new statepoint sequence. 797 CallInst *CreateGCStatepointCall(uint64_t ID, uint32_t NumPatchBytes, 798 Value *ActualCallee, uint32_t Flags, 799 ArrayRef<Value *> CallArgs, 800 Optional<ArrayRef<Use>> TransitionArgs, 801 Optional<ArrayRef<Use>> DeoptArgs, 802 ArrayRef<Value *> GCArgs, 803 const Twine &Name = ""); 804 805 /// Conveninence function for the common case when CallArgs are filled 806 /// in using makeArrayRef(CS.arg_begin(), CS.arg_end()); Use needs to be 807 /// .get()'ed to get the Value pointer. 808 CallInst *CreateGCStatepointCall(uint64_t ID, uint32_t NumPatchBytes, 809 Value *ActualCallee, ArrayRef<Use> CallArgs, 810 Optional<ArrayRef<Value *>> DeoptArgs, 811 ArrayRef<Value *> GCArgs, 812 const Twine &Name = ""); 813 814 /// Create an invoke to the experimental.gc.statepoint intrinsic to 815 /// start a new statepoint sequence. 816 InvokeInst * 817 CreateGCStatepointInvoke(uint64_t ID, uint32_t NumPatchBytes, 818 Value *ActualInvokee, BasicBlock *NormalDest, 819 BasicBlock *UnwindDest, ArrayRef<Value *> InvokeArgs, 820 Optional<ArrayRef<Value *>> DeoptArgs, 821 ArrayRef<Value *> GCArgs, const Twine &Name = ""); 822 823 /// Create an invoke to the experimental.gc.statepoint intrinsic to 824 /// start a new statepoint sequence. 825 InvokeInst *CreateGCStatepointInvoke( 826 uint64_t ID, uint32_t NumPatchBytes, Value *ActualInvokee, 827 BasicBlock *NormalDest, BasicBlock *UnwindDest, uint32_t Flags, 828 ArrayRef<Value *> InvokeArgs, Optional<ArrayRef<Use>> TransitionArgs, 829 Optional<ArrayRef<Use>> DeoptArgs, ArrayRef<Value *> GCArgs, 830 const Twine &Name = ""); 831 832 // Convenience function for the common case when CallArgs are filled in using 833 // makeArrayRef(CS.arg_begin(), CS.arg_end()); Use needs to be .get()'ed to 834 // get the Value *. 835 InvokeInst * 836 CreateGCStatepointInvoke(uint64_t ID, uint32_t NumPatchBytes, 837 Value *ActualInvokee, BasicBlock *NormalDest, 838 BasicBlock *UnwindDest, ArrayRef<Use> InvokeArgs, 839 Optional<ArrayRef<Value *>> DeoptArgs, 840 ArrayRef<Value *> GCArgs, const Twine &Name = ""); 841 842 /// Create a call to the experimental.gc.result intrinsic to extract 843 /// the result from a call wrapped in a statepoint. 844 CallInst *CreateGCResult(Instruction *Statepoint, 845 Type *ResultType, 846 const Twine &Name = ""); 847 848 /// Create a call to the experimental.gc.relocate intrinsics to 849 /// project the relocated value of one pointer from the statepoint. 850 CallInst *CreateGCRelocate(Instruction *Statepoint, 851 int BaseOffset, 852 int DerivedOffset, 853 Type *ResultType, 854 const Twine &Name = ""); 855 856 /// Create a call to the experimental.gc.pointer.base intrinsic to get the 857 /// base pointer for the specified derived pointer. 858 CallInst *CreateGCGetPointerBase(Value *DerivedPtr, const Twine &Name = ""); 859 860 /// Create a call to the experimental.gc.get.pointer.offset intrinsic to get 861 /// the offset of the specified derived pointer from its base. 862 CallInst *CreateGCGetPointerOffset(Value *DerivedPtr, const Twine &Name = ""); 863 864 /// Create a call to llvm.vscale, multiplied by \p Scaling. The type of VScale 865 /// will be the same type as that of \p Scaling. 866 Value *CreateVScale(Constant *Scaling, const Twine &Name = ""); 867 868 /// Creates a vector of type \p DstType with the linear sequence <0, 1, ...> 869 Value *CreateStepVector(Type *DstType, const Twine &Name = ""); 870 871 /// Create a call to intrinsic \p ID with 1 operand which is mangled on its 872 /// type. 873 CallInst *CreateUnaryIntrinsic(Intrinsic::ID ID, Value *V, 874 Instruction *FMFSource = nullptr, 875 const Twine &Name = ""); 876 877 /// Create a call to intrinsic \p ID with 2 operands which is mangled on the 878 /// first type. 879 CallInst *CreateBinaryIntrinsic(Intrinsic::ID ID, Value *LHS, Value *RHS, 880 Instruction *FMFSource = nullptr, 881 const Twine &Name = ""); 882 883 /// Create a call to intrinsic \p ID with \p args, mangled using \p Types. If 884 /// \p FMFSource is provided, copy fast-math-flags from that instruction to 885 /// the intrinsic. 886 CallInst *CreateIntrinsic(Intrinsic::ID ID, ArrayRef<Type *> Types, 887 ArrayRef<Value *> Args, 888 Instruction *FMFSource = nullptr, 889 const Twine &Name = ""); 890 891 /// Create call to the minnum intrinsic. 892 CallInst *CreateMinNum(Value *LHS, Value *RHS, const Twine &Name = "") { 893 return CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS, nullptr, Name); 894 } 895 896 /// Create call to the maxnum intrinsic. 897 CallInst *CreateMaxNum(Value *LHS, Value *RHS, const Twine &Name = "") { 898 return CreateBinaryIntrinsic(Intrinsic::maxnum, LHS, RHS, nullptr, Name); 899 } 900 901 /// Create call to the minimum intrinsic. 902 CallInst *CreateMinimum(Value *LHS, Value *RHS, const Twine &Name = "") { 903 return CreateBinaryIntrinsic(Intrinsic::minimum, LHS, RHS, nullptr, Name); 904 } 905 906 /// Create call to the maximum intrinsic. 907 CallInst *CreateMaximum(Value *LHS, Value *RHS, const Twine &Name = "") { 908 return CreateBinaryIntrinsic(Intrinsic::maximum, LHS, RHS, nullptr, Name); 909 } 910 911 /// Create a call to the arithmetic_fence intrinsic. 912 CallInst *CreateArithmeticFence(Value *Val, Type *DstType, 913 const Twine &Name = "") { 914 return CreateIntrinsic(Intrinsic::arithmetic_fence, DstType, Val, nullptr, 915 Name); 916 } 917 918 /// Create a call to the experimental.vector.extract intrinsic. 919 CallInst *CreateExtractVector(Type *DstType, Value *SrcVec, Value *Idx, 920 const Twine &Name = "") { 921 return CreateIntrinsic(Intrinsic::experimental_vector_extract, 922 {DstType, SrcVec->getType()}, {SrcVec, Idx}, nullptr, 923 Name); 924 } 925 926 /// Create a call to the experimental.vector.insert intrinsic. 927 CallInst *CreateInsertVector(Type *DstType, Value *SrcVec, Value *SubVec, 928 Value *Idx, const Twine &Name = "") { 929 return CreateIntrinsic(Intrinsic::experimental_vector_insert, 930 {DstType, SubVec->getType()}, {SrcVec, SubVec, Idx}, 931 nullptr, Name); 932 } 933 934 private: 935 /// Create a call to a masked intrinsic with given Id. 936 CallInst *CreateMaskedIntrinsic(Intrinsic::ID Id, ArrayRef<Value *> Ops, 937 ArrayRef<Type *> OverloadedTypes, 938 const Twine &Name = ""); 939 940 Value *getCastedInt8PtrValue(Value *Ptr); 941 942 //===--------------------------------------------------------------------===// 943 // Instruction creation methods: Terminators 944 //===--------------------------------------------------------------------===// 945 946 private: 947 /// Helper to add branch weight and unpredictable metadata onto an 948 /// instruction. 949 /// \returns The annotated instruction. 950 template <typename InstTy> addBranchMetadata(InstTy * I,MDNode * Weights,MDNode * Unpredictable)951 InstTy *addBranchMetadata(InstTy *I, MDNode *Weights, MDNode *Unpredictable) { 952 if (Weights) 953 I->setMetadata(LLVMContext::MD_prof, Weights); 954 if (Unpredictable) 955 I->setMetadata(LLVMContext::MD_unpredictable, Unpredictable); 956 return I; 957 } 958 959 public: 960 /// Create a 'ret void' instruction. CreateRetVoid()961 ReturnInst *CreateRetVoid() { 962 return Insert(ReturnInst::Create(Context)); 963 } 964 965 /// Create a 'ret <val>' instruction. CreateRet(Value * V)966 ReturnInst *CreateRet(Value *V) { 967 return Insert(ReturnInst::Create(Context, V)); 968 } 969 970 /// Create a sequence of N insertvalue instructions, 971 /// with one Value from the retVals array each, that build a aggregate 972 /// return value one value at a time, and a ret instruction to return 973 /// the resulting aggregate value. 974 /// 975 /// This is a convenience function for code that uses aggregate return values 976 /// as a vehicle for having multiple return values. CreateAggregateRet(Value * const * retVals,unsigned N)977 ReturnInst *CreateAggregateRet(Value *const *retVals, unsigned N) { 978 Value *V = UndefValue::get(getCurrentFunctionReturnType()); 979 for (unsigned i = 0; i != N; ++i) 980 V = CreateInsertValue(V, retVals[i], i, "mrv"); 981 return Insert(ReturnInst::Create(Context, V)); 982 } 983 984 /// Create an unconditional 'br label X' instruction. CreateBr(BasicBlock * Dest)985 BranchInst *CreateBr(BasicBlock *Dest) { 986 return Insert(BranchInst::Create(Dest)); 987 } 988 989 /// Create a conditional 'br Cond, TrueDest, FalseDest' 990 /// instruction. 991 BranchInst *CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False, 992 MDNode *BranchWeights = nullptr, 993 MDNode *Unpredictable = nullptr) { 994 return Insert(addBranchMetadata(BranchInst::Create(True, False, Cond), 995 BranchWeights, Unpredictable)); 996 } 997 998 /// Create a conditional 'br Cond, TrueDest, FalseDest' 999 /// instruction. Copy branch meta data if available. CreateCondBr(Value * Cond,BasicBlock * True,BasicBlock * False,Instruction * MDSrc)1000 BranchInst *CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False, 1001 Instruction *MDSrc) { 1002 BranchInst *Br = BranchInst::Create(True, False, Cond); 1003 if (MDSrc) { 1004 unsigned WL[4] = {LLVMContext::MD_prof, LLVMContext::MD_unpredictable, 1005 LLVMContext::MD_make_implicit, LLVMContext::MD_dbg}; 1006 Br->copyMetadata(*MDSrc, makeArrayRef(&WL[0], 4)); 1007 } 1008 return Insert(Br); 1009 } 1010 1011 /// Create a switch instruction with the specified value, default dest, 1012 /// and with a hint for the number of cases that will be added (for efficient 1013 /// allocation). 1014 SwitchInst *CreateSwitch(Value *V, BasicBlock *Dest, unsigned NumCases = 10, 1015 MDNode *BranchWeights = nullptr, 1016 MDNode *Unpredictable = nullptr) { 1017 return Insert(addBranchMetadata(SwitchInst::Create(V, Dest, NumCases), 1018 BranchWeights, Unpredictable)); 1019 } 1020 1021 /// Create an indirect branch instruction with the specified address 1022 /// operand, with an optional hint for the number of destinations that will be 1023 /// added (for efficient allocation). 1024 IndirectBrInst *CreateIndirectBr(Value *Addr, unsigned NumDests = 10) { 1025 return Insert(IndirectBrInst::Create(Addr, NumDests)); 1026 } 1027 1028 /// Create an invoke instruction. 1029 InvokeInst *CreateInvoke(FunctionType *Ty, Value *Callee, 1030 BasicBlock *NormalDest, BasicBlock *UnwindDest, 1031 ArrayRef<Value *> Args, 1032 ArrayRef<OperandBundleDef> OpBundles, 1033 const Twine &Name = "") { 1034 InvokeInst *II = 1035 InvokeInst::Create(Ty, Callee, NormalDest, UnwindDest, Args, OpBundles); 1036 if (IsFPConstrained) 1037 setConstrainedFPCallAttr(II); 1038 return Insert(II, Name); 1039 } 1040 InvokeInst *CreateInvoke(FunctionType *Ty, Value *Callee, 1041 BasicBlock *NormalDest, BasicBlock *UnwindDest, 1042 ArrayRef<Value *> Args = None, 1043 const Twine &Name = "") { 1044 InvokeInst *II = 1045 InvokeInst::Create(Ty, Callee, NormalDest, UnwindDest, Args); 1046 if (IsFPConstrained) 1047 setConstrainedFPCallAttr(II); 1048 return Insert(II, Name); 1049 } 1050 1051 InvokeInst *CreateInvoke(FunctionCallee Callee, BasicBlock *NormalDest, 1052 BasicBlock *UnwindDest, ArrayRef<Value *> Args, 1053 ArrayRef<OperandBundleDef> OpBundles, 1054 const Twine &Name = "") { 1055 return CreateInvoke(Callee.getFunctionType(), Callee.getCallee(), 1056 NormalDest, UnwindDest, Args, OpBundles, Name); 1057 } 1058 1059 InvokeInst *CreateInvoke(FunctionCallee Callee, BasicBlock *NormalDest, 1060 BasicBlock *UnwindDest, 1061 ArrayRef<Value *> Args = None, 1062 const Twine &Name = "") { 1063 return CreateInvoke(Callee.getFunctionType(), Callee.getCallee(), 1064 NormalDest, UnwindDest, Args, Name); 1065 } 1066 1067 /// \brief Create a callbr instruction. 1068 CallBrInst *CreateCallBr(FunctionType *Ty, Value *Callee, 1069 BasicBlock *DefaultDest, 1070 ArrayRef<BasicBlock *> IndirectDests, 1071 ArrayRef<Value *> Args = None, 1072 const Twine &Name = "") { 1073 return Insert(CallBrInst::Create(Ty, Callee, DefaultDest, IndirectDests, 1074 Args), Name); 1075 } 1076 CallBrInst *CreateCallBr(FunctionType *Ty, Value *Callee, 1077 BasicBlock *DefaultDest, 1078 ArrayRef<BasicBlock *> IndirectDests, 1079 ArrayRef<Value *> Args, 1080 ArrayRef<OperandBundleDef> OpBundles, 1081 const Twine &Name = "") { 1082 return Insert( 1083 CallBrInst::Create(Ty, Callee, DefaultDest, IndirectDests, Args, 1084 OpBundles), Name); 1085 } 1086 1087 CallBrInst *CreateCallBr(FunctionCallee Callee, BasicBlock *DefaultDest, 1088 ArrayRef<BasicBlock *> IndirectDests, 1089 ArrayRef<Value *> Args = None, 1090 const Twine &Name = "") { 1091 return CreateCallBr(Callee.getFunctionType(), Callee.getCallee(), 1092 DefaultDest, IndirectDests, Args, Name); 1093 } 1094 CallBrInst *CreateCallBr(FunctionCallee Callee, BasicBlock *DefaultDest, 1095 ArrayRef<BasicBlock *> IndirectDests, 1096 ArrayRef<Value *> Args, 1097 ArrayRef<OperandBundleDef> OpBundles, 1098 const Twine &Name = "") { 1099 return CreateCallBr(Callee.getFunctionType(), Callee.getCallee(), 1100 DefaultDest, IndirectDests, Args, Name); 1101 } 1102 CreateResume(Value * Exn)1103 ResumeInst *CreateResume(Value *Exn) { 1104 return Insert(ResumeInst::Create(Exn)); 1105 } 1106 1107 CleanupReturnInst *CreateCleanupRet(CleanupPadInst *CleanupPad, 1108 BasicBlock *UnwindBB = nullptr) { 1109 return Insert(CleanupReturnInst::Create(CleanupPad, UnwindBB)); 1110 } 1111 1112 CatchSwitchInst *CreateCatchSwitch(Value *ParentPad, BasicBlock *UnwindBB, 1113 unsigned NumHandlers, 1114 const Twine &Name = "") { 1115 return Insert(CatchSwitchInst::Create(ParentPad, UnwindBB, NumHandlers), 1116 Name); 1117 } 1118 1119 CatchPadInst *CreateCatchPad(Value *ParentPad, ArrayRef<Value *> Args, 1120 const Twine &Name = "") { 1121 return Insert(CatchPadInst::Create(ParentPad, Args), Name); 1122 } 1123 1124 CleanupPadInst *CreateCleanupPad(Value *ParentPad, 1125 ArrayRef<Value *> Args = None, 1126 const Twine &Name = "") { 1127 return Insert(CleanupPadInst::Create(ParentPad, Args), Name); 1128 } 1129 CreateCatchRet(CatchPadInst * CatchPad,BasicBlock * BB)1130 CatchReturnInst *CreateCatchRet(CatchPadInst *CatchPad, BasicBlock *BB) { 1131 return Insert(CatchReturnInst::Create(CatchPad, BB)); 1132 } 1133 CreateUnreachable()1134 UnreachableInst *CreateUnreachable() { 1135 return Insert(new UnreachableInst(Context)); 1136 } 1137 1138 //===--------------------------------------------------------------------===// 1139 // Instruction creation methods: Binary Operators 1140 //===--------------------------------------------------------------------===// 1141 private: CreateInsertNUWNSWBinOp(BinaryOperator::BinaryOps Opc,Value * LHS,Value * RHS,const Twine & Name,bool HasNUW,bool HasNSW)1142 BinaryOperator *CreateInsertNUWNSWBinOp(BinaryOperator::BinaryOps Opc, 1143 Value *LHS, Value *RHS, 1144 const Twine &Name, 1145 bool HasNUW, bool HasNSW) { 1146 BinaryOperator *BO = Insert(BinaryOperator::Create(Opc, LHS, RHS), Name); 1147 if (HasNUW) BO->setHasNoUnsignedWrap(); 1148 if (HasNSW) BO->setHasNoSignedWrap(); 1149 return BO; 1150 } 1151 setFPAttrs(Instruction * I,MDNode * FPMD,FastMathFlags FMF)1152 Instruction *setFPAttrs(Instruction *I, MDNode *FPMD, 1153 FastMathFlags FMF) const { 1154 if (!FPMD) 1155 FPMD = DefaultFPMathTag; 1156 if (FPMD) 1157 I->setMetadata(LLVMContext::MD_fpmath, FPMD); 1158 I->setFastMathFlags(FMF); 1159 return I; 1160 } 1161 foldConstant(Instruction::BinaryOps Opc,Value * L,Value * R,const Twine & Name)1162 Value *foldConstant(Instruction::BinaryOps Opc, Value *L, 1163 Value *R, const Twine &Name) const { 1164 auto *LC = dyn_cast<Constant>(L); 1165 auto *RC = dyn_cast<Constant>(R); 1166 return (LC && RC) ? Insert(Folder.CreateBinOp(Opc, LC, RC), Name) : nullptr; 1167 } 1168 getConstrainedFPRounding(Optional<RoundingMode> Rounding)1169 Value *getConstrainedFPRounding(Optional<RoundingMode> Rounding) { 1170 RoundingMode UseRounding = DefaultConstrainedRounding; 1171 1172 if (Rounding.hasValue()) 1173 UseRounding = Rounding.getValue(); 1174 1175 Optional<StringRef> RoundingStr = RoundingModeToStr(UseRounding); 1176 assert(RoundingStr.hasValue() && "Garbage strict rounding mode!"); 1177 auto *RoundingMDS = MDString::get(Context, RoundingStr.getValue()); 1178 1179 return MetadataAsValue::get(Context, RoundingMDS); 1180 } 1181 getConstrainedFPExcept(Optional<fp::ExceptionBehavior> Except)1182 Value *getConstrainedFPExcept(Optional<fp::ExceptionBehavior> Except) { 1183 fp::ExceptionBehavior UseExcept = DefaultConstrainedExcept; 1184 1185 if (Except.hasValue()) 1186 UseExcept = Except.getValue(); 1187 1188 Optional<StringRef> ExceptStr = ExceptionBehaviorToStr(UseExcept); 1189 assert(ExceptStr.hasValue() && "Garbage strict exception behavior!"); 1190 auto *ExceptMDS = MDString::get(Context, ExceptStr.getValue()); 1191 1192 return MetadataAsValue::get(Context, ExceptMDS); 1193 } 1194 getConstrainedFPPredicate(CmpInst::Predicate Predicate)1195 Value *getConstrainedFPPredicate(CmpInst::Predicate Predicate) { 1196 assert(CmpInst::isFPPredicate(Predicate) && 1197 Predicate != CmpInst::FCMP_FALSE && 1198 Predicate != CmpInst::FCMP_TRUE && 1199 "Invalid constrained FP comparison predicate!"); 1200 1201 StringRef PredicateStr = CmpInst::getPredicateName(Predicate); 1202 auto *PredicateMDS = MDString::get(Context, PredicateStr); 1203 1204 return MetadataAsValue::get(Context, PredicateMDS); 1205 } 1206 1207 public: 1208 Value *CreateAdd(Value *LHS, Value *RHS, const Twine &Name = "", 1209 bool HasNUW = false, bool HasNSW = false) { 1210 if (auto *LC = dyn_cast<Constant>(LHS)) 1211 if (auto *RC = dyn_cast<Constant>(RHS)) 1212 return Insert(Folder.CreateAdd(LC, RC, HasNUW, HasNSW), Name); 1213 return CreateInsertNUWNSWBinOp(Instruction::Add, LHS, RHS, Name, 1214 HasNUW, HasNSW); 1215 } 1216 1217 Value *CreateNSWAdd(Value *LHS, Value *RHS, const Twine &Name = "") { 1218 return CreateAdd(LHS, RHS, Name, false, true); 1219 } 1220 1221 Value *CreateNUWAdd(Value *LHS, Value *RHS, const Twine &Name = "") { 1222 return CreateAdd(LHS, RHS, Name, true, false); 1223 } 1224 1225 Value *CreateSub(Value *LHS, Value *RHS, const Twine &Name = "", 1226 bool HasNUW = false, bool HasNSW = false) { 1227 if (auto *LC = dyn_cast<Constant>(LHS)) 1228 if (auto *RC = dyn_cast<Constant>(RHS)) 1229 return Insert(Folder.CreateSub(LC, RC, HasNUW, HasNSW), Name); 1230 return CreateInsertNUWNSWBinOp(Instruction::Sub, LHS, RHS, Name, 1231 HasNUW, HasNSW); 1232 } 1233 1234 Value *CreateNSWSub(Value *LHS, Value *RHS, const Twine &Name = "") { 1235 return CreateSub(LHS, RHS, Name, false, true); 1236 } 1237 1238 Value *CreateNUWSub(Value *LHS, Value *RHS, const Twine &Name = "") { 1239 return CreateSub(LHS, RHS, Name, true, false); 1240 } 1241 1242 Value *CreateMul(Value *LHS, Value *RHS, const Twine &Name = "", 1243 bool HasNUW = false, bool HasNSW = false) { 1244 if (auto *LC = dyn_cast<Constant>(LHS)) 1245 if (auto *RC = dyn_cast<Constant>(RHS)) 1246 return Insert(Folder.CreateMul(LC, RC, HasNUW, HasNSW), Name); 1247 return CreateInsertNUWNSWBinOp(Instruction::Mul, LHS, RHS, Name, 1248 HasNUW, HasNSW); 1249 } 1250 1251 Value *CreateNSWMul(Value *LHS, Value *RHS, const Twine &Name = "") { 1252 return CreateMul(LHS, RHS, Name, false, true); 1253 } 1254 1255 Value *CreateNUWMul(Value *LHS, Value *RHS, const Twine &Name = "") { 1256 return CreateMul(LHS, RHS, Name, true, false); 1257 } 1258 1259 Value *CreateUDiv(Value *LHS, Value *RHS, const Twine &Name = "", 1260 bool isExact = false) { 1261 if (auto *LC = dyn_cast<Constant>(LHS)) 1262 if (auto *RC = dyn_cast<Constant>(RHS)) 1263 return Insert(Folder.CreateUDiv(LC, RC, isExact), Name); 1264 if (!isExact) 1265 return Insert(BinaryOperator::CreateUDiv(LHS, RHS), Name); 1266 return Insert(BinaryOperator::CreateExactUDiv(LHS, RHS), Name); 1267 } 1268 1269 Value *CreateExactUDiv(Value *LHS, Value *RHS, const Twine &Name = "") { 1270 return CreateUDiv(LHS, RHS, Name, true); 1271 } 1272 1273 Value *CreateSDiv(Value *LHS, Value *RHS, const Twine &Name = "", 1274 bool isExact = false) { 1275 if (auto *LC = dyn_cast<Constant>(LHS)) 1276 if (auto *RC = dyn_cast<Constant>(RHS)) 1277 return Insert(Folder.CreateSDiv(LC, RC, isExact), Name); 1278 if (!isExact) 1279 return Insert(BinaryOperator::CreateSDiv(LHS, RHS), Name); 1280 return Insert(BinaryOperator::CreateExactSDiv(LHS, RHS), Name); 1281 } 1282 1283 Value *CreateExactSDiv(Value *LHS, Value *RHS, const Twine &Name = "") { 1284 return CreateSDiv(LHS, RHS, Name, true); 1285 } 1286 1287 Value *CreateURem(Value *LHS, Value *RHS, const Twine &Name = "") { 1288 if (Value *V = foldConstant(Instruction::URem, LHS, RHS, Name)) return V; 1289 return Insert(BinaryOperator::CreateURem(LHS, RHS), Name); 1290 } 1291 1292 Value *CreateSRem(Value *LHS, Value *RHS, const Twine &Name = "") { 1293 if (Value *V = foldConstant(Instruction::SRem, LHS, RHS, Name)) return V; 1294 return Insert(BinaryOperator::CreateSRem(LHS, RHS), Name); 1295 } 1296 1297 Value *CreateShl(Value *LHS, Value *RHS, const Twine &Name = "", 1298 bool HasNUW = false, bool HasNSW = false) { 1299 if (auto *LC = dyn_cast<Constant>(LHS)) 1300 if (auto *RC = dyn_cast<Constant>(RHS)) 1301 return Insert(Folder.CreateShl(LC, RC, HasNUW, HasNSW), Name); 1302 return CreateInsertNUWNSWBinOp(Instruction::Shl, LHS, RHS, Name, 1303 HasNUW, HasNSW); 1304 } 1305 1306 Value *CreateShl(Value *LHS, const APInt &RHS, const Twine &Name = "", 1307 bool HasNUW = false, bool HasNSW = false) { 1308 return CreateShl(LHS, ConstantInt::get(LHS->getType(), RHS), Name, 1309 HasNUW, HasNSW); 1310 } 1311 1312 Value *CreateShl(Value *LHS, uint64_t RHS, const Twine &Name = "", 1313 bool HasNUW = false, bool HasNSW = false) { 1314 return CreateShl(LHS, ConstantInt::get(LHS->getType(), RHS), Name, 1315 HasNUW, HasNSW); 1316 } 1317 1318 Value *CreateLShr(Value *LHS, Value *RHS, const Twine &Name = "", 1319 bool isExact = false) { 1320 if (auto *LC = dyn_cast<Constant>(LHS)) 1321 if (auto *RC = dyn_cast<Constant>(RHS)) 1322 return Insert(Folder.CreateLShr(LC, RC, isExact), Name); 1323 if (!isExact) 1324 return Insert(BinaryOperator::CreateLShr(LHS, RHS), Name); 1325 return Insert(BinaryOperator::CreateExactLShr(LHS, RHS), Name); 1326 } 1327 1328 Value *CreateLShr(Value *LHS, const APInt &RHS, const Twine &Name = "", 1329 bool isExact = false) { 1330 return CreateLShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact); 1331 } 1332 1333 Value *CreateLShr(Value *LHS, uint64_t RHS, const Twine &Name = "", 1334 bool isExact = false) { 1335 return CreateLShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact); 1336 } 1337 1338 Value *CreateAShr(Value *LHS, Value *RHS, const Twine &Name = "", 1339 bool isExact = false) { 1340 if (auto *LC = dyn_cast<Constant>(LHS)) 1341 if (auto *RC = dyn_cast<Constant>(RHS)) 1342 return Insert(Folder.CreateAShr(LC, RC, isExact), Name); 1343 if (!isExact) 1344 return Insert(BinaryOperator::CreateAShr(LHS, RHS), Name); 1345 return Insert(BinaryOperator::CreateExactAShr(LHS, RHS), Name); 1346 } 1347 1348 Value *CreateAShr(Value *LHS, const APInt &RHS, const Twine &Name = "", 1349 bool isExact = false) { 1350 return CreateAShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact); 1351 } 1352 1353 Value *CreateAShr(Value *LHS, uint64_t RHS, const Twine &Name = "", 1354 bool isExact = false) { 1355 return CreateAShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact); 1356 } 1357 1358 Value *CreateAnd(Value *LHS, Value *RHS, const Twine &Name = "") { 1359 if (auto *RC = dyn_cast<Constant>(RHS)) { 1360 if (isa<ConstantInt>(RC) && cast<ConstantInt>(RC)->isMinusOne()) 1361 return LHS; // LHS & -1 -> LHS 1362 if (auto *LC = dyn_cast<Constant>(LHS)) 1363 return Insert(Folder.CreateAnd(LC, RC), Name); 1364 } 1365 return Insert(BinaryOperator::CreateAnd(LHS, RHS), Name); 1366 } 1367 1368 Value *CreateAnd(Value *LHS, const APInt &RHS, const Twine &Name = "") { 1369 return CreateAnd(LHS, ConstantInt::get(LHS->getType(), RHS), Name); 1370 } 1371 1372 Value *CreateAnd(Value *LHS, uint64_t RHS, const Twine &Name = "") { 1373 return CreateAnd(LHS, ConstantInt::get(LHS->getType(), RHS), Name); 1374 } 1375 CreateAnd(ArrayRef<Value * > Ops)1376 Value *CreateAnd(ArrayRef<Value*> Ops) { 1377 assert(!Ops.empty()); 1378 Value *Accum = Ops[0]; 1379 for (unsigned i = 1; i < Ops.size(); i++) 1380 Accum = CreateAnd(Accum, Ops[i]); 1381 return Accum; 1382 } 1383 1384 Value *CreateOr(Value *LHS, Value *RHS, const Twine &Name = "") { 1385 if (auto *RC = dyn_cast<Constant>(RHS)) { 1386 if (RC->isNullValue()) 1387 return LHS; // LHS | 0 -> LHS 1388 if (auto *LC = dyn_cast<Constant>(LHS)) 1389 return Insert(Folder.CreateOr(LC, RC), Name); 1390 } 1391 return Insert(BinaryOperator::CreateOr(LHS, RHS), Name); 1392 } 1393 1394 Value *CreateOr(Value *LHS, const APInt &RHS, const Twine &Name = "") { 1395 return CreateOr(LHS, ConstantInt::get(LHS->getType(), RHS), Name); 1396 } 1397 1398 Value *CreateOr(Value *LHS, uint64_t RHS, const Twine &Name = "") { 1399 return CreateOr(LHS, ConstantInt::get(LHS->getType(), RHS), Name); 1400 } 1401 CreateOr(ArrayRef<Value * > Ops)1402 Value *CreateOr(ArrayRef<Value*> Ops) { 1403 assert(!Ops.empty()); 1404 Value *Accum = Ops[0]; 1405 for (unsigned i = 1; i < Ops.size(); i++) 1406 Accum = CreateOr(Accum, Ops[i]); 1407 return Accum; 1408 } 1409 1410 Value *CreateXor(Value *LHS, Value *RHS, const Twine &Name = "") { 1411 if (Value *V = foldConstant(Instruction::Xor, LHS, RHS, Name)) return V; 1412 return Insert(BinaryOperator::CreateXor(LHS, RHS), Name); 1413 } 1414 1415 Value *CreateXor(Value *LHS, const APInt &RHS, const Twine &Name = "") { 1416 return CreateXor(LHS, ConstantInt::get(LHS->getType(), RHS), Name); 1417 } 1418 1419 Value *CreateXor(Value *LHS, uint64_t RHS, const Twine &Name = "") { 1420 return CreateXor(LHS, ConstantInt::get(LHS->getType(), RHS), Name); 1421 } 1422 1423 Value *CreateFAdd(Value *L, Value *R, const Twine &Name = "", 1424 MDNode *FPMD = nullptr) { 1425 if (IsFPConstrained) 1426 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fadd, 1427 L, R, nullptr, Name, FPMD); 1428 1429 if (Value *V = foldConstant(Instruction::FAdd, L, R, Name)) return V; 1430 Instruction *I = setFPAttrs(BinaryOperator::CreateFAdd(L, R), FPMD, FMF); 1431 return Insert(I, Name); 1432 } 1433 1434 /// Copy fast-math-flags from an instruction rather than using the builder's 1435 /// default FMF. 1436 Value *CreateFAddFMF(Value *L, Value *R, Instruction *FMFSource, 1437 const Twine &Name = "") { 1438 if (IsFPConstrained) 1439 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fadd, 1440 L, R, FMFSource, Name); 1441 1442 if (Value *V = foldConstant(Instruction::FAdd, L, R, Name)) return V; 1443 Instruction *I = setFPAttrs(BinaryOperator::CreateFAdd(L, R), nullptr, 1444 FMFSource->getFastMathFlags()); 1445 return Insert(I, Name); 1446 } 1447 1448 Value *CreateFSub(Value *L, Value *R, const Twine &Name = "", 1449 MDNode *FPMD = nullptr) { 1450 if (IsFPConstrained) 1451 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fsub, 1452 L, R, nullptr, Name, FPMD); 1453 1454 if (Value *V = foldConstant(Instruction::FSub, L, R, Name)) return V; 1455 Instruction *I = setFPAttrs(BinaryOperator::CreateFSub(L, R), FPMD, FMF); 1456 return Insert(I, Name); 1457 } 1458 1459 /// Copy fast-math-flags from an instruction rather than using the builder's 1460 /// default FMF. 1461 Value *CreateFSubFMF(Value *L, Value *R, Instruction *FMFSource, 1462 const Twine &Name = "") { 1463 if (IsFPConstrained) 1464 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fsub, 1465 L, R, FMFSource, Name); 1466 1467 if (Value *V = foldConstant(Instruction::FSub, L, R, Name)) return V; 1468 Instruction *I = setFPAttrs(BinaryOperator::CreateFSub(L, R), nullptr, 1469 FMFSource->getFastMathFlags()); 1470 return Insert(I, Name); 1471 } 1472 1473 Value *CreateFMul(Value *L, Value *R, const Twine &Name = "", 1474 MDNode *FPMD = nullptr) { 1475 if (IsFPConstrained) 1476 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fmul, 1477 L, R, nullptr, Name, FPMD); 1478 1479 if (Value *V = foldConstant(Instruction::FMul, L, R, Name)) return V; 1480 Instruction *I = setFPAttrs(BinaryOperator::CreateFMul(L, R), FPMD, FMF); 1481 return Insert(I, Name); 1482 } 1483 1484 /// Copy fast-math-flags from an instruction rather than using the builder's 1485 /// default FMF. 1486 Value *CreateFMulFMF(Value *L, Value *R, Instruction *FMFSource, 1487 const Twine &Name = "") { 1488 if (IsFPConstrained) 1489 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fmul, 1490 L, R, FMFSource, Name); 1491 1492 if (Value *V = foldConstant(Instruction::FMul, L, R, Name)) return V; 1493 Instruction *I = setFPAttrs(BinaryOperator::CreateFMul(L, R), nullptr, 1494 FMFSource->getFastMathFlags()); 1495 return Insert(I, Name); 1496 } 1497 1498 Value *CreateFDiv(Value *L, Value *R, const Twine &Name = "", 1499 MDNode *FPMD = nullptr) { 1500 if (IsFPConstrained) 1501 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fdiv, 1502 L, R, nullptr, Name, FPMD); 1503 1504 if (Value *V = foldConstant(Instruction::FDiv, L, R, Name)) return V; 1505 Instruction *I = setFPAttrs(BinaryOperator::CreateFDiv(L, R), FPMD, FMF); 1506 return Insert(I, Name); 1507 } 1508 1509 /// Copy fast-math-flags from an instruction rather than using the builder's 1510 /// default FMF. 1511 Value *CreateFDivFMF(Value *L, Value *R, Instruction *FMFSource, 1512 const Twine &Name = "") { 1513 if (IsFPConstrained) 1514 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_fdiv, 1515 L, R, FMFSource, Name); 1516 1517 if (Value *V = foldConstant(Instruction::FDiv, L, R, Name)) return V; 1518 Instruction *I = setFPAttrs(BinaryOperator::CreateFDiv(L, R), nullptr, 1519 FMFSource->getFastMathFlags()); 1520 return Insert(I, Name); 1521 } 1522 1523 Value *CreateFRem(Value *L, Value *R, const Twine &Name = "", 1524 MDNode *FPMD = nullptr) { 1525 if (IsFPConstrained) 1526 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_frem, 1527 L, R, nullptr, Name, FPMD); 1528 1529 if (Value *V = foldConstant(Instruction::FRem, L, R, Name)) return V; 1530 Instruction *I = setFPAttrs(BinaryOperator::CreateFRem(L, R), FPMD, FMF); 1531 return Insert(I, Name); 1532 } 1533 1534 /// Copy fast-math-flags from an instruction rather than using the builder's 1535 /// default FMF. 1536 Value *CreateFRemFMF(Value *L, Value *R, Instruction *FMFSource, 1537 const Twine &Name = "") { 1538 if (IsFPConstrained) 1539 return CreateConstrainedFPBinOp(Intrinsic::experimental_constrained_frem, 1540 L, R, FMFSource, Name); 1541 1542 if (Value *V = foldConstant(Instruction::FRem, L, R, Name)) return V; 1543 Instruction *I = setFPAttrs(BinaryOperator::CreateFRem(L, R), nullptr, 1544 FMFSource->getFastMathFlags()); 1545 return Insert(I, Name); 1546 } 1547 1548 Value *CreateBinOp(Instruction::BinaryOps Opc, 1549 Value *LHS, Value *RHS, const Twine &Name = "", 1550 MDNode *FPMathTag = nullptr) { 1551 if (Value *V = foldConstant(Opc, LHS, RHS, Name)) return V; 1552 Instruction *BinOp = BinaryOperator::Create(Opc, LHS, RHS); 1553 if (isa<FPMathOperator>(BinOp)) 1554 setFPAttrs(BinOp, FPMathTag, FMF); 1555 return Insert(BinOp, Name); 1556 } 1557 1558 Value *CreateLogicalAnd(Value *Cond1, Value *Cond2, const Twine &Name = "") { 1559 assert(Cond2->getType()->isIntOrIntVectorTy(1)); 1560 return CreateSelect(Cond1, Cond2, 1561 ConstantInt::getNullValue(Cond2->getType()), Name); 1562 } 1563 1564 Value *CreateLogicalOr(Value *Cond1, Value *Cond2, const Twine &Name = "") { 1565 assert(Cond2->getType()->isIntOrIntVectorTy(1)); 1566 return CreateSelect(Cond1, ConstantInt::getAllOnesValue(Cond2->getType()), 1567 Cond2, Name); 1568 } 1569 1570 CallInst *CreateConstrainedFPBinOp( 1571 Intrinsic::ID ID, Value *L, Value *R, Instruction *FMFSource = nullptr, 1572 const Twine &Name = "", MDNode *FPMathTag = nullptr, 1573 Optional<RoundingMode> Rounding = None, 1574 Optional<fp::ExceptionBehavior> Except = None); 1575 1576 Value *CreateNeg(Value *V, const Twine &Name = "", 1577 bool HasNUW = false, bool HasNSW = false) { 1578 if (auto *VC = dyn_cast<Constant>(V)) 1579 return Insert(Folder.CreateNeg(VC, HasNUW, HasNSW), Name); 1580 BinaryOperator *BO = Insert(BinaryOperator::CreateNeg(V), Name); 1581 if (HasNUW) BO->setHasNoUnsignedWrap(); 1582 if (HasNSW) BO->setHasNoSignedWrap(); 1583 return BO; 1584 } 1585 1586 Value *CreateNSWNeg(Value *V, const Twine &Name = "") { 1587 return CreateNeg(V, Name, false, true); 1588 } 1589 1590 Value *CreateNUWNeg(Value *V, const Twine &Name = "") { 1591 return CreateNeg(V, Name, true, false); 1592 } 1593 1594 Value *CreateFNeg(Value *V, const Twine &Name = "", 1595 MDNode *FPMathTag = nullptr) { 1596 if (auto *VC = dyn_cast<Constant>(V)) 1597 return Insert(Folder.CreateFNeg(VC), Name); 1598 return Insert(setFPAttrs(UnaryOperator::CreateFNeg(V), FPMathTag, FMF), 1599 Name); 1600 } 1601 1602 /// Copy fast-math-flags from an instruction rather than using the builder's 1603 /// default FMF. 1604 Value *CreateFNegFMF(Value *V, Instruction *FMFSource, 1605 const Twine &Name = "") { 1606 if (auto *VC = dyn_cast<Constant>(V)) 1607 return Insert(Folder.CreateFNeg(VC), Name); 1608 return Insert(setFPAttrs(UnaryOperator::CreateFNeg(V), nullptr, 1609 FMFSource->getFastMathFlags()), 1610 Name); 1611 } 1612 1613 Value *CreateNot(Value *V, const Twine &Name = "") { 1614 if (auto *VC = dyn_cast<Constant>(V)) 1615 return Insert(Folder.CreateNot(VC), Name); 1616 return Insert(BinaryOperator::CreateNot(V), Name); 1617 } 1618 1619 Value *CreateUnOp(Instruction::UnaryOps Opc, 1620 Value *V, const Twine &Name = "", 1621 MDNode *FPMathTag = nullptr) { 1622 if (auto *VC = dyn_cast<Constant>(V)) 1623 return Insert(Folder.CreateUnOp(Opc, VC), Name); 1624 Instruction *UnOp = UnaryOperator::Create(Opc, V); 1625 if (isa<FPMathOperator>(UnOp)) 1626 setFPAttrs(UnOp, FPMathTag, FMF); 1627 return Insert(UnOp, Name); 1628 } 1629 1630 /// Create either a UnaryOperator or BinaryOperator depending on \p Opc. 1631 /// Correct number of operands must be passed accordingly. 1632 Value *CreateNAryOp(unsigned Opc, ArrayRef<Value *> Ops, 1633 const Twine &Name = "", MDNode *FPMathTag = nullptr); 1634 1635 //===--------------------------------------------------------------------===// 1636 // Instruction creation methods: Memory Instructions 1637 //===--------------------------------------------------------------------===// 1638 1639 AllocaInst *CreateAlloca(Type *Ty, unsigned AddrSpace, 1640 Value *ArraySize = nullptr, const Twine &Name = "") { 1641 const DataLayout &DL = BB->getModule()->getDataLayout(); 1642 Align AllocaAlign = DL.getPrefTypeAlign(Ty); 1643 return Insert(new AllocaInst(Ty, AddrSpace, ArraySize, AllocaAlign), Name); 1644 } 1645 1646 AllocaInst *CreateAlloca(Type *Ty, Value *ArraySize = nullptr, 1647 const Twine &Name = "") { 1648 const DataLayout &DL = BB->getModule()->getDataLayout(); 1649 Align AllocaAlign = DL.getPrefTypeAlign(Ty); 1650 unsigned AddrSpace = DL.getAllocaAddrSpace(); 1651 return Insert(new AllocaInst(Ty, AddrSpace, ArraySize, AllocaAlign), Name); 1652 } 1653 1654 /// Provided to resolve 'CreateLoad(Ty, Ptr, "...")' correctly, instead of 1655 /// converting the string to 'bool' for the isVolatile parameter. CreateLoad(Type * Ty,Value * Ptr,const char * Name)1656 LoadInst *CreateLoad(Type *Ty, Value *Ptr, const char *Name) { 1657 return CreateAlignedLoad(Ty, Ptr, MaybeAlign(), Name); 1658 } 1659 1660 LoadInst *CreateLoad(Type *Ty, Value *Ptr, const Twine &Name = "") { 1661 return CreateAlignedLoad(Ty, Ptr, MaybeAlign(), Name); 1662 } 1663 1664 LoadInst *CreateLoad(Type *Ty, Value *Ptr, bool isVolatile, 1665 const Twine &Name = "") { 1666 return CreateAlignedLoad(Ty, Ptr, MaybeAlign(), isVolatile, Name); 1667 } 1668 1669 // Deprecated [opaque pointer types] 1670 LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateLoad(Value *Ptr, 1671 const char *Name), 1672 "Use the version that explicitly specifies the " 1673 "loaded type instead") { 1674 return CreateLoad(Ptr->getType()->getPointerElementType(), Ptr, Name); 1675 } 1676 1677 // Deprecated [opaque pointer types] 1678 LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateLoad(Value *Ptr, 1679 const Twine &Name = ""), 1680 "Use the version that explicitly specifies the " 1681 "loaded type instead") { 1682 return CreateLoad(Ptr->getType()->getPointerElementType(), Ptr, Name); 1683 } 1684 1685 // Deprecated [opaque pointer types] 1686 LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateLoad(Value *Ptr, 1687 bool isVolatile, 1688 const Twine &Name = ""), 1689 "Use the version that explicitly specifies the " 1690 "loaded type instead") { 1691 return CreateLoad(Ptr->getType()->getPointerElementType(), Ptr, isVolatile, 1692 Name); 1693 } 1694 1695 StoreInst *CreateStore(Value *Val, Value *Ptr, bool isVolatile = false) { 1696 return CreateAlignedStore(Val, Ptr, MaybeAlign(), isVolatile); 1697 } 1698 CreateAlignedLoad(Type * Ty,Value * Ptr,MaybeAlign Align,const char * Name)1699 LoadInst *CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, 1700 const char *Name) { 1701 return CreateAlignedLoad(Ty, Ptr, Align, /*isVolatile*/false, Name); 1702 } 1703 1704 LoadInst *CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, 1705 const Twine &Name = "") { 1706 return CreateAlignedLoad(Ty, Ptr, Align, /*isVolatile*/false, Name); 1707 } 1708 1709 LoadInst *CreateAlignedLoad(Type *Ty, Value *Ptr, MaybeAlign Align, 1710 bool isVolatile, const Twine &Name = "") { 1711 if (!Align) { 1712 const DataLayout &DL = BB->getModule()->getDataLayout(); 1713 Align = DL.getABITypeAlign(Ty); 1714 } 1715 return Insert(new LoadInst(Ty, Ptr, Twine(), isVolatile, *Align), Name); 1716 } 1717 1718 // Deprecated [opaque pointer types] 1719 LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateAlignedLoad(Value *Ptr, 1720 MaybeAlign Align, 1721 const char *Name), 1722 "Use the version that explicitly specifies the " 1723 "loaded type instead") { 1724 return CreateAlignedLoad(Ptr->getType()->getPointerElementType(), Ptr, 1725 Align, Name); 1726 } 1727 // Deprecated [opaque pointer types] 1728 LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateAlignedLoad(Value *Ptr, 1729 MaybeAlign Align, 1730 const Twine &Name = ""), 1731 "Use the version that explicitly specifies the " 1732 "loaded type instead") { 1733 return CreateAlignedLoad(Ptr->getType()->getPointerElementType(), Ptr, 1734 Align, Name); 1735 } 1736 // Deprecated [opaque pointer types] 1737 LLVM_ATTRIBUTE_DEPRECATED(LoadInst *CreateAlignedLoad(Value *Ptr, 1738 MaybeAlign Align, 1739 bool isVolatile, 1740 const Twine &Name = ""), 1741 "Use the version that explicitly specifies the " 1742 "loaded type instead") { 1743 return CreateAlignedLoad(Ptr->getType()->getPointerElementType(), Ptr, 1744 Align, isVolatile, Name); 1745 } 1746 1747 StoreInst *CreateAlignedStore(Value *Val, Value *Ptr, MaybeAlign Align, 1748 bool isVolatile = false) { 1749 if (!Align) { 1750 const DataLayout &DL = BB->getModule()->getDataLayout(); 1751 Align = DL.getABITypeAlign(Val->getType()); 1752 } 1753 return Insert(new StoreInst(Val, Ptr, isVolatile, *Align)); 1754 } 1755 FenceInst *CreateFence(AtomicOrdering Ordering, 1756 SyncScope::ID SSID = SyncScope::System, 1757 const Twine &Name = "") { 1758 return Insert(new FenceInst(Context, Ordering, SSID), Name); 1759 } 1760 1761 AtomicCmpXchgInst * 1762 CreateAtomicCmpXchg(Value *Ptr, Value *Cmp, Value *New, MaybeAlign Align, 1763 AtomicOrdering SuccessOrdering, 1764 AtomicOrdering FailureOrdering, 1765 SyncScope::ID SSID = SyncScope::System) { 1766 if (!Align) { 1767 const DataLayout &DL = BB->getModule()->getDataLayout(); 1768 Align = llvm::Align(DL.getTypeStoreSize(New->getType())); 1769 } 1770 1771 return Insert(new AtomicCmpXchgInst(Ptr, Cmp, New, *Align, SuccessOrdering, 1772 FailureOrdering, SSID)); 1773 } 1774 1775 AtomicRMWInst *CreateAtomicRMW(AtomicRMWInst::BinOp Op, Value *Ptr, 1776 Value *Val, MaybeAlign Align, 1777 AtomicOrdering Ordering, 1778 SyncScope::ID SSID = SyncScope::System) { 1779 if (!Align) { 1780 const DataLayout &DL = BB->getModule()->getDataLayout(); 1781 Align = llvm::Align(DL.getTypeStoreSize(Val->getType())); 1782 } 1783 1784 return Insert(new AtomicRMWInst(Op, Ptr, Val, *Align, Ordering, SSID)); 1785 } 1786 1787 LLVM_ATTRIBUTE_DEPRECATED( 1788 Value *CreateGEP(Value *Ptr, ArrayRef<Value *> IdxList, 1789 const Twine &Name = ""), 1790 "Use the version with explicit element type instead") { 1791 return CreateGEP(Ptr->getType()->getScalarType()->getPointerElementType(), 1792 Ptr, IdxList, Name); 1793 } 1794 1795 Value *CreateGEP(Type *Ty, Value *Ptr, ArrayRef<Value *> IdxList, 1796 const Twine &Name = "") { 1797 if (auto *PC = dyn_cast<Constant>(Ptr)) { 1798 // Every index must be constant. 1799 size_t i, e; 1800 for (i = 0, e = IdxList.size(); i != e; ++i) 1801 if (!isa<Constant>(IdxList[i])) 1802 break; 1803 if (i == e) 1804 return Insert(Folder.CreateGetElementPtr(Ty, PC, IdxList), Name); 1805 } 1806 return Insert(GetElementPtrInst::Create(Ty, Ptr, IdxList), Name); 1807 } 1808 1809 LLVM_ATTRIBUTE_DEPRECATED( 1810 Value *CreateInBoundsGEP(Value *Ptr, ArrayRef<Value *> IdxList, 1811 const Twine &Name = ""), 1812 "Use the version with explicit element type instead") { 1813 return CreateInBoundsGEP( 1814 Ptr->getType()->getScalarType()->getPointerElementType(), Ptr, IdxList, 1815 Name); 1816 } 1817 1818 Value *CreateInBoundsGEP(Type *Ty, Value *Ptr, ArrayRef<Value *> IdxList, 1819 const Twine &Name = "") { 1820 if (auto *PC = dyn_cast<Constant>(Ptr)) { 1821 // Every index must be constant. 1822 size_t i, e; 1823 for (i = 0, e = IdxList.size(); i != e; ++i) 1824 if (!isa<Constant>(IdxList[i])) 1825 break; 1826 if (i == e) 1827 return Insert(Folder.CreateInBoundsGetElementPtr(Ty, PC, IdxList), 1828 Name); 1829 } 1830 return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, IdxList), Name); 1831 } 1832 1833 Value *CreateGEP(Type *Ty, Value *Ptr, Value *Idx, const Twine &Name = "") { 1834 if (auto *PC = dyn_cast<Constant>(Ptr)) 1835 if (auto *IC = dyn_cast<Constant>(Idx)) 1836 return Insert(Folder.CreateGetElementPtr(Ty, PC, IC), Name); 1837 return Insert(GetElementPtrInst::Create(Ty, Ptr, Idx), Name); 1838 } 1839 1840 Value *CreateInBoundsGEP(Type *Ty, Value *Ptr, Value *Idx, 1841 const Twine &Name = "") { 1842 if (auto *PC = dyn_cast<Constant>(Ptr)) 1843 if (auto *IC = dyn_cast<Constant>(Idx)) 1844 return Insert(Folder.CreateInBoundsGetElementPtr(Ty, PC, IC), Name); 1845 return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idx), Name); 1846 } 1847 1848 LLVM_ATTRIBUTE_DEPRECATED( 1849 Value *CreateConstGEP1_32(Value *Ptr, unsigned Idx0, 1850 const Twine &Name = ""), 1851 "Use the version with explicit element type instead") { 1852 return CreateConstGEP1_32( 1853 Ptr->getType()->getScalarType()->getPointerElementType(), Ptr, Idx0, 1854 Name); 1855 } 1856 1857 Value *CreateConstGEP1_32(Type *Ty, Value *Ptr, unsigned Idx0, 1858 const Twine &Name = "") { 1859 Value *Idx = ConstantInt::get(Type::getInt32Ty(Context), Idx0); 1860 1861 if (auto *PC = dyn_cast<Constant>(Ptr)) 1862 return Insert(Folder.CreateGetElementPtr(Ty, PC, Idx), Name); 1863 1864 return Insert(GetElementPtrInst::Create(Ty, Ptr, Idx), Name); 1865 } 1866 1867 Value *CreateConstInBoundsGEP1_32(Type *Ty, Value *Ptr, unsigned Idx0, 1868 const Twine &Name = "") { 1869 Value *Idx = ConstantInt::get(Type::getInt32Ty(Context), Idx0); 1870 1871 if (auto *PC = dyn_cast<Constant>(Ptr)) 1872 return Insert(Folder.CreateInBoundsGetElementPtr(Ty, PC, Idx), Name); 1873 1874 return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idx), Name); 1875 } 1876 1877 Value *CreateConstGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0, unsigned Idx1, 1878 const Twine &Name = "") { 1879 Value *Idxs[] = { 1880 ConstantInt::get(Type::getInt32Ty(Context), Idx0), 1881 ConstantInt::get(Type::getInt32Ty(Context), Idx1) 1882 }; 1883 1884 if (auto *PC = dyn_cast<Constant>(Ptr)) 1885 return Insert(Folder.CreateGetElementPtr(Ty, PC, Idxs), Name); 1886 1887 return Insert(GetElementPtrInst::Create(Ty, Ptr, Idxs), Name); 1888 } 1889 1890 Value *CreateConstInBoundsGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0, 1891 unsigned Idx1, const Twine &Name = "") { 1892 Value *Idxs[] = { 1893 ConstantInt::get(Type::getInt32Ty(Context), Idx0), 1894 ConstantInt::get(Type::getInt32Ty(Context), Idx1) 1895 }; 1896 1897 if (auto *PC = dyn_cast<Constant>(Ptr)) 1898 return Insert(Folder.CreateInBoundsGetElementPtr(Ty, PC, Idxs), Name); 1899 1900 return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idxs), Name); 1901 } 1902 1903 Value *CreateConstGEP1_64(Type *Ty, Value *Ptr, uint64_t Idx0, 1904 const Twine &Name = "") { 1905 Value *Idx = ConstantInt::get(Type::getInt64Ty(Context), Idx0); 1906 1907 if (auto *PC = dyn_cast<Constant>(Ptr)) 1908 return Insert(Folder.CreateGetElementPtr(Ty, PC, Idx), Name); 1909 1910 return Insert(GetElementPtrInst::Create(Ty, Ptr, Idx), Name); 1911 } 1912 1913 LLVM_ATTRIBUTE_DEPRECATED( 1914 Value *CreateConstGEP1_64(Value *Ptr, uint64_t Idx0, 1915 const Twine &Name = ""), 1916 "Use the version with explicit element type instead") { 1917 return CreateConstGEP1_64( 1918 Ptr->getType()->getScalarType()->getPointerElementType(), Ptr, Idx0, 1919 Name); 1920 } 1921 1922 Value *CreateConstInBoundsGEP1_64(Type *Ty, Value *Ptr, uint64_t Idx0, 1923 const Twine &Name = "") { 1924 Value *Idx = ConstantInt::get(Type::getInt64Ty(Context), Idx0); 1925 1926 if (auto *PC = dyn_cast<Constant>(Ptr)) 1927 return Insert(Folder.CreateInBoundsGetElementPtr(Ty, PC, Idx), Name); 1928 1929 return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idx), Name); 1930 } 1931 1932 LLVM_ATTRIBUTE_DEPRECATED( 1933 Value *CreateConstInBoundsGEP1_64(Value *Ptr, uint64_t Idx0, 1934 const Twine &Name = ""), 1935 "Use the version with explicit element type instead") { 1936 return CreateConstInBoundsGEP1_64( 1937 Ptr->getType()->getScalarType()->getPointerElementType(), Ptr, Idx0, 1938 Name); 1939 } 1940 1941 Value *CreateConstGEP2_64(Type *Ty, Value *Ptr, uint64_t Idx0, uint64_t Idx1, 1942 const Twine &Name = "") { 1943 Value *Idxs[] = { 1944 ConstantInt::get(Type::getInt64Ty(Context), Idx0), 1945 ConstantInt::get(Type::getInt64Ty(Context), Idx1) 1946 }; 1947 1948 if (auto *PC = dyn_cast<Constant>(Ptr)) 1949 return Insert(Folder.CreateGetElementPtr(Ty, PC, Idxs), Name); 1950 1951 return Insert(GetElementPtrInst::Create(Ty, Ptr, Idxs), Name); 1952 } 1953 1954 LLVM_ATTRIBUTE_DEPRECATED( 1955 Value *CreateConstGEP2_64(Value *Ptr, uint64_t Idx0, uint64_t Idx1, 1956 const Twine &Name = ""), 1957 "Use the version with explicit element type instead") { 1958 return CreateConstGEP2_64( 1959 Ptr->getType()->getScalarType()->getPointerElementType(), Ptr, Idx0, 1960 Idx1, Name); 1961 } 1962 1963 Value *CreateConstInBoundsGEP2_64(Type *Ty, Value *Ptr, uint64_t Idx0, 1964 uint64_t Idx1, const Twine &Name = "") { 1965 Value *Idxs[] = { 1966 ConstantInt::get(Type::getInt64Ty(Context), Idx0), 1967 ConstantInt::get(Type::getInt64Ty(Context), Idx1) 1968 }; 1969 1970 if (auto *PC = dyn_cast<Constant>(Ptr)) 1971 return Insert(Folder.CreateInBoundsGetElementPtr(Ty, PC, Idxs), Name); 1972 1973 return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idxs), Name); 1974 } 1975 1976 LLVM_ATTRIBUTE_DEPRECATED( 1977 Value *CreateConstInBoundsGEP2_64(Value *Ptr, uint64_t Idx0, 1978 uint64_t Idx1, const Twine &Name = ""), 1979 "Use the version with explicit element type instead") { 1980 return CreateConstInBoundsGEP2_64( 1981 Ptr->getType()->getScalarType()->getPointerElementType(), Ptr, Idx0, 1982 Idx1, Name); 1983 } 1984 1985 Value *CreateStructGEP(Type *Ty, Value *Ptr, unsigned Idx, 1986 const Twine &Name = "") { 1987 return CreateConstInBoundsGEP2_32(Ty, Ptr, 0, Idx, Name); 1988 } 1989 1990 LLVM_ATTRIBUTE_DEPRECATED( 1991 Value *CreateStructGEP(Value *Ptr, unsigned Idx, const Twine &Name = ""), 1992 "Use the version with explicit element type instead") { 1993 return CreateConstInBoundsGEP2_32( 1994 Ptr->getType()->getScalarType()->getPointerElementType(), Ptr, 0, Idx, 1995 Name); 1996 } 1997 1998 /// Same as CreateGlobalString, but return a pointer with "i8*" type 1999 /// instead of a pointer to array of i8. 2000 /// 2001 /// If no module is given via \p M, it is take from the insertion point basic 2002 /// block. 2003 Constant *CreateGlobalStringPtr(StringRef Str, const Twine &Name = "", 2004 unsigned AddressSpace = 0, 2005 Module *M = nullptr) { 2006 GlobalVariable *GV = CreateGlobalString(Str, Name, AddressSpace, M); 2007 Constant *Zero = ConstantInt::get(Type::getInt32Ty(Context), 0); 2008 Constant *Indices[] = {Zero, Zero}; 2009 return ConstantExpr::getInBoundsGetElementPtr(GV->getValueType(), GV, 2010 Indices); 2011 } 2012 2013 //===--------------------------------------------------------------------===// 2014 // Instruction creation methods: Cast/Conversion Operators 2015 //===--------------------------------------------------------------------===// 2016 2017 Value *CreateTrunc(Value *V, Type *DestTy, const Twine &Name = "") { 2018 return CreateCast(Instruction::Trunc, V, DestTy, Name); 2019 } 2020 2021 Value *CreateZExt(Value *V, Type *DestTy, const Twine &Name = "") { 2022 return CreateCast(Instruction::ZExt, V, DestTy, Name); 2023 } 2024 2025 Value *CreateSExt(Value *V, Type *DestTy, const Twine &Name = "") { 2026 return CreateCast(Instruction::SExt, V, DestTy, Name); 2027 } 2028 2029 /// Create a ZExt or Trunc from the integer value V to DestTy. Return 2030 /// the value untouched if the type of V is already DestTy. 2031 Value *CreateZExtOrTrunc(Value *V, Type *DestTy, 2032 const Twine &Name = "") { 2033 assert(V->getType()->isIntOrIntVectorTy() && 2034 DestTy->isIntOrIntVectorTy() && 2035 "Can only zero extend/truncate integers!"); 2036 Type *VTy = V->getType(); 2037 if (VTy->getScalarSizeInBits() < DestTy->getScalarSizeInBits()) 2038 return CreateZExt(V, DestTy, Name); 2039 if (VTy->getScalarSizeInBits() > DestTy->getScalarSizeInBits()) 2040 return CreateTrunc(V, DestTy, Name); 2041 return V; 2042 } 2043 2044 /// Create a SExt or Trunc from the integer value V to DestTy. Return 2045 /// the value untouched if the type of V is already DestTy. 2046 Value *CreateSExtOrTrunc(Value *V, Type *DestTy, 2047 const Twine &Name = "") { 2048 assert(V->getType()->isIntOrIntVectorTy() && 2049 DestTy->isIntOrIntVectorTy() && 2050 "Can only sign extend/truncate integers!"); 2051 Type *VTy = V->getType(); 2052 if (VTy->getScalarSizeInBits() < DestTy->getScalarSizeInBits()) 2053 return CreateSExt(V, DestTy, Name); 2054 if (VTy->getScalarSizeInBits() > DestTy->getScalarSizeInBits()) 2055 return CreateTrunc(V, DestTy, Name); 2056 return V; 2057 } 2058 2059 Value *CreateFPToUI(Value *V, Type *DestTy, const Twine &Name = "") { 2060 if (IsFPConstrained) 2061 return CreateConstrainedFPCast(Intrinsic::experimental_constrained_fptoui, 2062 V, DestTy, nullptr, Name); 2063 return CreateCast(Instruction::FPToUI, V, DestTy, Name); 2064 } 2065 2066 Value *CreateFPToSI(Value *V, Type *DestTy, const Twine &Name = "") { 2067 if (IsFPConstrained) 2068 return CreateConstrainedFPCast(Intrinsic::experimental_constrained_fptosi, 2069 V, DestTy, nullptr, Name); 2070 return CreateCast(Instruction::FPToSI, V, DestTy, Name); 2071 } 2072 2073 Value *CreateUIToFP(Value *V, Type *DestTy, const Twine &Name = ""){ 2074 if (IsFPConstrained) 2075 return CreateConstrainedFPCast(Intrinsic::experimental_constrained_uitofp, 2076 V, DestTy, nullptr, Name); 2077 return CreateCast(Instruction::UIToFP, V, DestTy, Name); 2078 } 2079 2080 Value *CreateSIToFP(Value *V, Type *DestTy, const Twine &Name = ""){ 2081 if (IsFPConstrained) 2082 return CreateConstrainedFPCast(Intrinsic::experimental_constrained_sitofp, 2083 V, DestTy, nullptr, Name); 2084 return CreateCast(Instruction::SIToFP, V, DestTy, Name); 2085 } 2086 2087 Value *CreateFPTrunc(Value *V, Type *DestTy, 2088 const Twine &Name = "") { 2089 if (IsFPConstrained) 2090 return CreateConstrainedFPCast( 2091 Intrinsic::experimental_constrained_fptrunc, V, DestTy, nullptr, 2092 Name); 2093 return CreateCast(Instruction::FPTrunc, V, DestTy, Name); 2094 } 2095 2096 Value *CreateFPExt(Value *V, Type *DestTy, const Twine &Name = "") { 2097 if (IsFPConstrained) 2098 return CreateConstrainedFPCast(Intrinsic::experimental_constrained_fpext, 2099 V, DestTy, nullptr, Name); 2100 return CreateCast(Instruction::FPExt, V, DestTy, Name); 2101 } 2102 2103 Value *CreatePtrToInt(Value *V, Type *DestTy, 2104 const Twine &Name = "") { 2105 return CreateCast(Instruction::PtrToInt, V, DestTy, Name); 2106 } 2107 2108 Value *CreateIntToPtr(Value *V, Type *DestTy, 2109 const Twine &Name = "") { 2110 return CreateCast(Instruction::IntToPtr, V, DestTy, Name); 2111 } 2112 2113 Value *CreateBitCast(Value *V, Type *DestTy, 2114 const Twine &Name = "") { 2115 return CreateCast(Instruction::BitCast, V, DestTy, Name); 2116 } 2117 2118 Value *CreateAddrSpaceCast(Value *V, Type *DestTy, 2119 const Twine &Name = "") { 2120 return CreateCast(Instruction::AddrSpaceCast, V, DestTy, Name); 2121 } 2122 2123 Value *CreateZExtOrBitCast(Value *V, Type *DestTy, 2124 const Twine &Name = "") { 2125 if (V->getType() == DestTy) 2126 return V; 2127 if (auto *VC = dyn_cast<Constant>(V)) 2128 return Insert(Folder.CreateZExtOrBitCast(VC, DestTy), Name); 2129 return Insert(CastInst::CreateZExtOrBitCast(V, DestTy), Name); 2130 } 2131 2132 Value *CreateSExtOrBitCast(Value *V, Type *DestTy, 2133 const Twine &Name = "") { 2134 if (V->getType() == DestTy) 2135 return V; 2136 if (auto *VC = dyn_cast<Constant>(V)) 2137 return Insert(Folder.CreateSExtOrBitCast(VC, DestTy), Name); 2138 return Insert(CastInst::CreateSExtOrBitCast(V, DestTy), Name); 2139 } 2140 2141 Value *CreateTruncOrBitCast(Value *V, Type *DestTy, 2142 const Twine &Name = "") { 2143 if (V->getType() == DestTy) 2144 return V; 2145 if (auto *VC = dyn_cast<Constant>(V)) 2146 return Insert(Folder.CreateTruncOrBitCast(VC, DestTy), Name); 2147 return Insert(CastInst::CreateTruncOrBitCast(V, DestTy), Name); 2148 } 2149 2150 Value *CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy, 2151 const Twine &Name = "") { 2152 if (V->getType() == DestTy) 2153 return V; 2154 if (auto *VC = dyn_cast<Constant>(V)) 2155 return Insert(Folder.CreateCast(Op, VC, DestTy), Name); 2156 return Insert(CastInst::Create(Op, V, DestTy), Name); 2157 } 2158 2159 Value *CreatePointerCast(Value *V, Type *DestTy, 2160 const Twine &Name = "") { 2161 if (V->getType() == DestTy) 2162 return V; 2163 if (auto *VC = dyn_cast<Constant>(V)) 2164 return Insert(Folder.CreatePointerCast(VC, DestTy), Name); 2165 return Insert(CastInst::CreatePointerCast(V, DestTy), Name); 2166 } 2167 2168 Value *CreatePointerBitCastOrAddrSpaceCast(Value *V, Type *DestTy, 2169 const Twine &Name = "") { 2170 if (V->getType() == DestTy) 2171 return V; 2172 2173 if (auto *VC = dyn_cast<Constant>(V)) { 2174 return Insert(Folder.CreatePointerBitCastOrAddrSpaceCast(VC, DestTy), 2175 Name); 2176 } 2177 2178 return Insert(CastInst::CreatePointerBitCastOrAddrSpaceCast(V, DestTy), 2179 Name); 2180 } 2181 2182 Value *CreateIntCast(Value *V, Type *DestTy, bool isSigned, 2183 const Twine &Name = "") { 2184 if (V->getType() == DestTy) 2185 return V; 2186 if (auto *VC = dyn_cast<Constant>(V)) 2187 return Insert(Folder.CreateIntCast(VC, DestTy, isSigned), Name); 2188 return Insert(CastInst::CreateIntegerCast(V, DestTy, isSigned), Name); 2189 } 2190 2191 Value *CreateBitOrPointerCast(Value *V, Type *DestTy, 2192 const Twine &Name = "") { 2193 if (V->getType() == DestTy) 2194 return V; 2195 if (V->getType()->isPtrOrPtrVectorTy() && DestTy->isIntOrIntVectorTy()) 2196 return CreatePtrToInt(V, DestTy, Name); 2197 if (V->getType()->isIntOrIntVectorTy() && DestTy->isPtrOrPtrVectorTy()) 2198 return CreateIntToPtr(V, DestTy, Name); 2199 2200 return CreateBitCast(V, DestTy, Name); 2201 } 2202 2203 Value *CreateFPCast(Value *V, Type *DestTy, const Twine &Name = "") { 2204 if (V->getType() == DestTy) 2205 return V; 2206 if (auto *VC = dyn_cast<Constant>(V)) 2207 return Insert(Folder.CreateFPCast(VC, DestTy), Name); 2208 return Insert(CastInst::CreateFPCast(V, DestTy), Name); 2209 } 2210 2211 CallInst *CreateConstrainedFPCast( 2212 Intrinsic::ID ID, Value *V, Type *DestTy, 2213 Instruction *FMFSource = nullptr, const Twine &Name = "", 2214 MDNode *FPMathTag = nullptr, 2215 Optional<RoundingMode> Rounding = None, 2216 Optional<fp::ExceptionBehavior> Except = None); 2217 2218 // Provided to resolve 'CreateIntCast(Ptr, Ptr, "...")', giving a 2219 // compile time error, instead of converting the string to bool for the 2220 // isSigned parameter. 2221 Value *CreateIntCast(Value *, Type *, const char *) = delete; 2222 2223 //===--------------------------------------------------------------------===// 2224 // Instruction creation methods: Compare Instructions 2225 //===--------------------------------------------------------------------===// 2226 2227 Value *CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name = "") { 2228 return CreateICmp(ICmpInst::ICMP_EQ, LHS, RHS, Name); 2229 } 2230 2231 Value *CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name = "") { 2232 return CreateICmp(ICmpInst::ICMP_NE, LHS, RHS, Name); 2233 } 2234 2235 Value *CreateICmpUGT(Value *LHS, Value *RHS, const Twine &Name = "") { 2236 return CreateICmp(ICmpInst::ICMP_UGT, LHS, RHS, Name); 2237 } 2238 2239 Value *CreateICmpUGE(Value *LHS, Value *RHS, const Twine &Name = "") { 2240 return CreateICmp(ICmpInst::ICMP_UGE, LHS, RHS, Name); 2241 } 2242 2243 Value *CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name = "") { 2244 return CreateICmp(ICmpInst::ICMP_ULT, LHS, RHS, Name); 2245 } 2246 2247 Value *CreateICmpULE(Value *LHS, Value *RHS, const Twine &Name = "") { 2248 return CreateICmp(ICmpInst::ICMP_ULE, LHS, RHS, Name); 2249 } 2250 2251 Value *CreateICmpSGT(Value *LHS, Value *RHS, const Twine &Name = "") { 2252 return CreateICmp(ICmpInst::ICMP_SGT, LHS, RHS, Name); 2253 } 2254 2255 Value *CreateICmpSGE(Value *LHS, Value *RHS, const Twine &Name = "") { 2256 return CreateICmp(ICmpInst::ICMP_SGE, LHS, RHS, Name); 2257 } 2258 2259 Value *CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name = "") { 2260 return CreateICmp(ICmpInst::ICMP_SLT, LHS, RHS, Name); 2261 } 2262 2263 Value *CreateICmpSLE(Value *LHS, Value *RHS, const Twine &Name = "") { 2264 return CreateICmp(ICmpInst::ICMP_SLE, LHS, RHS, Name); 2265 } 2266 2267 Value *CreateFCmpOEQ(Value *LHS, Value *RHS, const Twine &Name = "", 2268 MDNode *FPMathTag = nullptr) { 2269 return CreateFCmp(FCmpInst::FCMP_OEQ, LHS, RHS, Name, FPMathTag); 2270 } 2271 2272 Value *CreateFCmpOGT(Value *LHS, Value *RHS, const Twine &Name = "", 2273 MDNode *FPMathTag = nullptr) { 2274 return CreateFCmp(FCmpInst::FCMP_OGT, LHS, RHS, Name, FPMathTag); 2275 } 2276 2277 Value *CreateFCmpOGE(Value *LHS, Value *RHS, const Twine &Name = "", 2278 MDNode *FPMathTag = nullptr) { 2279 return CreateFCmp(FCmpInst::FCMP_OGE, LHS, RHS, Name, FPMathTag); 2280 } 2281 2282 Value *CreateFCmpOLT(Value *LHS, Value *RHS, const Twine &Name = "", 2283 MDNode *FPMathTag = nullptr) { 2284 return CreateFCmp(FCmpInst::FCMP_OLT, LHS, RHS, Name, FPMathTag); 2285 } 2286 2287 Value *CreateFCmpOLE(Value *LHS, Value *RHS, const Twine &Name = "", 2288 MDNode *FPMathTag = nullptr) { 2289 return CreateFCmp(FCmpInst::FCMP_OLE, LHS, RHS, Name, FPMathTag); 2290 } 2291 2292 Value *CreateFCmpONE(Value *LHS, Value *RHS, const Twine &Name = "", 2293 MDNode *FPMathTag = nullptr) { 2294 return CreateFCmp(FCmpInst::FCMP_ONE, LHS, RHS, Name, FPMathTag); 2295 } 2296 2297 Value *CreateFCmpORD(Value *LHS, Value *RHS, const Twine &Name = "", 2298 MDNode *FPMathTag = nullptr) { 2299 return CreateFCmp(FCmpInst::FCMP_ORD, LHS, RHS, Name, FPMathTag); 2300 } 2301 2302 Value *CreateFCmpUNO(Value *LHS, Value *RHS, const Twine &Name = "", 2303 MDNode *FPMathTag = nullptr) { 2304 return CreateFCmp(FCmpInst::FCMP_UNO, LHS, RHS, Name, FPMathTag); 2305 } 2306 2307 Value *CreateFCmpUEQ(Value *LHS, Value *RHS, const Twine &Name = "", 2308 MDNode *FPMathTag = nullptr) { 2309 return CreateFCmp(FCmpInst::FCMP_UEQ, LHS, RHS, Name, FPMathTag); 2310 } 2311 2312 Value *CreateFCmpUGT(Value *LHS, Value *RHS, const Twine &Name = "", 2313 MDNode *FPMathTag = nullptr) { 2314 return CreateFCmp(FCmpInst::FCMP_UGT, LHS, RHS, Name, FPMathTag); 2315 } 2316 2317 Value *CreateFCmpUGE(Value *LHS, Value *RHS, const Twine &Name = "", 2318 MDNode *FPMathTag = nullptr) { 2319 return CreateFCmp(FCmpInst::FCMP_UGE, LHS, RHS, Name, FPMathTag); 2320 } 2321 2322 Value *CreateFCmpULT(Value *LHS, Value *RHS, const Twine &Name = "", 2323 MDNode *FPMathTag = nullptr) { 2324 return CreateFCmp(FCmpInst::FCMP_ULT, LHS, RHS, Name, FPMathTag); 2325 } 2326 2327 Value *CreateFCmpULE(Value *LHS, Value *RHS, const Twine &Name = "", 2328 MDNode *FPMathTag = nullptr) { 2329 return CreateFCmp(FCmpInst::FCMP_ULE, LHS, RHS, Name, FPMathTag); 2330 } 2331 2332 Value *CreateFCmpUNE(Value *LHS, Value *RHS, const Twine &Name = "", 2333 MDNode *FPMathTag = nullptr) { 2334 return CreateFCmp(FCmpInst::FCMP_UNE, LHS, RHS, Name, FPMathTag); 2335 } 2336 2337 Value *CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS, 2338 const Twine &Name = "") { 2339 if (auto *LC = dyn_cast<Constant>(LHS)) 2340 if (auto *RC = dyn_cast<Constant>(RHS)) 2341 return Insert(Folder.CreateICmp(P, LC, RC), Name); 2342 return Insert(new ICmpInst(P, LHS, RHS), Name); 2343 } 2344 2345 // Create a quiet floating-point comparison (i.e. one that raises an FP 2346 // exception only in the case where an input is a signaling NaN). 2347 // Note that this differs from CreateFCmpS only if IsFPConstrained is true. 2348 Value *CreateFCmp(CmpInst::Predicate P, Value *LHS, Value *RHS, 2349 const Twine &Name = "", MDNode *FPMathTag = nullptr) { 2350 return CreateFCmpHelper(P, LHS, RHS, Name, FPMathTag, false); 2351 } 2352 2353 Value *CreateCmp(CmpInst::Predicate Pred, Value *LHS, Value *RHS, 2354 const Twine &Name = "", MDNode *FPMathTag = nullptr) { 2355 return CmpInst::isFPPredicate(Pred) 2356 ? CreateFCmp(Pred, LHS, RHS, Name, FPMathTag) 2357 : CreateICmp(Pred, LHS, RHS, Name); 2358 } 2359 2360 // Create a signaling floating-point comparison (i.e. one that raises an FP 2361 // exception whenever an input is any NaN, signaling or quiet). 2362 // Note that this differs from CreateFCmp only if IsFPConstrained is true. 2363 Value *CreateFCmpS(CmpInst::Predicate P, Value *LHS, Value *RHS, 2364 const Twine &Name = "", MDNode *FPMathTag = nullptr) { 2365 return CreateFCmpHelper(P, LHS, RHS, Name, FPMathTag, true); 2366 } 2367 2368 private: 2369 // Helper routine to create either a signaling or a quiet FP comparison. 2370 Value *CreateFCmpHelper(CmpInst::Predicate P, Value *LHS, Value *RHS, 2371 const Twine &Name, MDNode *FPMathTag, 2372 bool IsSignaling); 2373 2374 public: 2375 CallInst *CreateConstrainedFPCmp( 2376 Intrinsic::ID ID, CmpInst::Predicate P, Value *L, Value *R, 2377 const Twine &Name = "", Optional<fp::ExceptionBehavior> Except = None); 2378 2379 //===--------------------------------------------------------------------===// 2380 // Instruction creation methods: Other Instructions 2381 //===--------------------------------------------------------------------===// 2382 2383 PHINode *CreatePHI(Type *Ty, unsigned NumReservedValues, 2384 const Twine &Name = "") { 2385 PHINode *Phi = PHINode::Create(Ty, NumReservedValues); 2386 if (isa<FPMathOperator>(Phi)) 2387 setFPAttrs(Phi, nullptr /* MDNode* */, FMF); 2388 return Insert(Phi, Name); 2389 } 2390 2391 CallInst *CreateCall(FunctionType *FTy, Value *Callee, 2392 ArrayRef<Value *> Args = None, const Twine &Name = "", 2393 MDNode *FPMathTag = nullptr) { 2394 CallInst *CI = CallInst::Create(FTy, Callee, Args, DefaultOperandBundles); 2395 if (IsFPConstrained) 2396 setConstrainedFPCallAttr(CI); 2397 if (isa<FPMathOperator>(CI)) 2398 setFPAttrs(CI, FPMathTag, FMF); 2399 return Insert(CI, Name); 2400 } 2401 2402 CallInst *CreateCall(FunctionType *FTy, Value *Callee, ArrayRef<Value *> Args, 2403 ArrayRef<OperandBundleDef> OpBundles, 2404 const Twine &Name = "", MDNode *FPMathTag = nullptr) { 2405 CallInst *CI = CallInst::Create(FTy, Callee, Args, OpBundles); 2406 if (IsFPConstrained) 2407 setConstrainedFPCallAttr(CI); 2408 if (isa<FPMathOperator>(CI)) 2409 setFPAttrs(CI, FPMathTag, FMF); 2410 return Insert(CI, Name); 2411 } 2412 2413 CallInst *CreateCall(FunctionCallee Callee, ArrayRef<Value *> Args = None, 2414 const Twine &Name = "", MDNode *FPMathTag = nullptr) { 2415 return CreateCall(Callee.getFunctionType(), Callee.getCallee(), Args, Name, 2416 FPMathTag); 2417 } 2418 2419 CallInst *CreateCall(FunctionCallee Callee, ArrayRef<Value *> Args, 2420 ArrayRef<OperandBundleDef> OpBundles, 2421 const Twine &Name = "", MDNode *FPMathTag = nullptr) { 2422 return CreateCall(Callee.getFunctionType(), Callee.getCallee(), Args, 2423 OpBundles, Name, FPMathTag); 2424 } 2425 2426 CallInst *CreateConstrainedFPCall( 2427 Function *Callee, ArrayRef<Value *> Args, const Twine &Name = "", 2428 Optional<RoundingMode> Rounding = None, 2429 Optional<fp::ExceptionBehavior> Except = None); 2430 2431 Value *CreateSelect(Value *C, Value *True, Value *False, 2432 const Twine &Name = "", Instruction *MDFrom = nullptr); 2433 2434 VAArgInst *CreateVAArg(Value *List, Type *Ty, const Twine &Name = "") { 2435 return Insert(new VAArgInst(List, Ty), Name); 2436 } 2437 2438 Value *CreateExtractElement(Value *Vec, Value *Idx, 2439 const Twine &Name = "") { 2440 if (auto *VC = dyn_cast<Constant>(Vec)) 2441 if (auto *IC = dyn_cast<Constant>(Idx)) 2442 return Insert(Folder.CreateExtractElement(VC, IC), Name); 2443 return Insert(ExtractElementInst::Create(Vec, Idx), Name); 2444 } 2445 2446 Value *CreateExtractElement(Value *Vec, uint64_t Idx, 2447 const Twine &Name = "") { 2448 return CreateExtractElement(Vec, getInt64(Idx), Name); 2449 } 2450 2451 Value *CreateInsertElement(Value *Vec, Value *NewElt, Value *Idx, 2452 const Twine &Name = "") { 2453 if (auto *VC = dyn_cast<Constant>(Vec)) 2454 if (auto *NC = dyn_cast<Constant>(NewElt)) 2455 if (auto *IC = dyn_cast<Constant>(Idx)) 2456 return Insert(Folder.CreateInsertElement(VC, NC, IC), Name); 2457 return Insert(InsertElementInst::Create(Vec, NewElt, Idx), Name); 2458 } 2459 2460 Value *CreateInsertElement(Value *Vec, Value *NewElt, uint64_t Idx, 2461 const Twine &Name = "") { 2462 return CreateInsertElement(Vec, NewElt, getInt64(Idx), Name); 2463 } 2464 2465 Value *CreateShuffleVector(Value *V1, Value *V2, Value *Mask, 2466 const Twine &Name = "") { 2467 SmallVector<int, 16> IntMask; 2468 ShuffleVectorInst::getShuffleMask(cast<Constant>(Mask), IntMask); 2469 return CreateShuffleVector(V1, V2, IntMask, Name); 2470 } 2471 2472 LLVM_ATTRIBUTE_DEPRECATED(Value *CreateShuffleVector(Value *V1, Value *V2, 2473 ArrayRef<uint32_t> Mask, 2474 const Twine &Name = ""), 2475 "Pass indices as 'int' instead") { 2476 SmallVector<int, 16> IntMask; 2477 IntMask.assign(Mask.begin(), Mask.end()); 2478 return CreateShuffleVector(V1, V2, IntMask, Name); 2479 } 2480 2481 /// See class ShuffleVectorInst for a description of the mask representation. 2482 Value *CreateShuffleVector(Value *V1, Value *V2, ArrayRef<int> Mask, 2483 const Twine &Name = "") { 2484 if (auto *V1C = dyn_cast<Constant>(V1)) 2485 if (auto *V2C = dyn_cast<Constant>(V2)) 2486 return Insert(Folder.CreateShuffleVector(V1C, V2C, Mask), Name); 2487 return Insert(new ShuffleVectorInst(V1, V2, Mask), Name); 2488 } 2489 2490 /// Create a unary shuffle. The second vector operand of the IR instruction 2491 /// is poison. 2492 Value *CreateShuffleVector(Value *V, ArrayRef<int> Mask, 2493 const Twine &Name = "") { 2494 return CreateShuffleVector(V, PoisonValue::get(V->getType()), Mask, Name); 2495 } 2496 2497 Value *CreateExtractValue(Value *Agg, 2498 ArrayRef<unsigned> Idxs, 2499 const Twine &Name = "") { 2500 if (auto *AggC = dyn_cast<Constant>(Agg)) 2501 return Insert(Folder.CreateExtractValue(AggC, Idxs), Name); 2502 return Insert(ExtractValueInst::Create(Agg, Idxs), Name); 2503 } 2504 2505 Value *CreateInsertValue(Value *Agg, Value *Val, 2506 ArrayRef<unsigned> Idxs, 2507 const Twine &Name = "") { 2508 if (auto *AggC = dyn_cast<Constant>(Agg)) 2509 if (auto *ValC = dyn_cast<Constant>(Val)) 2510 return Insert(Folder.CreateInsertValue(AggC, ValC, Idxs), Name); 2511 return Insert(InsertValueInst::Create(Agg, Val, Idxs), Name); 2512 } 2513 2514 LandingPadInst *CreateLandingPad(Type *Ty, unsigned NumClauses, 2515 const Twine &Name = "") { 2516 return Insert(LandingPadInst::Create(Ty, NumClauses), Name); 2517 } 2518 2519 Value *CreateFreeze(Value *V, const Twine &Name = "") { 2520 return Insert(new FreezeInst(V), Name); 2521 } 2522 2523 //===--------------------------------------------------------------------===// 2524 // Utility creation methods 2525 //===--------------------------------------------------------------------===// 2526 2527 /// Return an i1 value testing if \p Arg is null. 2528 Value *CreateIsNull(Value *Arg, const Twine &Name = "") { 2529 return CreateICmpEQ(Arg, Constant::getNullValue(Arg->getType()), 2530 Name); 2531 } 2532 2533 /// Return an i1 value testing if \p Arg is not null. 2534 Value *CreateIsNotNull(Value *Arg, const Twine &Name = "") { 2535 return CreateICmpNE(Arg, Constant::getNullValue(Arg->getType()), 2536 Name); 2537 } 2538 2539 /// Return the i64 difference between two pointer values, dividing out 2540 /// the size of the pointed-to objects. 2541 /// 2542 /// This is intended to implement C-style pointer subtraction. As such, the 2543 /// pointers must be appropriately aligned for their element types and 2544 /// pointing into the same object. 2545 Value *CreatePtrDiff(Value *LHS, Value *RHS, const Twine &Name = ""); 2546 2547 /// Create a launder.invariant.group intrinsic call. If Ptr type is 2548 /// different from pointer to i8, it's casted to pointer to i8 in the same 2549 /// address space before call and casted back to Ptr type after call. 2550 Value *CreateLaunderInvariantGroup(Value *Ptr); 2551 2552 /// \brief Create a strip.invariant.group intrinsic call. If Ptr type is 2553 /// different from pointer to i8, it's casted to pointer to i8 in the same 2554 /// address space before call and casted back to Ptr type after call. 2555 Value *CreateStripInvariantGroup(Value *Ptr); 2556 2557 /// Return a vector value that contains the vector V reversed 2558 Value *CreateVectorReverse(Value *V, const Twine &Name = ""); 2559 2560 /// Return a vector splice intrinsic if using scalable vectors, otherwise 2561 /// return a shufflevector. If the immediate is positive, a vector is 2562 /// extracted from concat(V1, V2), starting at Imm. If the immediate 2563 /// is negative, we extract -Imm elements from V1 and the remaining 2564 /// elements from V2. Imm is a signed integer in the range 2565 /// -VL <= Imm < VL (where VL is the runtime vector length of the 2566 /// source/result vector) 2567 Value *CreateVectorSplice(Value *V1, Value *V2, int64_t Imm, 2568 const Twine &Name = ""); 2569 2570 /// Return a vector value that contains \arg V broadcasted to \p 2571 /// NumElts elements. 2572 Value *CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name = ""); 2573 2574 /// Return a vector value that contains \arg V broadcasted to \p 2575 /// EC elements. 2576 Value *CreateVectorSplat(ElementCount EC, Value *V, const Twine &Name = ""); 2577 2578 /// Return a value that has been extracted from a larger integer type. 2579 Value *CreateExtractInteger(const DataLayout &DL, Value *From, 2580 IntegerType *ExtractedTy, uint64_t Offset, 2581 const Twine &Name); 2582 2583 Value *CreatePreserveArrayAccessIndex(Type *ElTy, Value *Base, 2584 unsigned Dimension, unsigned LastIndex, 2585 MDNode *DbgInfo); 2586 2587 Value *CreatePreserveUnionAccessIndex(Value *Base, unsigned FieldIndex, 2588 MDNode *DbgInfo); 2589 2590 Value *CreatePreserveStructAccessIndex(Type *ElTy, Value *Base, 2591 unsigned Index, unsigned FieldIndex, 2592 MDNode *DbgInfo); 2593 2594 private: 2595 /// Helper function that creates an assume intrinsic call that 2596 /// represents an alignment assumption on the provided pointer \p PtrValue 2597 /// with offset \p OffsetValue and alignment value \p AlignValue. 2598 CallInst *CreateAlignmentAssumptionHelper(const DataLayout &DL, 2599 Value *PtrValue, Value *AlignValue, 2600 Value *OffsetValue); 2601 2602 public: 2603 /// Create an assume intrinsic call that represents an alignment 2604 /// assumption on the provided pointer. 2605 /// 2606 /// An optional offset can be provided, and if it is provided, the offset 2607 /// must be subtracted from the provided pointer to get the pointer with the 2608 /// specified alignment. 2609 CallInst *CreateAlignmentAssumption(const DataLayout &DL, Value *PtrValue, 2610 unsigned Alignment, 2611 Value *OffsetValue = nullptr); 2612 2613 /// Create an assume intrinsic call that represents an alignment 2614 /// assumption on the provided pointer. 2615 /// 2616 /// An optional offset can be provided, and if it is provided, the offset 2617 /// must be subtracted from the provided pointer to get the pointer with the 2618 /// specified alignment. 2619 /// 2620 /// This overload handles the condition where the Alignment is dependent 2621 /// on an existing value rather than a static value. 2622 CallInst *CreateAlignmentAssumption(const DataLayout &DL, Value *PtrValue, 2623 Value *Alignment, 2624 Value *OffsetValue = nullptr); 2625 }; 2626 2627 /// This provides a uniform API for creating instructions and inserting 2628 /// them into a basic block: either at the end of a BasicBlock, or at a specific 2629 /// iterator location in a block. 2630 /// 2631 /// Note that the builder does not expose the full generality of LLVM 2632 /// instructions. For access to extra instruction properties, use the mutators 2633 /// (e.g. setVolatile) on the instructions after they have been 2634 /// created. Convenience state exists to specify fast-math flags and fp-math 2635 /// tags. 2636 /// 2637 /// The first template argument specifies a class to use for creating constants. 2638 /// This defaults to creating minimally folded constants. The second template 2639 /// argument allows clients to specify custom insertion hooks that are called on 2640 /// every newly created insertion. 2641 template <typename FolderTy = ConstantFolder, 2642 typename InserterTy = IRBuilderDefaultInserter> 2643 class IRBuilder : public IRBuilderBase { 2644 private: 2645 FolderTy Folder; 2646 InserterTy Inserter; 2647 2648 public: 2649 IRBuilder(LLVMContext &C, FolderTy Folder, InserterTy Inserter = InserterTy(), 2650 MDNode *FPMathTag = nullptr, 2651 ArrayRef<OperandBundleDef> OpBundles = None) 2652 : IRBuilderBase(C, this->Folder, this->Inserter, FPMathTag, OpBundles), 2653 Folder(Folder), Inserter(Inserter) {} 2654 2655 explicit IRBuilder(LLVMContext &C, MDNode *FPMathTag = nullptr, 2656 ArrayRef<OperandBundleDef> OpBundles = None) 2657 : IRBuilderBase(C, this->Folder, this->Inserter, FPMathTag, OpBundles) {} 2658 2659 explicit IRBuilder(BasicBlock *TheBB, FolderTy Folder, 2660 MDNode *FPMathTag = nullptr, 2661 ArrayRef<OperandBundleDef> OpBundles = None) 2662 : IRBuilderBase(TheBB->getContext(), this->Folder, this->Inserter, 2663 FPMathTag, OpBundles), Folder(Folder) { 2664 SetInsertPoint(TheBB); 2665 } 2666 2667 explicit IRBuilder(BasicBlock *TheBB, MDNode *FPMathTag = nullptr, 2668 ArrayRef<OperandBundleDef> OpBundles = None) 2669 : IRBuilderBase(TheBB->getContext(), this->Folder, this->Inserter, 2670 FPMathTag, OpBundles) { 2671 SetInsertPoint(TheBB); 2672 } 2673 2674 explicit IRBuilder(Instruction *IP, MDNode *FPMathTag = nullptr, 2675 ArrayRef<OperandBundleDef> OpBundles = None) 2676 : IRBuilderBase(IP->getContext(), this->Folder, this->Inserter, 2677 FPMathTag, OpBundles) { 2678 SetInsertPoint(IP); 2679 } 2680 2681 IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, FolderTy Folder, 2682 MDNode *FPMathTag = nullptr, 2683 ArrayRef<OperandBundleDef> OpBundles = None) 2684 : IRBuilderBase(TheBB->getContext(), this->Folder, this->Inserter, 2685 FPMathTag, OpBundles), Folder(Folder) { 2686 SetInsertPoint(TheBB, IP); 2687 } 2688 2689 IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, 2690 MDNode *FPMathTag = nullptr, 2691 ArrayRef<OperandBundleDef> OpBundles = None) 2692 : IRBuilderBase(TheBB->getContext(), this->Folder, this->Inserter, 2693 FPMathTag, OpBundles) { 2694 SetInsertPoint(TheBB, IP); 2695 } 2696 2697 /// Avoid copying the full IRBuilder. Prefer using InsertPointGuard 2698 /// or FastMathFlagGuard instead. 2699 IRBuilder(const IRBuilder &) = delete; 2700 getInserter()2701 InserterTy &getInserter() { return Inserter; } 2702 }; 2703 2704 // Create wrappers for C Binding types (see CBindingWrapping.h). 2705 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef) 2706 2707 } // end namespace llvm 2708 2709 #endif // LLVM_IR_IRBUILDER_H 2710