Home | History | Annotate | Download | only in IR
      1 //===---- llvm/IRBuilder.h - Builder for LLVM Instructions ------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines the IRBuilder class, which is used as a convenient way
     11 // to create LLVM instructions with a consistent and simplified interface.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #ifndef LLVM_IR_IRBUILDER_H
     16 #define LLVM_IR_IRBUILDER_H
     17 
     18 #include "llvm-c/Types.h"
     19 #include "llvm/ADT/ArrayRef.h"
     20 #include "llvm/ADT/None.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/DebugLoc.h"
     29 #include "llvm/IR/DerivedTypes.h"
     30 #include "llvm/IR/Function.h"
     31 #include "llvm/IR/GlobalVariable.h"
     32 #include "llvm/IR/InstrTypes.h"
     33 #include "llvm/IR/Instruction.h"
     34 #include "llvm/IR/Instructions.h"
     35 #include "llvm/IR/Intrinsics.h"
     36 #include "llvm/IR/LLVMContext.h"
     37 #include "llvm/IR/Module.h"
     38 #include "llvm/IR/Operator.h"
     39 #include "llvm/IR/Type.h"
     40 #include "llvm/IR/Value.h"
     41 #include "llvm/IR/ValueHandle.h"
     42 #include "llvm/Support/AtomicOrdering.h"
     43 #include "llvm/Support/CBindingWrapping.h"
     44 #include "llvm/Support/Casting.h"
     45 #include <algorithm>
     46 #include <cassert>
     47 #include <cstddef>
     48 #include <cstdint>
     49 #include <functional>
     50 
     51 namespace llvm {
     52 
     53 class APInt;
     54 class MDNode;
     55 class Module;
     56 class Use;
     57 
     58 /// \brief 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 protected:
     65   void InsertHelper(Instruction *I, const Twine &Name,
     66                     BasicBlock *BB, BasicBlock::iterator InsertPt) const {
     67     if (BB) BB->getInstList().insert(InsertPt, I);
     68     I->setName(Name);
     69   }
     70 };
     71 
     72 /// Provides an 'InsertHelper' that calls a user-provided callback after
     73 /// performing the default insertion.
     74 class IRBuilderCallbackInserter : IRBuilderDefaultInserter {
     75   std::function<void(Instruction *)> Callback;
     76 
     77 public:
     78   IRBuilderCallbackInserter(std::function<void(Instruction *)> Callback)
     79       : Callback(std::move(Callback)) {}
     80 
     81 protected:
     82   void InsertHelper(Instruction *I, const Twine &Name,
     83                     BasicBlock *BB, BasicBlock::iterator InsertPt) const {
     84     IRBuilderDefaultInserter::InsertHelper(I, Name, BB, InsertPt);
     85     Callback(I);
     86   }
     87 };
     88 
     89 /// \brief Common base class shared among various IRBuilders.
     90 class IRBuilderBase {
     91   DebugLoc CurDbgLocation;
     92 
     93 protected:
     94   BasicBlock *BB;
     95   BasicBlock::iterator InsertPt;
     96   LLVMContext &Context;
     97 
     98   MDNode *DefaultFPMathTag;
     99   FastMathFlags FMF;
    100 
    101   ArrayRef<OperandBundleDef> DefaultOperandBundles;
    102 
    103 public:
    104   IRBuilderBase(LLVMContext &context, MDNode *FPMathTag = nullptr,
    105                 ArrayRef<OperandBundleDef> OpBundles = None)
    106       : Context(context), DefaultFPMathTag(FPMathTag),
    107         DefaultOperandBundles(OpBundles) {
    108     ClearInsertionPoint();
    109   }
    110 
    111   //===--------------------------------------------------------------------===//
    112   // Builder configuration methods
    113   //===--------------------------------------------------------------------===//
    114 
    115   /// \brief Clear the insertion point: created instructions will not be
    116   /// inserted into a block.
    117   void ClearInsertionPoint() {
    118     BB = nullptr;
    119     InsertPt = BasicBlock::iterator();
    120   }
    121 
    122   BasicBlock *GetInsertBlock() const { return BB; }
    123   BasicBlock::iterator GetInsertPoint() const { return InsertPt; }
    124   LLVMContext &getContext() const { return Context; }
    125 
    126   /// \brief This specifies that created instructions should be appended to the
    127   /// end of the specified block.
    128   void SetInsertPoint(BasicBlock *TheBB) {
    129     BB = TheBB;
    130     InsertPt = BB->end();
    131   }
    132 
    133   /// \brief This specifies that created instructions should be inserted before
    134   /// the specified instruction.
    135   void SetInsertPoint(Instruction *I) {
    136     BB = I->getParent();
    137     InsertPt = I->getIterator();
    138     assert(InsertPt != BB->end() && "Can't read debug loc from end()");
    139     SetCurrentDebugLocation(I->getDebugLoc());
    140   }
    141 
    142   /// \brief This specifies that created instructions should be inserted at the
    143   /// specified point.
    144   void SetInsertPoint(BasicBlock *TheBB, BasicBlock::iterator IP) {
    145     BB = TheBB;
    146     InsertPt = IP;
    147     if (IP != TheBB->end())
    148       SetCurrentDebugLocation(IP->getDebugLoc());
    149   }
    150 
    151   /// \brief Set location information used by debugging information.
    152   void SetCurrentDebugLocation(DebugLoc L) { CurDbgLocation = std::move(L); }
    153 
    154   /// \brief Get location information used by debugging information.
    155   const DebugLoc &getCurrentDebugLocation() const { return CurDbgLocation; }
    156 
    157   /// \brief If this builder has a current debug location, set it on the
    158   /// specified instruction.
    159   void SetInstDebugLocation(Instruction *I) const {
    160     if (CurDbgLocation)
    161       I->setDebugLoc(CurDbgLocation);
    162   }
    163 
    164   /// \brief Get the return type of the current function that we're emitting
    165   /// into.
    166   Type *getCurrentFunctionReturnType() const;
    167 
    168   /// InsertPoint - A saved insertion point.
    169   class InsertPoint {
    170     BasicBlock *Block = nullptr;
    171     BasicBlock::iterator Point;
    172 
    173   public:
    174     /// \brief Creates a new insertion point which doesn't point to anything.
    175     InsertPoint() = default;
    176 
    177     /// \brief Creates a new insertion point at the given location.
    178     InsertPoint(BasicBlock *InsertBlock, BasicBlock::iterator InsertPoint)
    179       : Block(InsertBlock), Point(InsertPoint) {}
    180 
    181     /// \brief Returns true if this insert point is set.
    182     bool isSet() const { return (Block != nullptr); }
    183 
    184     BasicBlock *getBlock() const { return Block; }
    185     BasicBlock::iterator getPoint() const { return Point; }
    186   };
    187 
    188   /// \brief Returns the current insert point.
    189   InsertPoint saveIP() const {
    190     return InsertPoint(GetInsertBlock(), GetInsertPoint());
    191   }
    192 
    193   /// \brief Returns the current insert point, clearing it in the process.
    194   InsertPoint saveAndClearIP() {
    195     InsertPoint IP(GetInsertBlock(), GetInsertPoint());
    196     ClearInsertionPoint();
    197     return IP;
    198   }
    199 
    200   /// \brief Sets the current insert point to a previously-saved location.
    201   void restoreIP(InsertPoint IP) {
    202     if (IP.isSet())
    203       SetInsertPoint(IP.getBlock(), IP.getPoint());
    204     else
    205       ClearInsertionPoint();
    206   }
    207 
    208   /// \brief Get the floating point math metadata being used.
    209   MDNode *getDefaultFPMathTag() const { return DefaultFPMathTag; }
    210 
    211   /// \brief Get the flags to be applied to created floating point ops
    212   FastMathFlags getFastMathFlags() const { return FMF; }
    213 
    214   /// \brief Clear the fast-math flags.
    215   void clearFastMathFlags() { FMF.clear(); }
    216 
    217   /// \brief Set the floating point math metadata to be used.
    218   void setDefaultFPMathTag(MDNode *FPMathTag) { DefaultFPMathTag = FPMathTag; }
    219 
    220   /// \brief Set the fast-math flags to be used with generated fp-math operators
    221   void setFastMathFlags(FastMathFlags NewFMF) { FMF = NewFMF; }
    222 
    223   //===--------------------------------------------------------------------===//
    224   // RAII helpers.
    225   //===--------------------------------------------------------------------===//
    226 
    227   // \brief RAII object that stores the current insertion point and restores it
    228   // when the object is destroyed. This includes the debug location.
    229   class InsertPointGuard {
    230     IRBuilderBase &Builder;
    231     AssertingVH<BasicBlock> Block;
    232     BasicBlock::iterator Point;
    233     DebugLoc DbgLoc;
    234 
    235   public:
    236     InsertPointGuard(IRBuilderBase &B)
    237         : Builder(B), Block(B.GetInsertBlock()), Point(B.GetInsertPoint()),
    238           DbgLoc(B.getCurrentDebugLocation()) {}
    239 
    240     InsertPointGuard(const InsertPointGuard &) = delete;
    241     InsertPointGuard &operator=(const InsertPointGuard &) = delete;
    242 
    243     ~InsertPointGuard() {
    244       Builder.restoreIP(InsertPoint(Block, Point));
    245       Builder.SetCurrentDebugLocation(DbgLoc);
    246     }
    247   };
    248 
    249   // \brief RAII object that stores the current fast math settings and restores
    250   // them when the object is destroyed.
    251   class FastMathFlagGuard {
    252     IRBuilderBase &Builder;
    253     FastMathFlags FMF;
    254     MDNode *FPMathTag;
    255 
    256   public:
    257     FastMathFlagGuard(IRBuilderBase &B)
    258         : Builder(B), FMF(B.FMF), FPMathTag(B.DefaultFPMathTag) {}
    259 
    260     FastMathFlagGuard(const FastMathFlagGuard &) = delete;
    261     FastMathFlagGuard &operator=(const FastMathFlagGuard &) = delete;
    262 
    263     ~FastMathFlagGuard() {
    264       Builder.FMF = FMF;
    265       Builder.DefaultFPMathTag = FPMathTag;
    266     }
    267   };
    268 
    269   //===--------------------------------------------------------------------===//
    270   // Miscellaneous creation methods.
    271   //===--------------------------------------------------------------------===//
    272 
    273   /// \brief Make a new global variable with initializer type i8*
    274   ///
    275   /// Make a new global variable with an initializer that has array of i8 type
    276   /// filled in with the null terminated string value specified.  The new global
    277   /// variable will be marked mergable with any others of the same contents.  If
    278   /// Name is specified, it is the name of the global variable created.
    279   GlobalVariable *CreateGlobalString(StringRef Str, const Twine &Name = "",
    280                                      unsigned AddressSpace = 0);
    281 
    282   /// \brief Get a constant value representing either true or false.
    283   ConstantInt *getInt1(bool V) {
    284     return ConstantInt::get(getInt1Ty(), V);
    285   }
    286 
    287   /// \brief Get the constant value for i1 true.
    288   ConstantInt *getTrue() {
    289     return ConstantInt::getTrue(Context);
    290   }
    291 
    292   /// \brief Get the constant value for i1 false.
    293   ConstantInt *getFalse() {
    294     return ConstantInt::getFalse(Context);
    295   }
    296 
    297   /// \brief Get a constant 8-bit value.
    298   ConstantInt *getInt8(uint8_t C) {
    299     return ConstantInt::get(getInt8Ty(), C);
    300   }
    301 
    302   /// \brief Get a constant 16-bit value.
    303   ConstantInt *getInt16(uint16_t C) {
    304     return ConstantInt::get(getInt16Ty(), C);
    305   }
    306 
    307   /// \brief Get a constant 32-bit value.
    308   ConstantInt *getInt32(uint32_t C) {
    309     return ConstantInt::get(getInt32Ty(), C);
    310   }
    311 
    312   /// \brief Get a constant 64-bit value.
    313   ConstantInt *getInt64(uint64_t C) {
    314     return ConstantInt::get(getInt64Ty(), C);
    315   }
    316 
    317   /// \brief Get a constant N-bit value, zero extended or truncated from
    318   /// a 64-bit value.
    319   ConstantInt *getIntN(unsigned N, uint64_t C) {
    320     return ConstantInt::get(getIntNTy(N), C);
    321   }
    322 
    323   /// \brief Get a constant integer value.
    324   ConstantInt *getInt(const APInt &AI) {
    325     return ConstantInt::get(Context, AI);
    326   }
    327 
    328   //===--------------------------------------------------------------------===//
    329   // Type creation methods
    330   //===--------------------------------------------------------------------===//
    331 
    332   /// \brief Fetch the type representing a single bit
    333   IntegerType *getInt1Ty() {
    334     return Type::getInt1Ty(Context);
    335   }
    336 
    337   /// \brief Fetch the type representing an 8-bit integer.
    338   IntegerType *getInt8Ty() {
    339     return Type::getInt8Ty(Context);
    340   }
    341 
    342   /// \brief Fetch the type representing a 16-bit integer.
    343   IntegerType *getInt16Ty() {
    344     return Type::getInt16Ty(Context);
    345   }
    346 
    347   /// \brief Fetch the type representing a 32-bit integer.
    348   IntegerType *getInt32Ty() {
    349     return Type::getInt32Ty(Context);
    350   }
    351 
    352   /// \brief Fetch the type representing a 64-bit integer.
    353   IntegerType *getInt64Ty() {
    354     return Type::getInt64Ty(Context);
    355   }
    356 
    357   /// \brief Fetch the type representing a 128-bit integer.
    358   IntegerType *getInt128Ty() { return Type::getInt128Ty(Context); }
    359 
    360   /// \brief Fetch the type representing an N-bit integer.
    361   IntegerType *getIntNTy(unsigned N) {
    362     return Type::getIntNTy(Context, N);
    363   }
    364 
    365   /// \brief Fetch the type representing a 16-bit floating point value.
    366   Type *getHalfTy() {
    367     return Type::getHalfTy(Context);
    368   }
    369 
    370   /// \brief Fetch the type representing a 32-bit floating point value.
    371   Type *getFloatTy() {
    372     return Type::getFloatTy(Context);
    373   }
    374 
    375   /// \brief Fetch the type representing a 64-bit floating point value.
    376   Type *getDoubleTy() {
    377     return Type::getDoubleTy(Context);
    378   }
    379 
    380   /// \brief Fetch the type representing void.
    381   Type *getVoidTy() {
    382     return Type::getVoidTy(Context);
    383   }
    384 
    385   /// \brief Fetch the type representing a pointer to an 8-bit integer value.
    386   PointerType *getInt8PtrTy(unsigned AddrSpace = 0) {
    387     return Type::getInt8PtrTy(Context, AddrSpace);
    388   }
    389 
    390   /// \brief Fetch the type representing a pointer to an integer value.
    391   IntegerType *getIntPtrTy(const DataLayout &DL, unsigned AddrSpace = 0) {
    392     return DL.getIntPtrType(Context, AddrSpace);
    393   }
    394 
    395   //===--------------------------------------------------------------------===//
    396   // Intrinsic creation methods
    397   //===--------------------------------------------------------------------===//
    398 
    399   /// \brief Create and insert a memset to the specified pointer and the
    400   /// specified value.
    401   ///
    402   /// If the pointer isn't an i8*, it will be converted. If a TBAA tag is
    403   /// specified, it will be added to the instruction. Likewise with alias.scope
    404   /// and noalias tags.
    405   CallInst *CreateMemSet(Value *Ptr, Value *Val, uint64_t Size, unsigned Align,
    406                          bool isVolatile = false, MDNode *TBAATag = nullptr,
    407                          MDNode *ScopeTag = nullptr,
    408                          MDNode *NoAliasTag = nullptr) {
    409     return CreateMemSet(Ptr, Val, getInt64(Size), Align, isVolatile,
    410                         TBAATag, ScopeTag, NoAliasTag);
    411   }
    412 
    413   CallInst *CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,
    414                          bool isVolatile = false, MDNode *TBAATag = nullptr,
    415                          MDNode *ScopeTag = nullptr,
    416                          MDNode *NoAliasTag = nullptr);
    417 
    418   /// \brief Create and insert a memcpy between the specified pointers.
    419   ///
    420   /// If the pointers aren't i8*, they will be converted.  If a TBAA tag is
    421   /// specified, it will be added to the instruction. Likewise with alias.scope
    422   /// and noalias tags.
    423   CallInst *CreateMemCpy(Value *Dst, Value *Src, uint64_t Size, unsigned Align,
    424                          bool isVolatile = false, MDNode *TBAATag = nullptr,
    425                          MDNode *TBAAStructTag = nullptr,
    426                          MDNode *ScopeTag = nullptr,
    427                          MDNode *NoAliasTag = nullptr) {
    428     return CreateMemCpy(Dst, Src, getInt64(Size), Align, isVolatile, TBAATag,
    429                         TBAAStructTag, ScopeTag, NoAliasTag);
    430   }
    431 
    432   CallInst *CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align,
    433                          bool isVolatile = false, MDNode *TBAATag = nullptr,
    434                          MDNode *TBAAStructTag = nullptr,
    435                          MDNode *ScopeTag = nullptr,
    436                          MDNode *NoAliasTag = nullptr);
    437 
    438   /// \brief Create and insert an element unordered-atomic memcpy between the
    439   /// specified pointers.
    440   ///
    441   /// If the pointers aren't i8*, they will be converted.  If a TBAA tag is
    442   /// specified, it will be added to the instruction. Likewise with alias.scope
    443   /// and noalias tags.
    444   CallInst *CreateElementUnorderedAtomicMemCpy(
    445       Value *Dst, Value *Src, uint64_t Size, uint32_t ElementSize,
    446       MDNode *TBAATag = nullptr, MDNode *TBAAStructTag = nullptr,
    447       MDNode *ScopeTag = nullptr, MDNode *NoAliasTag = nullptr) {
    448     return CreateElementUnorderedAtomicMemCpy(
    449         Dst, Src, getInt64(Size), ElementSize, TBAATag, TBAAStructTag, ScopeTag,
    450         NoAliasTag);
    451   }
    452 
    453   CallInst *CreateElementUnorderedAtomicMemCpy(
    454       Value *Dst, Value *Src, Value *Size, uint32_t ElementSize,
    455       MDNode *TBAATag = nullptr, MDNode *TBAAStructTag = nullptr,
    456       MDNode *ScopeTag = nullptr, MDNode *NoAliasTag = nullptr);
    457 
    458   /// \brief Create and insert a memmove between the specified
    459   /// pointers.
    460   ///
    461   /// If the pointers aren't i8*, they will be converted.  If a TBAA tag is
    462   /// specified, it will be added to the instruction. Likewise with alias.scope
    463   /// and noalias tags.
    464   CallInst *CreateMemMove(Value *Dst, Value *Src, uint64_t Size, unsigned Align,
    465                           bool isVolatile = false, MDNode *TBAATag = nullptr,
    466                           MDNode *ScopeTag = nullptr,
    467                           MDNode *NoAliasTag = nullptr) {
    468     return CreateMemMove(Dst, Src, getInt64(Size), Align, isVolatile,
    469                          TBAATag, ScopeTag, NoAliasTag);
    470   }
    471 
    472   CallInst *CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align,
    473                           bool isVolatile = false, MDNode *TBAATag = nullptr,
    474                           MDNode *ScopeTag = nullptr,
    475                           MDNode *NoAliasTag = nullptr);
    476 
    477   /// \brief Create a vector fadd reduction intrinsic of the source vector.
    478   /// The first parameter is a scalar accumulator value for ordered reductions.
    479   CallInst *CreateFAddReduce(Value *Acc, Value *Src);
    480 
    481   /// \brief Create a vector fmul reduction intrinsic of the source vector.
    482   /// The first parameter is a scalar accumulator value for ordered reductions.
    483   CallInst *CreateFMulReduce(Value *Acc, Value *Src);
    484 
    485   /// \brief Create a vector int add reduction intrinsic of the source vector.
    486   CallInst *CreateAddReduce(Value *Src);
    487 
    488   /// \brief Create a vector int mul reduction intrinsic of the source vector.
    489   CallInst *CreateMulReduce(Value *Src);
    490 
    491   /// \brief Create a vector int AND reduction intrinsic of the source vector.
    492   CallInst *CreateAndReduce(Value *Src);
    493 
    494   /// \brief Create a vector int OR reduction intrinsic of the source vector.
    495   CallInst *CreateOrReduce(Value *Src);
    496 
    497   /// \brief Create a vector int XOR reduction intrinsic of the source vector.
    498   CallInst *CreateXorReduce(Value *Src);
    499 
    500   /// \brief Create a vector integer max reduction intrinsic of the source
    501   /// vector.
    502   CallInst *CreateIntMaxReduce(Value *Src, bool IsSigned = false);
    503 
    504   /// \brief Create a vector integer min reduction intrinsic of the source
    505   /// vector.
    506   CallInst *CreateIntMinReduce(Value *Src, bool IsSigned = false);
    507 
    508   /// \brief Create a vector float max reduction intrinsic of the source
    509   /// vector.
    510   CallInst *CreateFPMaxReduce(Value *Src, bool NoNaN = false);
    511 
    512   /// \brief Create a vector float min reduction intrinsic of the source
    513   /// vector.
    514   CallInst *CreateFPMinReduce(Value *Src, bool NoNaN = false);
    515 
    516   /// \brief Create a lifetime.start intrinsic.
    517   ///
    518   /// If the pointer isn't i8* it will be converted.
    519   CallInst *CreateLifetimeStart(Value *Ptr, ConstantInt *Size = nullptr);
    520 
    521   /// \brief Create a lifetime.end intrinsic.
    522   ///
    523   /// If the pointer isn't i8* it will be converted.
    524   CallInst *CreateLifetimeEnd(Value *Ptr, ConstantInt *Size = nullptr);
    525 
    526   /// Create a call to invariant.start intrinsic.
    527   ///
    528   /// If the pointer isn't i8* it will be converted.
    529   CallInst *CreateInvariantStart(Value *Ptr, ConstantInt *Size = nullptr);
    530 
    531   /// \brief Create a call to Masked Load intrinsic
    532   CallInst *CreateMaskedLoad(Value *Ptr, unsigned Align, Value *Mask,
    533                              Value *PassThru = nullptr, const Twine &Name = "");
    534 
    535   /// \brief Create a call to Masked Store intrinsic
    536   CallInst *CreateMaskedStore(Value *Val, Value *Ptr, unsigned Align,
    537                               Value *Mask);
    538 
    539   /// \brief Create a call to Masked Gather intrinsic
    540   CallInst *CreateMaskedGather(Value *Ptrs, unsigned Align,
    541                                Value *Mask = nullptr,
    542                                Value *PassThru = nullptr,
    543                                const Twine& Name = "");
    544 
    545   /// \brief Create a call to Masked Scatter intrinsic
    546   CallInst *CreateMaskedScatter(Value *Val, Value *Ptrs, unsigned Align,
    547                                 Value *Mask = nullptr);
    548 
    549   /// \brief Create an assume intrinsic call that allows the optimizer to
    550   /// assume that the provided condition will be true.
    551   CallInst *CreateAssumption(Value *Cond);
    552 
    553   /// \brief Create a call to the experimental.gc.statepoint intrinsic to
    554   /// start a new statepoint sequence.
    555   CallInst *CreateGCStatepointCall(uint64_t ID, uint32_t NumPatchBytes,
    556                                    Value *ActualCallee,
    557                                    ArrayRef<Value *> CallArgs,
    558                                    ArrayRef<Value *> DeoptArgs,
    559                                    ArrayRef<Value *> GCArgs,
    560                                    const Twine &Name = "");
    561 
    562   /// \brief Create a call to the experimental.gc.statepoint intrinsic to
    563   /// start a new statepoint sequence.
    564   CallInst *CreateGCStatepointCall(uint64_t ID, uint32_t NumPatchBytes,
    565                                    Value *ActualCallee, uint32_t Flags,
    566                                    ArrayRef<Use> CallArgs,
    567                                    ArrayRef<Use> TransitionArgs,
    568                                    ArrayRef<Use> DeoptArgs,
    569                                    ArrayRef<Value *> GCArgs,
    570                                    const Twine &Name = "");
    571 
    572   // \brief Conveninence function for the common case when CallArgs are filled
    573   // in using makeArrayRef(CS.arg_begin(), CS.arg_end()); Use needs to be
    574   // .get()'ed to get the Value pointer.
    575   CallInst *CreateGCStatepointCall(uint64_t ID, uint32_t NumPatchBytes,
    576                                    Value *ActualCallee, ArrayRef<Use> CallArgs,
    577                                    ArrayRef<Value *> DeoptArgs,
    578                                    ArrayRef<Value *> GCArgs,
    579                                    const Twine &Name = "");
    580 
    581   /// brief Create an invoke to the experimental.gc.statepoint intrinsic to
    582   /// start a new statepoint sequence.
    583   InvokeInst *
    584   CreateGCStatepointInvoke(uint64_t ID, uint32_t NumPatchBytes,
    585                            Value *ActualInvokee, BasicBlock *NormalDest,
    586                            BasicBlock *UnwindDest, ArrayRef<Value *> InvokeArgs,
    587                            ArrayRef<Value *> DeoptArgs,
    588                            ArrayRef<Value *> GCArgs, const Twine &Name = "");
    589 
    590   /// brief Create an invoke to the experimental.gc.statepoint intrinsic to
    591   /// start a new statepoint sequence.
    592   InvokeInst *CreateGCStatepointInvoke(
    593       uint64_t ID, uint32_t NumPatchBytes, Value *ActualInvokee,
    594       BasicBlock *NormalDest, BasicBlock *UnwindDest, uint32_t Flags,
    595       ArrayRef<Use> InvokeArgs, ArrayRef<Use> TransitionArgs,
    596       ArrayRef<Use> DeoptArgs, ArrayRef<Value *> GCArgs,
    597       const Twine &Name = "");
    598 
    599   // Conveninence function for the common case when CallArgs are filled in using
    600   // makeArrayRef(CS.arg_begin(), CS.arg_end()); Use needs to be .get()'ed to
    601   // get the Value *.
    602   InvokeInst *
    603   CreateGCStatepointInvoke(uint64_t ID, uint32_t NumPatchBytes,
    604                            Value *ActualInvokee, BasicBlock *NormalDest,
    605                            BasicBlock *UnwindDest, ArrayRef<Use> InvokeArgs,
    606                            ArrayRef<Value *> DeoptArgs,
    607                            ArrayRef<Value *> GCArgs, const Twine &Name = "");
    608 
    609   /// \brief Create a call to the experimental.gc.result intrinsic to extract
    610   /// the result from a call wrapped in a statepoint.
    611   CallInst *CreateGCResult(Instruction *Statepoint,
    612                            Type *ResultType,
    613                            const Twine &Name = "");
    614 
    615   /// \brief Create a call to the experimental.gc.relocate intrinsics to
    616   /// project the relocated value of one pointer from the statepoint.
    617   CallInst *CreateGCRelocate(Instruction *Statepoint,
    618                              int BaseOffset,
    619                              int DerivedOffset,
    620                              Type *ResultType,
    621                              const Twine &Name = "");
    622 
    623   /// Create a call to intrinsic \p ID with 2 operands which is mangled on the
    624   /// first type.
    625   CallInst *CreateBinaryIntrinsic(Intrinsic::ID ID,
    626                                   Value *LHS, Value *RHS,
    627                                   const Twine &Name = "");
    628 
    629   /// Create call to the minnum intrinsic.
    630   CallInst *CreateMinNum(Value *LHS, Value *RHS, const Twine &Name = "") {
    631     return CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS, Name);
    632   }
    633 
    634   /// Create call to the maxnum intrinsic.
    635   CallInst *CreateMaxNum(Value *LHS, Value *RHS, const Twine &Name = "") {
    636     return CreateBinaryIntrinsic(Intrinsic::minnum, LHS, RHS, Name);
    637   }
    638 
    639 private:
    640   /// \brief Create a call to a masked intrinsic with given Id.
    641   CallInst *CreateMaskedIntrinsic(Intrinsic::ID Id, ArrayRef<Value *> Ops,
    642                                   ArrayRef<Type *> OverloadedTypes,
    643                                   const Twine &Name = "");
    644 
    645   Value *getCastedInt8PtrValue(Value *Ptr);
    646 };
    647 
    648 /// \brief This provides a uniform API for creating instructions and inserting
    649 /// them into a basic block: either at the end of a BasicBlock, or at a specific
    650 /// iterator location in a block.
    651 ///
    652 /// Note that the builder does not expose the full generality of LLVM
    653 /// instructions.  For access to extra instruction properties, use the mutators
    654 /// (e.g. setVolatile) on the instructions after they have been
    655 /// created. Convenience state exists to specify fast-math flags and fp-math
    656 /// tags.
    657 ///
    658 /// The first template argument specifies a class to use for creating constants.
    659 /// This defaults to creating minimally folded constants.  The second template
    660 /// argument allows clients to specify custom insertion hooks that are called on
    661 /// every newly created insertion.
    662 template <typename T = ConstantFolder,
    663           typename Inserter = IRBuilderDefaultInserter>
    664 class IRBuilder : public IRBuilderBase, public Inserter {
    665   T Folder;
    666 
    667 public:
    668   IRBuilder(LLVMContext &C, const T &F, Inserter I = Inserter(),
    669             MDNode *FPMathTag = nullptr,
    670             ArrayRef<OperandBundleDef> OpBundles = None)
    671       : IRBuilderBase(C, FPMathTag, OpBundles), Inserter(std::move(I)),
    672         Folder(F) {}
    673 
    674   explicit IRBuilder(LLVMContext &C, MDNode *FPMathTag = nullptr,
    675                      ArrayRef<OperandBundleDef> OpBundles = None)
    676       : IRBuilderBase(C, FPMathTag, OpBundles), Folder() {}
    677 
    678   explicit IRBuilder(BasicBlock *TheBB, const T &F, MDNode *FPMathTag = nullptr,
    679                      ArrayRef<OperandBundleDef> OpBundles = None)
    680       : IRBuilderBase(TheBB->getContext(), FPMathTag, OpBundles), Folder(F) {
    681     SetInsertPoint(TheBB);
    682   }
    683 
    684   explicit IRBuilder(BasicBlock *TheBB, MDNode *FPMathTag = nullptr,
    685                      ArrayRef<OperandBundleDef> OpBundles = None)
    686       : IRBuilderBase(TheBB->getContext(), FPMathTag, OpBundles), Folder() {
    687     SetInsertPoint(TheBB);
    688   }
    689 
    690   explicit IRBuilder(Instruction *IP, MDNode *FPMathTag = nullptr,
    691                      ArrayRef<OperandBundleDef> OpBundles = None)
    692       : IRBuilderBase(IP->getContext(), FPMathTag, OpBundles), Folder() {
    693     SetInsertPoint(IP);
    694   }
    695 
    696   IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, const T &F,
    697             MDNode *FPMathTag = nullptr,
    698             ArrayRef<OperandBundleDef> OpBundles = None)
    699       : IRBuilderBase(TheBB->getContext(), FPMathTag, OpBundles), Folder(F) {
    700     SetInsertPoint(TheBB, IP);
    701   }
    702 
    703   IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP,
    704             MDNode *FPMathTag = nullptr,
    705             ArrayRef<OperandBundleDef> OpBundles = None)
    706       : IRBuilderBase(TheBB->getContext(), FPMathTag, OpBundles), Folder() {
    707     SetInsertPoint(TheBB, IP);
    708   }
    709 
    710   /// \brief Get the constant folder being used.
    711   const T &getFolder() { return Folder; }
    712 
    713   /// \brief Insert and return the specified instruction.
    714   template<typename InstTy>
    715   InstTy *Insert(InstTy *I, const Twine &Name = "") const {
    716     this->InsertHelper(I, Name, BB, InsertPt);
    717     this->SetInstDebugLocation(I);
    718     return I;
    719   }
    720 
    721   /// \brief No-op overload to handle constants.
    722   Constant *Insert(Constant *C, const Twine& = "") const {
    723     return C;
    724   }
    725 
    726   //===--------------------------------------------------------------------===//
    727   // Instruction creation methods: Terminators
    728   //===--------------------------------------------------------------------===//
    729 
    730 private:
    731   /// \brief Helper to add branch weight and unpredictable metadata onto an
    732   /// instruction.
    733   /// \returns The annotated instruction.
    734   template <typename InstTy>
    735   InstTy *addBranchMetadata(InstTy *I, MDNode *Weights, MDNode *Unpredictable) {
    736     if (Weights)
    737       I->setMetadata(LLVMContext::MD_prof, Weights);
    738     if (Unpredictable)
    739       I->setMetadata(LLVMContext::MD_unpredictable, Unpredictable);
    740     return I;
    741   }
    742 
    743 public:
    744   /// \brief Create a 'ret void' instruction.
    745   ReturnInst *CreateRetVoid() {
    746     return Insert(ReturnInst::Create(Context));
    747   }
    748 
    749   /// \brief Create a 'ret <val>' instruction.
    750   ReturnInst *CreateRet(Value *V) {
    751     return Insert(ReturnInst::Create(Context, V));
    752   }
    753 
    754   /// \brief Create a sequence of N insertvalue instructions,
    755   /// with one Value from the retVals array each, that build a aggregate
    756   /// return value one value at a time, and a ret instruction to return
    757   /// the resulting aggregate value.
    758   ///
    759   /// This is a convenience function for code that uses aggregate return values
    760   /// as a vehicle for having multiple return values.
    761   ReturnInst *CreateAggregateRet(Value *const *retVals, unsigned N) {
    762     Value *V = UndefValue::get(getCurrentFunctionReturnType());
    763     for (unsigned i = 0; i != N; ++i)
    764       V = CreateInsertValue(V, retVals[i], i, "mrv");
    765     return Insert(ReturnInst::Create(Context, V));
    766   }
    767 
    768   /// \brief Create an unconditional 'br label X' instruction.
    769   BranchInst *CreateBr(BasicBlock *Dest) {
    770     return Insert(BranchInst::Create(Dest));
    771   }
    772 
    773   /// \brief Create a conditional 'br Cond, TrueDest, FalseDest'
    774   /// instruction.
    775   BranchInst *CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False,
    776                            MDNode *BranchWeights = nullptr,
    777                            MDNode *Unpredictable = nullptr) {
    778     return Insert(addBranchMetadata(BranchInst::Create(True, False, Cond),
    779                                     BranchWeights, Unpredictable));
    780   }
    781 
    782   /// \brief Create a conditional 'br Cond, TrueDest, FalseDest'
    783   /// instruction. Copy branch meta data if available.
    784   BranchInst *CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False,
    785                            Instruction *MDSrc) {
    786     BranchInst *Br = BranchInst::Create(True, False, Cond);
    787     if (MDSrc) {
    788       unsigned WL[4] = {LLVMContext::MD_prof, LLVMContext::MD_unpredictable,
    789                         LLVMContext::MD_make_implicit, LLVMContext::MD_dbg};
    790       Br->copyMetadata(*MDSrc, makeArrayRef(&WL[0], 4));
    791     }
    792     return Insert(Br);
    793   }
    794 
    795   /// \brief Create a switch instruction with the specified value, default dest,
    796   /// and with a hint for the number of cases that will be added (for efficient
    797   /// allocation).
    798   SwitchInst *CreateSwitch(Value *V, BasicBlock *Dest, unsigned NumCases = 10,
    799                            MDNode *BranchWeights = nullptr,
    800                            MDNode *Unpredictable = nullptr) {
    801     return Insert(addBranchMetadata(SwitchInst::Create(V, Dest, NumCases),
    802                                     BranchWeights, Unpredictable));
    803   }
    804 
    805   /// \brief Create an indirect branch instruction with the specified address
    806   /// operand, with an optional hint for the number of destinations that will be
    807   /// added (for efficient allocation).
    808   IndirectBrInst *CreateIndirectBr(Value *Addr, unsigned NumDests = 10) {
    809     return Insert(IndirectBrInst::Create(Addr, NumDests));
    810   }
    811 
    812   /// \brief Create an invoke instruction.
    813   InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
    814                            BasicBlock *UnwindDest,
    815                            ArrayRef<Value *> Args = None,
    816                            const Twine &Name = "") {
    817     return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args),
    818                   Name);
    819   }
    820   InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
    821                            BasicBlock *UnwindDest, ArrayRef<Value *> Args,
    822                            ArrayRef<OperandBundleDef> OpBundles,
    823                            const Twine &Name = "") {
    824     return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args,
    825                                      OpBundles), Name);
    826   }
    827 
    828   ResumeInst *CreateResume(Value *Exn) {
    829     return Insert(ResumeInst::Create(Exn));
    830   }
    831 
    832   CleanupReturnInst *CreateCleanupRet(CleanupPadInst *CleanupPad,
    833                                       BasicBlock *UnwindBB = nullptr) {
    834     return Insert(CleanupReturnInst::Create(CleanupPad, UnwindBB));
    835   }
    836 
    837   CatchSwitchInst *CreateCatchSwitch(Value *ParentPad, BasicBlock *UnwindBB,
    838                                      unsigned NumHandlers,
    839                                      const Twine &Name = "") {
    840     return Insert(CatchSwitchInst::Create(ParentPad, UnwindBB, NumHandlers),
    841                   Name);
    842   }
    843 
    844   CatchPadInst *CreateCatchPad(Value *ParentPad, ArrayRef<Value *> Args,
    845                                const Twine &Name = "") {
    846     return Insert(CatchPadInst::Create(ParentPad, Args), Name);
    847   }
    848 
    849   CleanupPadInst *CreateCleanupPad(Value *ParentPad,
    850                                    ArrayRef<Value *> Args = None,
    851                                    const Twine &Name = "") {
    852     return Insert(CleanupPadInst::Create(ParentPad, Args), Name);
    853   }
    854 
    855   CatchReturnInst *CreateCatchRet(CatchPadInst *CatchPad, BasicBlock *BB) {
    856     return Insert(CatchReturnInst::Create(CatchPad, BB));
    857   }
    858 
    859   UnreachableInst *CreateUnreachable() {
    860     return Insert(new UnreachableInst(Context));
    861   }
    862 
    863   //===--------------------------------------------------------------------===//
    864   // Instruction creation methods: Binary Operators
    865   //===--------------------------------------------------------------------===//
    866 private:
    867   BinaryOperator *CreateInsertNUWNSWBinOp(BinaryOperator::BinaryOps Opc,
    868                                           Value *LHS, Value *RHS,
    869                                           const Twine &Name,
    870                                           bool HasNUW, bool HasNSW) {
    871     BinaryOperator *BO = Insert(BinaryOperator::Create(Opc, LHS, RHS), Name);
    872     if (HasNUW) BO->setHasNoUnsignedWrap();
    873     if (HasNSW) BO->setHasNoSignedWrap();
    874     return BO;
    875   }
    876 
    877   Instruction *AddFPMathAttributes(Instruction *I,
    878                                    MDNode *FPMathTag,
    879                                    FastMathFlags FMF) const {
    880     if (!FPMathTag)
    881       FPMathTag = DefaultFPMathTag;
    882     if (FPMathTag)
    883       I->setMetadata(LLVMContext::MD_fpmath, FPMathTag);
    884     I->setFastMathFlags(FMF);
    885     return I;
    886   }
    887 
    888 public:
    889   Value *CreateAdd(Value *LHS, Value *RHS, const Twine &Name = "",
    890                    bool HasNUW = false, bool HasNSW = false) {
    891     if (Constant *LC = dyn_cast<Constant>(LHS))
    892       if (Constant *RC = dyn_cast<Constant>(RHS))
    893         return Insert(Folder.CreateAdd(LC, RC, HasNUW, HasNSW), Name);
    894     return CreateInsertNUWNSWBinOp(Instruction::Add, LHS, RHS, Name,
    895                                    HasNUW, HasNSW);
    896   }
    897   Value *CreateNSWAdd(Value *LHS, Value *RHS, const Twine &Name = "") {
    898     return CreateAdd(LHS, RHS, Name, false, true);
    899   }
    900   Value *CreateNUWAdd(Value *LHS, Value *RHS, const Twine &Name = "") {
    901     return CreateAdd(LHS, RHS, Name, true, false);
    902   }
    903   Value *CreateFAdd(Value *LHS, Value *RHS, const Twine &Name = "",
    904                     MDNode *FPMathTag = nullptr) {
    905     if (Constant *LC = dyn_cast<Constant>(LHS))
    906       if (Constant *RC = dyn_cast<Constant>(RHS))
    907         return Insert(Folder.CreateFAdd(LC, RC), Name);
    908     return Insert(AddFPMathAttributes(BinaryOperator::CreateFAdd(LHS, RHS),
    909                                       FPMathTag, FMF), Name);
    910   }
    911   Value *CreateSub(Value *LHS, Value *RHS, const Twine &Name = "",
    912                    bool HasNUW = false, bool HasNSW = false) {
    913     if (Constant *LC = dyn_cast<Constant>(LHS))
    914       if (Constant *RC = dyn_cast<Constant>(RHS))
    915         return Insert(Folder.CreateSub(LC, RC, HasNUW, HasNSW), Name);
    916     return CreateInsertNUWNSWBinOp(Instruction::Sub, LHS, RHS, Name,
    917                                    HasNUW, HasNSW);
    918   }
    919   Value *CreateNSWSub(Value *LHS, Value *RHS, const Twine &Name = "") {
    920     return CreateSub(LHS, RHS, Name, false, true);
    921   }
    922   Value *CreateNUWSub(Value *LHS, Value *RHS, const Twine &Name = "") {
    923     return CreateSub(LHS, RHS, Name, true, false);
    924   }
    925   Value *CreateFSub(Value *LHS, Value *RHS, const Twine &Name = "",
    926                     MDNode *FPMathTag = nullptr) {
    927     if (Constant *LC = dyn_cast<Constant>(LHS))
    928       if (Constant *RC = dyn_cast<Constant>(RHS))
    929         return Insert(Folder.CreateFSub(LC, RC), Name);
    930     return Insert(AddFPMathAttributes(BinaryOperator::CreateFSub(LHS, RHS),
    931                                       FPMathTag, FMF), Name);
    932   }
    933   Value *CreateMul(Value *LHS, Value *RHS, const Twine &Name = "",
    934                    bool HasNUW = false, bool HasNSW = false) {
    935     if (Constant *LC = dyn_cast<Constant>(LHS))
    936       if (Constant *RC = dyn_cast<Constant>(RHS))
    937         return Insert(Folder.CreateMul(LC, RC, HasNUW, HasNSW), Name);
    938     return CreateInsertNUWNSWBinOp(Instruction::Mul, LHS, RHS, Name,
    939                                    HasNUW, HasNSW);
    940   }
    941   Value *CreateNSWMul(Value *LHS, Value *RHS, const Twine &Name = "") {
    942     return CreateMul(LHS, RHS, Name, false, true);
    943   }
    944   Value *CreateNUWMul(Value *LHS, Value *RHS, const Twine &Name = "") {
    945     return CreateMul(LHS, RHS, Name, true, false);
    946   }
    947   Value *CreateFMul(Value *LHS, Value *RHS, const Twine &Name = "",
    948                     MDNode *FPMathTag = nullptr) {
    949     if (Constant *LC = dyn_cast<Constant>(LHS))
    950       if (Constant *RC = dyn_cast<Constant>(RHS))
    951         return Insert(Folder.CreateFMul(LC, RC), Name);
    952     return Insert(AddFPMathAttributes(BinaryOperator::CreateFMul(LHS, RHS),
    953                                       FPMathTag, FMF), Name);
    954   }
    955   Value *CreateUDiv(Value *LHS, Value *RHS, const Twine &Name = "",
    956                     bool isExact = false) {
    957     if (Constant *LC = dyn_cast<Constant>(LHS))
    958       if (Constant *RC = dyn_cast<Constant>(RHS))
    959         return Insert(Folder.CreateUDiv(LC, RC, isExact), Name);
    960     if (!isExact)
    961       return Insert(BinaryOperator::CreateUDiv(LHS, RHS), Name);
    962     return Insert(BinaryOperator::CreateExactUDiv(LHS, RHS), Name);
    963   }
    964   Value *CreateExactUDiv(Value *LHS, Value *RHS, const Twine &Name = "") {
    965     return CreateUDiv(LHS, RHS, Name, true);
    966   }
    967   Value *CreateSDiv(Value *LHS, Value *RHS, const Twine &Name = "",
    968                     bool isExact = false) {
    969     if (Constant *LC = dyn_cast<Constant>(LHS))
    970       if (Constant *RC = dyn_cast<Constant>(RHS))
    971         return Insert(Folder.CreateSDiv(LC, RC, isExact), Name);
    972     if (!isExact)
    973       return Insert(BinaryOperator::CreateSDiv(LHS, RHS), Name);
    974     return Insert(BinaryOperator::CreateExactSDiv(LHS, RHS), Name);
    975   }
    976   Value *CreateExactSDiv(Value *LHS, Value *RHS, const Twine &Name = "") {
    977     return CreateSDiv(LHS, RHS, Name, true);
    978   }
    979   Value *CreateFDiv(Value *LHS, Value *RHS, const Twine &Name = "",
    980                     MDNode *FPMathTag = nullptr) {
    981     if (Constant *LC = dyn_cast<Constant>(LHS))
    982       if (Constant *RC = dyn_cast<Constant>(RHS))
    983         return Insert(Folder.CreateFDiv(LC, RC), Name);
    984     return Insert(AddFPMathAttributes(BinaryOperator::CreateFDiv(LHS, RHS),
    985                                       FPMathTag, FMF), Name);
    986   }
    987   Value *CreateURem(Value *LHS, Value *RHS, const Twine &Name = "") {
    988     if (Constant *LC = dyn_cast<Constant>(LHS))
    989       if (Constant *RC = dyn_cast<Constant>(RHS))
    990         return Insert(Folder.CreateURem(LC, RC), Name);
    991     return Insert(BinaryOperator::CreateURem(LHS, RHS), Name);
    992   }
    993   Value *CreateSRem(Value *LHS, Value *RHS, const Twine &Name = "") {
    994     if (Constant *LC = dyn_cast<Constant>(LHS))
    995       if (Constant *RC = dyn_cast<Constant>(RHS))
    996         return Insert(Folder.CreateSRem(LC, RC), Name);
    997     return Insert(BinaryOperator::CreateSRem(LHS, RHS), Name);
    998   }
    999   Value *CreateFRem(Value *LHS, Value *RHS, const Twine &Name = "",
   1000                     MDNode *FPMathTag = nullptr) {
   1001     if (Constant *LC = dyn_cast<Constant>(LHS))
   1002       if (Constant *RC = dyn_cast<Constant>(RHS))
   1003         return Insert(Folder.CreateFRem(LC, RC), Name);
   1004     return Insert(AddFPMathAttributes(BinaryOperator::CreateFRem(LHS, RHS),
   1005                                       FPMathTag, FMF), Name);
   1006   }
   1007 
   1008   Value *CreateShl(Value *LHS, Value *RHS, const Twine &Name = "",
   1009                    bool HasNUW = false, bool HasNSW = false) {
   1010     if (Constant *LC = dyn_cast<Constant>(LHS))
   1011       if (Constant *RC = dyn_cast<Constant>(RHS))
   1012         return Insert(Folder.CreateShl(LC, RC, HasNUW, HasNSW), Name);
   1013     return CreateInsertNUWNSWBinOp(Instruction::Shl, LHS, RHS, Name,
   1014                                    HasNUW, HasNSW);
   1015   }
   1016   Value *CreateShl(Value *LHS, const APInt &RHS, const Twine &Name = "",
   1017                    bool HasNUW = false, bool HasNSW = false) {
   1018     return CreateShl(LHS, ConstantInt::get(LHS->getType(), RHS), Name,
   1019                      HasNUW, HasNSW);
   1020   }
   1021   Value *CreateShl(Value *LHS, uint64_t RHS, const Twine &Name = "",
   1022                    bool HasNUW = false, bool HasNSW = false) {
   1023     return CreateShl(LHS, ConstantInt::get(LHS->getType(), RHS), Name,
   1024                      HasNUW, HasNSW);
   1025   }
   1026 
   1027   Value *CreateLShr(Value *LHS, Value *RHS, const Twine &Name = "",
   1028                     bool isExact = false) {
   1029     if (Constant *LC = dyn_cast<Constant>(LHS))
   1030       if (Constant *RC = dyn_cast<Constant>(RHS))
   1031         return Insert(Folder.CreateLShr(LC, RC, isExact), Name);
   1032     if (!isExact)
   1033       return Insert(BinaryOperator::CreateLShr(LHS, RHS), Name);
   1034     return Insert(BinaryOperator::CreateExactLShr(LHS, RHS), Name);
   1035   }
   1036   Value *CreateLShr(Value *LHS, const APInt &RHS, const Twine &Name = "",
   1037                     bool isExact = false) {
   1038     return CreateLShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
   1039   }
   1040   Value *CreateLShr(Value *LHS, uint64_t RHS, const Twine &Name = "",
   1041                     bool isExact = false) {
   1042     return CreateLShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
   1043   }
   1044 
   1045   Value *CreateAShr(Value *LHS, Value *RHS, const Twine &Name = "",
   1046                     bool isExact = false) {
   1047     if (Constant *LC = dyn_cast<Constant>(LHS))
   1048       if (Constant *RC = dyn_cast<Constant>(RHS))
   1049         return Insert(Folder.CreateAShr(LC, RC, isExact), Name);
   1050     if (!isExact)
   1051       return Insert(BinaryOperator::CreateAShr(LHS, RHS), Name);
   1052     return Insert(BinaryOperator::CreateExactAShr(LHS, RHS), Name);
   1053   }
   1054   Value *CreateAShr(Value *LHS, const APInt &RHS, const Twine &Name = "",
   1055                     bool isExact = false) {
   1056     return CreateAShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
   1057   }
   1058   Value *CreateAShr(Value *LHS, uint64_t RHS, const Twine &Name = "",
   1059                     bool isExact = false) {
   1060     return CreateAShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
   1061   }
   1062 
   1063   Value *CreateAnd(Value *LHS, Value *RHS, const Twine &Name = "") {
   1064     if (Constant *RC = dyn_cast<Constant>(RHS)) {
   1065       if (isa<ConstantInt>(RC) && cast<ConstantInt>(RC)->isMinusOne())
   1066         return LHS;  // LHS & -1 -> LHS
   1067       if (Constant *LC = dyn_cast<Constant>(LHS))
   1068         return Insert(Folder.CreateAnd(LC, RC), Name);
   1069     }
   1070     return Insert(BinaryOperator::CreateAnd(LHS, RHS), Name);
   1071   }
   1072   Value *CreateAnd(Value *LHS, const APInt &RHS, const Twine &Name = "") {
   1073     return CreateAnd(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
   1074   }
   1075   Value *CreateAnd(Value *LHS, uint64_t RHS, const Twine &Name = "") {
   1076     return CreateAnd(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
   1077   }
   1078 
   1079   Value *CreateOr(Value *LHS, Value *RHS, const Twine &Name = "") {
   1080     if (Constant *RC = dyn_cast<Constant>(RHS)) {
   1081       if (RC->isNullValue())
   1082         return LHS;  // LHS | 0 -> LHS
   1083       if (Constant *LC = dyn_cast<Constant>(LHS))
   1084         return Insert(Folder.CreateOr(LC, RC), Name);
   1085     }
   1086     return Insert(BinaryOperator::CreateOr(LHS, RHS), Name);
   1087   }
   1088   Value *CreateOr(Value *LHS, const APInt &RHS, const Twine &Name = "") {
   1089     return CreateOr(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
   1090   }
   1091   Value *CreateOr(Value *LHS, uint64_t RHS, const Twine &Name = "") {
   1092     return CreateOr(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
   1093   }
   1094 
   1095   Value *CreateXor(Value *LHS, Value *RHS, const Twine &Name = "") {
   1096     if (Constant *LC = dyn_cast<Constant>(LHS))
   1097       if (Constant *RC = dyn_cast<Constant>(RHS))
   1098         return Insert(Folder.CreateXor(LC, RC), Name);
   1099     return Insert(BinaryOperator::CreateXor(LHS, RHS), Name);
   1100   }
   1101   Value *CreateXor(Value *LHS, const APInt &RHS, const Twine &Name = "") {
   1102     return CreateXor(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
   1103   }
   1104   Value *CreateXor(Value *LHS, uint64_t RHS, const Twine &Name = "") {
   1105     return CreateXor(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
   1106   }
   1107 
   1108   Value *CreateBinOp(Instruction::BinaryOps Opc,
   1109                      Value *LHS, Value *RHS, const Twine &Name = "",
   1110                      MDNode *FPMathTag = nullptr) {
   1111     if (Constant *LC = dyn_cast<Constant>(LHS))
   1112       if (Constant *RC = dyn_cast<Constant>(RHS))
   1113         return Insert(Folder.CreateBinOp(Opc, LC, RC), Name);
   1114     Instruction *BinOp = BinaryOperator::Create(Opc, LHS, RHS);
   1115     if (isa<FPMathOperator>(BinOp))
   1116       BinOp = AddFPMathAttributes(BinOp, FPMathTag, FMF);
   1117     return Insert(BinOp, Name);
   1118   }
   1119 
   1120   Value *CreateNeg(Value *V, const Twine &Name = "",
   1121                    bool HasNUW = false, bool HasNSW = false) {
   1122     if (Constant *VC = dyn_cast<Constant>(V))
   1123       return Insert(Folder.CreateNeg(VC, HasNUW, HasNSW), Name);
   1124     BinaryOperator *BO = Insert(BinaryOperator::CreateNeg(V), Name);
   1125     if (HasNUW) BO->setHasNoUnsignedWrap();
   1126     if (HasNSW) BO->setHasNoSignedWrap();
   1127     return BO;
   1128   }
   1129   Value *CreateNSWNeg(Value *V, const Twine &Name = "") {
   1130     return CreateNeg(V, Name, false, true);
   1131   }
   1132   Value *CreateNUWNeg(Value *V, const Twine &Name = "") {
   1133     return CreateNeg(V, Name, true, false);
   1134   }
   1135   Value *CreateFNeg(Value *V, const Twine &Name = "",
   1136                     MDNode *FPMathTag = nullptr) {
   1137     if (Constant *VC = dyn_cast<Constant>(V))
   1138       return Insert(Folder.CreateFNeg(VC), Name);
   1139     return Insert(AddFPMathAttributes(BinaryOperator::CreateFNeg(V),
   1140                                       FPMathTag, FMF), Name);
   1141   }
   1142   Value *CreateNot(Value *V, const Twine &Name = "") {
   1143     if (Constant *VC = dyn_cast<Constant>(V))
   1144       return Insert(Folder.CreateNot(VC), Name);
   1145     return Insert(BinaryOperator::CreateNot(V), Name);
   1146   }
   1147 
   1148   //===--------------------------------------------------------------------===//
   1149   // Instruction creation methods: Memory Instructions
   1150   //===--------------------------------------------------------------------===//
   1151 
   1152   AllocaInst *CreateAlloca(Type *Ty, unsigned AddrSpace,
   1153                            Value *ArraySize = nullptr, const Twine &Name = "") {
   1154     return Insert(new AllocaInst(Ty, AddrSpace, ArraySize), Name);
   1155   }
   1156 
   1157   AllocaInst *CreateAlloca(Type *Ty, Value *ArraySize = nullptr,
   1158                            const Twine &Name = "") {
   1159     const DataLayout &DL = BB->getParent()->getParent()->getDataLayout();
   1160     return Insert(new AllocaInst(Ty, DL.getAllocaAddrSpace(), ArraySize), Name);
   1161   }
   1162   // \brief Provided to resolve 'CreateLoad(Ptr, "...")' correctly, instead of
   1163   // converting the string to 'bool' for the isVolatile parameter.
   1164   LoadInst *CreateLoad(Value *Ptr, const char *Name) {
   1165     return Insert(new LoadInst(Ptr), Name);
   1166   }
   1167   LoadInst *CreateLoad(Value *Ptr, const Twine &Name = "") {
   1168     return Insert(new LoadInst(Ptr), Name);
   1169   }
   1170   LoadInst *CreateLoad(Type *Ty, Value *Ptr, const Twine &Name = "") {
   1171     return Insert(new LoadInst(Ty, Ptr), Name);
   1172   }
   1173   LoadInst *CreateLoad(Value *Ptr, bool isVolatile, const Twine &Name = "") {
   1174     return Insert(new LoadInst(Ptr, nullptr, isVolatile), Name);
   1175   }
   1176   StoreInst *CreateStore(Value *Val, Value *Ptr, bool isVolatile = false) {
   1177     return Insert(new StoreInst(Val, Ptr, isVolatile));
   1178   }
   1179   // \brief Provided to resolve 'CreateAlignedLoad(Ptr, Align, "...")'
   1180   // correctly, instead of converting the string to 'bool' for the isVolatile
   1181   // parameter.
   1182   LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align, const char *Name) {
   1183     LoadInst *LI = CreateLoad(Ptr, Name);
   1184     LI->setAlignment(Align);
   1185     return LI;
   1186   }
   1187   LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align,
   1188                               const Twine &Name = "") {
   1189     LoadInst *LI = CreateLoad(Ptr, Name);
   1190     LI->setAlignment(Align);
   1191     return LI;
   1192   }
   1193   LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align, bool isVolatile,
   1194                               const Twine &Name = "") {
   1195     LoadInst *LI = CreateLoad(Ptr, isVolatile, Name);
   1196     LI->setAlignment(Align);
   1197     return LI;
   1198   }
   1199   StoreInst *CreateAlignedStore(Value *Val, Value *Ptr, unsigned Align,
   1200                                 bool isVolatile = false) {
   1201     StoreInst *SI = CreateStore(Val, Ptr, isVolatile);
   1202     SI->setAlignment(Align);
   1203     return SI;
   1204   }
   1205   FenceInst *CreateFence(AtomicOrdering Ordering,
   1206                          SyncScope::ID SSID = SyncScope::System,
   1207                          const Twine &Name = "") {
   1208     return Insert(new FenceInst(Context, Ordering, SSID), Name);
   1209   }
   1210   AtomicCmpXchgInst *
   1211   CreateAtomicCmpXchg(Value *Ptr, Value *Cmp, Value *New,
   1212                       AtomicOrdering SuccessOrdering,
   1213                       AtomicOrdering FailureOrdering,
   1214                       SyncScope::ID SSID = SyncScope::System) {
   1215     return Insert(new AtomicCmpXchgInst(Ptr, Cmp, New, SuccessOrdering,
   1216                                         FailureOrdering, SSID));
   1217   }
   1218   AtomicRMWInst *CreateAtomicRMW(AtomicRMWInst::BinOp Op, Value *Ptr, Value *Val,
   1219                                  AtomicOrdering Ordering,
   1220                                  SyncScope::ID SSID = SyncScope::System) {
   1221     return Insert(new AtomicRMWInst(Op, Ptr, Val, Ordering, SSID));
   1222   }
   1223   Value *CreateGEP(Value *Ptr, ArrayRef<Value *> IdxList,
   1224                    const Twine &Name = "") {
   1225     return CreateGEP(nullptr, Ptr, IdxList, Name);
   1226   }
   1227   Value *CreateGEP(Type *Ty, Value *Ptr, ArrayRef<Value *> IdxList,
   1228                    const Twine &Name = "") {
   1229     if (Constant *PC = dyn_cast<Constant>(Ptr)) {
   1230       // Every index must be constant.
   1231       size_t i, e;
   1232       for (i = 0, e = IdxList.size(); i != e; ++i)
   1233         if (!isa<Constant>(IdxList[i]))
   1234           break;
   1235       if (i == e)
   1236         return Insert(Folder.CreateGetElementPtr(Ty, PC, IdxList), Name);
   1237     }
   1238     return Insert(GetElementPtrInst::Create(Ty, Ptr, IdxList), Name);
   1239   }
   1240   Value *CreateInBoundsGEP(Value *Ptr, ArrayRef<Value *> IdxList,
   1241                            const Twine &Name = "") {
   1242     return CreateInBoundsGEP(nullptr, Ptr, IdxList, Name);
   1243   }
   1244   Value *CreateInBoundsGEP(Type *Ty, Value *Ptr, ArrayRef<Value *> IdxList,
   1245                            const Twine &Name = "") {
   1246     if (Constant *PC = dyn_cast<Constant>(Ptr)) {
   1247       // Every index must be constant.
   1248       size_t i, e;
   1249       for (i = 0, e = IdxList.size(); i != e; ++i)
   1250         if (!isa<Constant>(IdxList[i]))
   1251           break;
   1252       if (i == e)
   1253         return Insert(Folder.CreateInBoundsGetElementPtr(Ty, PC, IdxList),
   1254                       Name);
   1255     }
   1256     return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, IdxList), Name);
   1257   }
   1258   Value *CreateGEP(Value *Ptr, Value *Idx, const Twine &Name = "") {
   1259     return CreateGEP(nullptr, Ptr, Idx, Name);
   1260   }
   1261   Value *CreateGEP(Type *Ty, Value *Ptr, Value *Idx, const Twine &Name = "") {
   1262     if (Constant *PC = dyn_cast<Constant>(Ptr))
   1263       if (Constant *IC = dyn_cast<Constant>(Idx))
   1264         return Insert(Folder.CreateGetElementPtr(Ty, PC, IC), Name);
   1265     return Insert(GetElementPtrInst::Create(Ty, Ptr, Idx), Name);
   1266   }
   1267   Value *CreateInBoundsGEP(Type *Ty, Value *Ptr, Value *Idx,
   1268                            const Twine &Name = "") {
   1269     if (Constant *PC = dyn_cast<Constant>(Ptr))
   1270       if (Constant *IC = dyn_cast<Constant>(Idx))
   1271         return Insert(Folder.CreateInBoundsGetElementPtr(Ty, PC, IC), Name);
   1272     return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idx), Name);
   1273   }
   1274   Value *CreateConstGEP1_32(Value *Ptr, unsigned Idx0, const Twine &Name = "") {
   1275     return CreateConstGEP1_32(nullptr, Ptr, Idx0, Name);
   1276   }
   1277   Value *CreateConstGEP1_32(Type *Ty, Value *Ptr, unsigned Idx0,
   1278                             const Twine &Name = "") {
   1279     Value *Idx = ConstantInt::get(Type::getInt32Ty(Context), Idx0);
   1280 
   1281     if (Constant *PC = dyn_cast<Constant>(Ptr))
   1282       return Insert(Folder.CreateGetElementPtr(Ty, PC, Idx), Name);
   1283 
   1284     return Insert(GetElementPtrInst::Create(Ty, Ptr, Idx), Name);
   1285   }
   1286   Value *CreateConstInBoundsGEP1_32(Type *Ty, Value *Ptr, unsigned Idx0,
   1287                                     const Twine &Name = "") {
   1288     Value *Idx = ConstantInt::get(Type::getInt32Ty(Context), Idx0);
   1289 
   1290     if (Constant *PC = dyn_cast<Constant>(Ptr))
   1291       return Insert(Folder.CreateInBoundsGetElementPtr(Ty, PC, Idx), Name);
   1292 
   1293     return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idx), Name);
   1294   }
   1295   Value *CreateConstGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0, unsigned Idx1,
   1296                             const Twine &Name = "") {
   1297     Value *Idxs[] = {
   1298       ConstantInt::get(Type::getInt32Ty(Context), Idx0),
   1299       ConstantInt::get(Type::getInt32Ty(Context), Idx1)
   1300     };
   1301 
   1302     if (Constant *PC = dyn_cast<Constant>(Ptr))
   1303       return Insert(Folder.CreateGetElementPtr(Ty, PC, Idxs), Name);
   1304 
   1305     return Insert(GetElementPtrInst::Create(Ty, Ptr, Idxs), Name);
   1306   }
   1307   Value *CreateConstInBoundsGEP2_32(Type *Ty, Value *Ptr, unsigned Idx0,
   1308                                     unsigned Idx1, const Twine &Name = "") {
   1309     Value *Idxs[] = {
   1310       ConstantInt::get(Type::getInt32Ty(Context), Idx0),
   1311       ConstantInt::get(Type::getInt32Ty(Context), Idx1)
   1312     };
   1313 
   1314     if (Constant *PC = dyn_cast<Constant>(Ptr))
   1315       return Insert(Folder.CreateInBoundsGetElementPtr(Ty, PC, Idxs), Name);
   1316 
   1317     return Insert(GetElementPtrInst::CreateInBounds(Ty, Ptr, Idxs), Name);
   1318   }
   1319   Value *CreateConstGEP1_64(Value *Ptr, uint64_t Idx0, const Twine &Name = "") {
   1320     Value *Idx = ConstantInt::get(Type::getInt64Ty(Context), Idx0);
   1321 
   1322     if (Constant *PC = dyn_cast<Constant>(Ptr))
   1323       return Insert(Folder.CreateGetElementPtr(nullptr, PC, Idx), Name);
   1324 
   1325     return Insert(GetElementPtrInst::Create(nullptr, Ptr, Idx), Name);
   1326   }
   1327   Value *CreateConstInBoundsGEP1_64(Value *Ptr, uint64_t Idx0,
   1328                                     const Twine &Name = "") {
   1329     Value *Idx = ConstantInt::get(Type::getInt64Ty(Context), Idx0);
   1330 
   1331     if (Constant *PC = dyn_cast<Constant>(Ptr))
   1332       return Insert(Folder.CreateInBoundsGetElementPtr(nullptr, PC, Idx), Name);
   1333 
   1334     return Insert(GetElementPtrInst::CreateInBounds(nullptr, Ptr, Idx), Name);
   1335   }
   1336   Value *CreateConstGEP2_64(Value *Ptr, uint64_t Idx0, uint64_t Idx1,
   1337                     const Twine &Name = "") {
   1338     Value *Idxs[] = {
   1339       ConstantInt::get(Type::getInt64Ty(Context), Idx0),
   1340       ConstantInt::get(Type::getInt64Ty(Context), Idx1)
   1341     };
   1342 
   1343     if (Constant *PC = dyn_cast<Constant>(Ptr))
   1344       return Insert(Folder.CreateGetElementPtr(nullptr, PC, Idxs), Name);
   1345 
   1346     return Insert(GetElementPtrInst::Create(nullptr, Ptr, Idxs), Name);
   1347   }
   1348   Value *CreateConstInBoundsGEP2_64(Value *Ptr, uint64_t Idx0, uint64_t Idx1,
   1349                                     const Twine &Name = "") {
   1350     Value *Idxs[] = {
   1351       ConstantInt::get(Type::getInt64Ty(Context), Idx0),
   1352       ConstantInt::get(Type::getInt64Ty(Context), Idx1)
   1353     };
   1354 
   1355     if (Constant *PC = dyn_cast<Constant>(Ptr))
   1356       return Insert(Folder.CreateInBoundsGetElementPtr(nullptr, PC, Idxs),
   1357                     Name);
   1358 
   1359     return Insert(GetElementPtrInst::CreateInBounds(nullptr, Ptr, Idxs), Name);
   1360   }
   1361   Value *CreateStructGEP(Type *Ty, Value *Ptr, unsigned Idx,
   1362                          const Twine &Name = "") {
   1363     return CreateConstInBoundsGEP2_32(Ty, Ptr, 0, Idx, Name);
   1364   }
   1365 
   1366   /// \brief Same as CreateGlobalString, but return a pointer with "i8*" type
   1367   /// instead of a pointer to array of i8.
   1368   Value *CreateGlobalStringPtr(StringRef Str, const Twine &Name = "",
   1369                                unsigned AddressSpace = 0) {
   1370     GlobalVariable *gv = CreateGlobalString(Str, Name, AddressSpace);
   1371     Value *zero = ConstantInt::get(Type::getInt32Ty(Context), 0);
   1372     Value *Args[] = { zero, zero };
   1373     return CreateInBoundsGEP(gv->getValueType(), gv, Args, Name);
   1374   }
   1375 
   1376   //===--------------------------------------------------------------------===//
   1377   // Instruction creation methods: Cast/Conversion Operators
   1378   //===--------------------------------------------------------------------===//
   1379 
   1380   Value *CreateTrunc(Value *V, Type *DestTy, const Twine &Name = "") {
   1381     return CreateCast(Instruction::Trunc, V, DestTy, Name);
   1382   }
   1383   Value *CreateZExt(Value *V, Type *DestTy, const Twine &Name = "") {
   1384     return CreateCast(Instruction::ZExt, V, DestTy, Name);
   1385   }
   1386   Value *CreateSExt(Value *V, Type *DestTy, const Twine &Name = "") {
   1387     return CreateCast(Instruction::SExt, V, DestTy, Name);
   1388   }
   1389   /// \brief Create a ZExt or Trunc from the integer value V to DestTy. Return
   1390   /// the value untouched if the type of V is already DestTy.
   1391   Value *CreateZExtOrTrunc(Value *V, Type *DestTy,
   1392                            const Twine &Name = "") {
   1393     assert(V->getType()->isIntOrIntVectorTy() &&
   1394            DestTy->isIntOrIntVectorTy() &&
   1395            "Can only zero extend/truncate integers!");
   1396     Type *VTy = V->getType();
   1397     if (VTy->getScalarSizeInBits() < DestTy->getScalarSizeInBits())
   1398       return CreateZExt(V, DestTy, Name);
   1399     if (VTy->getScalarSizeInBits() > DestTy->getScalarSizeInBits())
   1400       return CreateTrunc(V, DestTy, Name);
   1401     return V;
   1402   }
   1403   /// \brief Create a SExt or Trunc from the integer value V to DestTy. Return
   1404   /// the value untouched if the type of V is already DestTy.
   1405   Value *CreateSExtOrTrunc(Value *V, Type *DestTy,
   1406                            const Twine &Name = "") {
   1407     assert(V->getType()->isIntOrIntVectorTy() &&
   1408            DestTy->isIntOrIntVectorTy() &&
   1409            "Can only sign extend/truncate integers!");
   1410     Type *VTy = V->getType();
   1411     if (VTy->getScalarSizeInBits() < DestTy->getScalarSizeInBits())
   1412       return CreateSExt(V, DestTy, Name);
   1413     if (VTy->getScalarSizeInBits() > DestTy->getScalarSizeInBits())
   1414       return CreateTrunc(V, DestTy, Name);
   1415     return V;
   1416   }
   1417   Value *CreateFPToUI(Value *V, Type *DestTy, const Twine &Name = ""){
   1418     return CreateCast(Instruction::FPToUI, V, DestTy, Name);
   1419   }
   1420   Value *CreateFPToSI(Value *V, Type *DestTy, const Twine &Name = ""){
   1421     return CreateCast(Instruction::FPToSI, V, DestTy, Name);
   1422   }
   1423   Value *CreateUIToFP(Value *V, Type *DestTy, const Twine &Name = ""){
   1424     return CreateCast(Instruction::UIToFP, V, DestTy, Name);
   1425   }
   1426   Value *CreateSIToFP(Value *V, Type *DestTy, const Twine &Name = ""){
   1427     return CreateCast(Instruction::SIToFP, V, DestTy, Name);
   1428   }
   1429   Value *CreateFPTrunc(Value *V, Type *DestTy,
   1430                        const Twine &Name = "") {
   1431     return CreateCast(Instruction::FPTrunc, V, DestTy, Name);
   1432   }
   1433   Value *CreateFPExt(Value *V, Type *DestTy, const Twine &Name = "") {
   1434     return CreateCast(Instruction::FPExt, V, DestTy, Name);
   1435   }
   1436   Value *CreatePtrToInt(Value *V, Type *DestTy,
   1437                         const Twine &Name = "") {
   1438     return CreateCast(Instruction::PtrToInt, V, DestTy, Name);
   1439   }
   1440   Value *CreateIntToPtr(Value *V, Type *DestTy,
   1441                         const Twine &Name = "") {
   1442     return CreateCast(Instruction::IntToPtr, V, DestTy, Name);
   1443   }
   1444   Value *CreateBitCast(Value *V, Type *DestTy,
   1445                        const Twine &Name = "") {
   1446     return CreateCast(Instruction::BitCast, V, DestTy, Name);
   1447   }
   1448   Value *CreateAddrSpaceCast(Value *V, Type *DestTy,
   1449                              const Twine &Name = "") {
   1450     return CreateCast(Instruction::AddrSpaceCast, V, DestTy, Name);
   1451   }
   1452   Value *CreateZExtOrBitCast(Value *V, Type *DestTy,
   1453                              const Twine &Name = "") {
   1454     if (V->getType() == DestTy)
   1455       return V;
   1456     if (Constant *VC = dyn_cast<Constant>(V))
   1457       return Insert(Folder.CreateZExtOrBitCast(VC, DestTy), Name);
   1458     return Insert(CastInst::CreateZExtOrBitCast(V, DestTy), Name);
   1459   }
   1460   Value *CreateSExtOrBitCast(Value *V, Type *DestTy,
   1461                              const Twine &Name = "") {
   1462     if (V->getType() == DestTy)
   1463       return V;
   1464     if (Constant *VC = dyn_cast<Constant>(V))
   1465       return Insert(Folder.CreateSExtOrBitCast(VC, DestTy), Name);
   1466     return Insert(CastInst::CreateSExtOrBitCast(V, DestTy), Name);
   1467   }
   1468   Value *CreateTruncOrBitCast(Value *V, Type *DestTy,
   1469                               const Twine &Name = "") {
   1470     if (V->getType() == DestTy)
   1471       return V;
   1472     if (Constant *VC = dyn_cast<Constant>(V))
   1473       return Insert(Folder.CreateTruncOrBitCast(VC, DestTy), Name);
   1474     return Insert(CastInst::CreateTruncOrBitCast(V, DestTy), Name);
   1475   }
   1476   Value *CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy,
   1477                     const Twine &Name = "") {
   1478     if (V->getType() == DestTy)
   1479       return V;
   1480     if (Constant *VC = dyn_cast<Constant>(V))
   1481       return Insert(Folder.CreateCast(Op, VC, DestTy), Name);
   1482     return Insert(CastInst::Create(Op, V, DestTy), Name);
   1483   }
   1484   Value *CreatePointerCast(Value *V, Type *DestTy,
   1485                            const Twine &Name = "") {
   1486     if (V->getType() == DestTy)
   1487       return V;
   1488     if (Constant *VC = dyn_cast<Constant>(V))
   1489       return Insert(Folder.CreatePointerCast(VC, DestTy), Name);
   1490     return Insert(CastInst::CreatePointerCast(V, DestTy), Name);
   1491   }
   1492 
   1493   Value *CreatePointerBitCastOrAddrSpaceCast(Value *V, Type *DestTy,
   1494                                              const Twine &Name = "") {
   1495     if (V->getType() == DestTy)
   1496       return V;
   1497 
   1498     if (Constant *VC = dyn_cast<Constant>(V)) {
   1499       return Insert(Folder.CreatePointerBitCastOrAddrSpaceCast(VC, DestTy),
   1500                     Name);
   1501     }
   1502 
   1503     return Insert(CastInst::CreatePointerBitCastOrAddrSpaceCast(V, DestTy),
   1504                   Name);
   1505   }
   1506 
   1507   Value *CreateIntCast(Value *V, Type *DestTy, bool isSigned,
   1508                        const Twine &Name = "") {
   1509     if (V->getType() == DestTy)
   1510       return V;
   1511     if (Constant *VC = dyn_cast<Constant>(V))
   1512       return Insert(Folder.CreateIntCast(VC, DestTy, isSigned), Name);
   1513     return Insert(CastInst::CreateIntegerCast(V, DestTy, isSigned), Name);
   1514   }
   1515 
   1516   Value *CreateBitOrPointerCast(Value *V, Type *DestTy,
   1517                                 const Twine &Name = "") {
   1518     if (V->getType() == DestTy)
   1519       return V;
   1520     if (V->getType()->isPtrOrPtrVectorTy() && DestTy->isIntOrIntVectorTy())
   1521       return CreatePtrToInt(V, DestTy, Name);
   1522     if (V->getType()->isIntOrIntVectorTy() && DestTy->isPtrOrPtrVectorTy())
   1523       return CreateIntToPtr(V, DestTy, Name);
   1524 
   1525     return CreateBitCast(V, DestTy, Name);
   1526   }
   1527 
   1528 public:
   1529   Value *CreateFPCast(Value *V, Type *DestTy, const Twine &Name = "") {
   1530     if (V->getType() == DestTy)
   1531       return V;
   1532     if (Constant *VC = dyn_cast<Constant>(V))
   1533       return Insert(Folder.CreateFPCast(VC, DestTy), Name);
   1534     return Insert(CastInst::CreateFPCast(V, DestTy), Name);
   1535   }
   1536 
   1537   // \brief Provided to resolve 'CreateIntCast(Ptr, Ptr, "...")', giving a
   1538   // compile time error, instead of converting the string to bool for the
   1539   // isSigned parameter.
   1540   Value *CreateIntCast(Value *, Type *, const char *) = delete;
   1541 
   1542   //===--------------------------------------------------------------------===//
   1543   // Instruction creation methods: Compare Instructions
   1544   //===--------------------------------------------------------------------===//
   1545 
   1546   Value *CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name = "") {
   1547     return CreateICmp(ICmpInst::ICMP_EQ, LHS, RHS, Name);
   1548   }
   1549   Value *CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name = "") {
   1550     return CreateICmp(ICmpInst::ICMP_NE, LHS, RHS, Name);
   1551   }
   1552   Value *CreateICmpUGT(Value *LHS, Value *RHS, const Twine &Name = "") {
   1553     return CreateICmp(ICmpInst::ICMP_UGT, LHS, RHS, Name);
   1554   }
   1555   Value *CreateICmpUGE(Value *LHS, Value *RHS, const Twine &Name = "") {
   1556     return CreateICmp(ICmpInst::ICMP_UGE, LHS, RHS, Name);
   1557   }
   1558   Value *CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name = "") {
   1559     return CreateICmp(ICmpInst::ICMP_ULT, LHS, RHS, Name);
   1560   }
   1561   Value *CreateICmpULE(Value *LHS, Value *RHS, const Twine &Name = "") {
   1562     return CreateICmp(ICmpInst::ICMP_ULE, LHS, RHS, Name);
   1563   }
   1564   Value *CreateICmpSGT(Value *LHS, Value *RHS, const Twine &Name = "") {
   1565     return CreateICmp(ICmpInst::ICMP_SGT, LHS, RHS, Name);
   1566   }
   1567   Value *CreateICmpSGE(Value *LHS, Value *RHS, const Twine &Name = "") {
   1568     return CreateICmp(ICmpInst::ICMP_SGE, LHS, RHS, Name);
   1569   }
   1570   Value *CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name = "") {
   1571     return CreateICmp(ICmpInst::ICMP_SLT, LHS, RHS, Name);
   1572   }
   1573   Value *CreateICmpSLE(Value *LHS, Value *RHS, const Twine &Name = "") {
   1574     return CreateICmp(ICmpInst::ICMP_SLE, LHS, RHS, Name);
   1575   }
   1576 
   1577   Value *CreateFCmpOEQ(Value *LHS, Value *RHS, const Twine &Name = "",
   1578                        MDNode *FPMathTag = nullptr) {
   1579     return CreateFCmp(FCmpInst::FCMP_OEQ, LHS, RHS, Name, FPMathTag);
   1580   }
   1581   Value *CreateFCmpOGT(Value *LHS, Value *RHS, const Twine &Name = "",
   1582                        MDNode *FPMathTag = nullptr) {
   1583     return CreateFCmp(FCmpInst::FCMP_OGT, LHS, RHS, Name, FPMathTag);
   1584   }
   1585   Value *CreateFCmpOGE(Value *LHS, Value *RHS, const Twine &Name = "",
   1586                        MDNode *FPMathTag = nullptr) {
   1587     return CreateFCmp(FCmpInst::FCMP_OGE, LHS, RHS, Name, FPMathTag);
   1588   }
   1589   Value *CreateFCmpOLT(Value *LHS, Value *RHS, const Twine &Name = "",
   1590                        MDNode *FPMathTag = nullptr) {
   1591     return CreateFCmp(FCmpInst::FCMP_OLT, LHS, RHS, Name, FPMathTag);
   1592   }
   1593   Value *CreateFCmpOLE(Value *LHS, Value *RHS, const Twine &Name = "",
   1594                        MDNode *FPMathTag = nullptr) {
   1595     return CreateFCmp(FCmpInst::FCMP_OLE, LHS, RHS, Name, FPMathTag);
   1596   }
   1597   Value *CreateFCmpONE(Value *LHS, Value *RHS, const Twine &Name = "",
   1598                        MDNode *FPMathTag = nullptr) {
   1599     return CreateFCmp(FCmpInst::FCMP_ONE, LHS, RHS, Name, FPMathTag);
   1600   }
   1601   Value *CreateFCmpORD(Value *LHS, Value *RHS, const Twine &Name = "",
   1602                        MDNode *FPMathTag = nullptr) {
   1603     return CreateFCmp(FCmpInst::FCMP_ORD, LHS, RHS, Name, FPMathTag);
   1604   }
   1605   Value *CreateFCmpUNO(Value *LHS, Value *RHS, const Twine &Name = "",
   1606                        MDNode *FPMathTag = nullptr) {
   1607     return CreateFCmp(FCmpInst::FCMP_UNO, LHS, RHS, Name, FPMathTag);
   1608   }
   1609   Value *CreateFCmpUEQ(Value *LHS, Value *RHS, const Twine &Name = "",
   1610                        MDNode *FPMathTag = nullptr) {
   1611     return CreateFCmp(FCmpInst::FCMP_UEQ, LHS, RHS, Name, FPMathTag);
   1612   }
   1613   Value *CreateFCmpUGT(Value *LHS, Value *RHS, const Twine &Name = "",
   1614                        MDNode *FPMathTag = nullptr) {
   1615     return CreateFCmp(FCmpInst::FCMP_UGT, LHS, RHS, Name, FPMathTag);
   1616   }
   1617   Value *CreateFCmpUGE(Value *LHS, Value *RHS, const Twine &Name = "",
   1618                        MDNode *FPMathTag = nullptr) {
   1619     return CreateFCmp(FCmpInst::FCMP_UGE, LHS, RHS, Name, FPMathTag);
   1620   }
   1621   Value *CreateFCmpULT(Value *LHS, Value *RHS, const Twine &Name = "",
   1622                        MDNode *FPMathTag = nullptr) {
   1623     return CreateFCmp(FCmpInst::FCMP_ULT, LHS, RHS, Name, FPMathTag);
   1624   }
   1625   Value *CreateFCmpULE(Value *LHS, Value *RHS, const Twine &Name = "",
   1626                        MDNode *FPMathTag = nullptr) {
   1627     return CreateFCmp(FCmpInst::FCMP_ULE, LHS, RHS, Name, FPMathTag);
   1628   }
   1629   Value *CreateFCmpUNE(Value *LHS, Value *RHS, const Twine &Name = "",
   1630                        MDNode *FPMathTag = nullptr) {
   1631     return CreateFCmp(FCmpInst::FCMP_UNE, LHS, RHS, Name, FPMathTag);
   1632   }
   1633 
   1634   Value *CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS,
   1635                     const Twine &Name = "") {
   1636     if (Constant *LC = dyn_cast<Constant>(LHS))
   1637       if (Constant *RC = dyn_cast<Constant>(RHS))
   1638         return Insert(Folder.CreateICmp(P, LC, RC), Name);
   1639     return Insert(new ICmpInst(P, LHS, RHS), Name);
   1640   }
   1641   Value *CreateFCmp(CmpInst::Predicate P, Value *LHS, Value *RHS,
   1642                     const Twine &Name = "", MDNode *FPMathTag = nullptr) {
   1643     if (Constant *LC = dyn_cast<Constant>(LHS))
   1644       if (Constant *RC = dyn_cast<Constant>(RHS))
   1645         return Insert(Folder.CreateFCmp(P, LC, RC), Name);
   1646     return Insert(AddFPMathAttributes(new FCmpInst(P, LHS, RHS),
   1647                                       FPMathTag, FMF), Name);
   1648   }
   1649 
   1650   //===--------------------------------------------------------------------===//
   1651   // Instruction creation methods: Other Instructions
   1652   //===--------------------------------------------------------------------===//
   1653 
   1654   PHINode *CreatePHI(Type *Ty, unsigned NumReservedValues,
   1655                      const Twine &Name = "") {
   1656     return Insert(PHINode::Create(Ty, NumReservedValues), Name);
   1657   }
   1658 
   1659   CallInst *CreateCall(Value *Callee, ArrayRef<Value *> Args = None,
   1660                        const Twine &Name = "", MDNode *FPMathTag = nullptr) {
   1661     PointerType *PTy = cast<PointerType>(Callee->getType());
   1662     FunctionType *FTy = cast<FunctionType>(PTy->getElementType());
   1663     return CreateCall(FTy, Callee, Args, Name, FPMathTag);
   1664   }
   1665 
   1666   CallInst *CreateCall(FunctionType *FTy, Value *Callee,
   1667                        ArrayRef<Value *> Args, const Twine &Name = "",
   1668                        MDNode *FPMathTag = nullptr) {
   1669     CallInst *CI = CallInst::Create(FTy, Callee, Args, DefaultOperandBundles);
   1670     if (isa<FPMathOperator>(CI))
   1671       CI = cast<CallInst>(AddFPMathAttributes(CI, FPMathTag, FMF));
   1672     return Insert(CI, Name);
   1673   }
   1674 
   1675   CallInst *CreateCall(Value *Callee, ArrayRef<Value *> Args,
   1676                        ArrayRef<OperandBundleDef> OpBundles,
   1677                        const Twine &Name = "", MDNode *FPMathTag = nullptr) {
   1678     CallInst *CI = CallInst::Create(Callee, Args, OpBundles);
   1679     if (isa<FPMathOperator>(CI))
   1680       CI = cast<CallInst>(AddFPMathAttributes(CI, FPMathTag, FMF));
   1681     return Insert(CI, Name);
   1682   }
   1683 
   1684   CallInst *CreateCall(Function *Callee, ArrayRef<Value *> Args,
   1685                        const Twine &Name = "", MDNode *FPMathTag = nullptr) {
   1686     return CreateCall(Callee->getFunctionType(), Callee, Args, Name, FPMathTag);
   1687   }
   1688 
   1689   Value *CreateSelect(Value *C, Value *True, Value *False,
   1690                       const Twine &Name = "", Instruction *MDFrom = nullptr) {
   1691     if (Constant *CC = dyn_cast<Constant>(C))
   1692       if (Constant *TC = dyn_cast<Constant>(True))
   1693         if (Constant *FC = dyn_cast<Constant>(False))
   1694           return Insert(Folder.CreateSelect(CC, TC, FC), Name);
   1695 
   1696     SelectInst *Sel = SelectInst::Create(C, True, False);
   1697     if (MDFrom) {
   1698       MDNode *Prof = MDFrom->getMetadata(LLVMContext::MD_prof);
   1699       MDNode *Unpred = MDFrom->getMetadata(LLVMContext::MD_unpredictable);
   1700       Sel = addBranchMetadata(Sel, Prof, Unpred);
   1701     }
   1702     return Insert(Sel, Name);
   1703   }
   1704 
   1705   VAArgInst *CreateVAArg(Value *List, Type *Ty, const Twine &Name = "") {
   1706     return Insert(new VAArgInst(List, Ty), Name);
   1707   }
   1708 
   1709   Value *CreateExtractElement(Value *Vec, Value *Idx,
   1710                               const Twine &Name = "") {
   1711     if (Constant *VC = dyn_cast<Constant>(Vec))
   1712       if (Constant *IC = dyn_cast<Constant>(Idx))
   1713         return Insert(Folder.CreateExtractElement(VC, IC), Name);
   1714     return Insert(ExtractElementInst::Create(Vec, Idx), Name);
   1715   }
   1716 
   1717   Value *CreateExtractElement(Value *Vec, uint64_t Idx,
   1718                               const Twine &Name = "") {
   1719     return CreateExtractElement(Vec, getInt64(Idx), Name);
   1720   }
   1721 
   1722   Value *CreateInsertElement(Value *Vec, Value *NewElt, Value *Idx,
   1723                              const Twine &Name = "") {
   1724     if (Constant *VC = dyn_cast<Constant>(Vec))
   1725       if (Constant *NC = dyn_cast<Constant>(NewElt))
   1726         if (Constant *IC = dyn_cast<Constant>(Idx))
   1727           return Insert(Folder.CreateInsertElement(VC, NC, IC), Name);
   1728     return Insert(InsertElementInst::Create(Vec, NewElt, Idx), Name);
   1729   }
   1730 
   1731   Value *CreateInsertElement(Value *Vec, Value *NewElt, uint64_t Idx,
   1732                              const Twine &Name = "") {
   1733     return CreateInsertElement(Vec, NewElt, getInt64(Idx), Name);
   1734   }
   1735 
   1736   Value *CreateShuffleVector(Value *V1, Value *V2, Value *Mask,
   1737                              const Twine &Name = "") {
   1738     if (Constant *V1C = dyn_cast<Constant>(V1))
   1739       if (Constant *V2C = dyn_cast<Constant>(V2))
   1740         if (Constant *MC = dyn_cast<Constant>(Mask))
   1741           return Insert(Folder.CreateShuffleVector(V1C, V2C, MC), Name);
   1742     return Insert(new ShuffleVectorInst(V1, V2, Mask), Name);
   1743   }
   1744 
   1745   Value *CreateShuffleVector(Value *V1, Value *V2, ArrayRef<uint32_t> IntMask,
   1746                              const Twine &Name = "") {
   1747     Value *Mask = ConstantDataVector::get(Context, IntMask);
   1748     return CreateShuffleVector(V1, V2, Mask, Name);
   1749   }
   1750 
   1751   Value *CreateExtractValue(Value *Agg,
   1752                             ArrayRef<unsigned> Idxs,
   1753                             const Twine &Name = "") {
   1754     if (Constant *AggC = dyn_cast<Constant>(Agg))
   1755       return Insert(Folder.CreateExtractValue(AggC, Idxs), Name);
   1756     return Insert(ExtractValueInst::Create(Agg, Idxs), Name);
   1757   }
   1758 
   1759   Value *CreateInsertValue(Value *Agg, Value *Val,
   1760                            ArrayRef<unsigned> Idxs,
   1761                            const Twine &Name = "") {
   1762     if (Constant *AggC = dyn_cast<Constant>(Agg))
   1763       if (Constant *ValC = dyn_cast<Constant>(Val))
   1764         return Insert(Folder.CreateInsertValue(AggC, ValC, Idxs), Name);
   1765     return Insert(InsertValueInst::Create(Agg, Val, Idxs), Name);
   1766   }
   1767 
   1768   LandingPadInst *CreateLandingPad(Type *Ty, unsigned NumClauses,
   1769                                    const Twine &Name = "") {
   1770     return Insert(LandingPadInst::Create(Ty, NumClauses), Name);
   1771   }
   1772 
   1773   //===--------------------------------------------------------------------===//
   1774   // Utility creation methods
   1775   //===--------------------------------------------------------------------===//
   1776 
   1777   /// \brief Return an i1 value testing if \p Arg is null.
   1778   Value *CreateIsNull(Value *Arg, const Twine &Name = "") {
   1779     return CreateICmpEQ(Arg, Constant::getNullValue(Arg->getType()),
   1780                         Name);
   1781   }
   1782 
   1783   /// \brief Return an i1 value testing if \p Arg is not null.
   1784   Value *CreateIsNotNull(Value *Arg, const Twine &Name = "") {
   1785     return CreateICmpNE(Arg, Constant::getNullValue(Arg->getType()),
   1786                         Name);
   1787   }
   1788 
   1789   /// \brief Return the i64 difference between two pointer values, dividing out
   1790   /// the size of the pointed-to objects.
   1791   ///
   1792   /// This is intended to implement C-style pointer subtraction. As such, the
   1793   /// pointers must be appropriately aligned for their element types and
   1794   /// pointing into the same object.
   1795   Value *CreatePtrDiff(Value *LHS, Value *RHS, const Twine &Name = "") {
   1796     assert(LHS->getType() == RHS->getType() &&
   1797            "Pointer subtraction operand types must match!");
   1798     PointerType *ArgType = cast<PointerType>(LHS->getType());
   1799     Value *LHS_int = CreatePtrToInt(LHS, Type::getInt64Ty(Context));
   1800     Value *RHS_int = CreatePtrToInt(RHS, Type::getInt64Ty(Context));
   1801     Value *Difference = CreateSub(LHS_int, RHS_int);
   1802     return CreateExactSDiv(Difference,
   1803                            ConstantExpr::getSizeOf(ArgType->getElementType()),
   1804                            Name);
   1805   }
   1806 
   1807   /// \brief Create an invariant.group.barrier intrinsic call, that stops
   1808   /// optimizer to propagate equality using invariant.group metadata.
   1809   /// If Ptr type is different from i8*, it's casted to i8* before call
   1810   /// and casted back to Ptr type after call.
   1811   Value *CreateInvariantGroupBarrier(Value *Ptr) {
   1812     Module *M = BB->getParent()->getParent();
   1813     Function *FnInvariantGroupBarrier = Intrinsic::getDeclaration(M,
   1814             Intrinsic::invariant_group_barrier);
   1815 
   1816     Type *ArgumentAndReturnType = FnInvariantGroupBarrier->getReturnType();
   1817     assert(ArgumentAndReturnType ==
   1818         FnInvariantGroupBarrier->getFunctionType()->getParamType(0) &&
   1819         "InvariantGroupBarrier should take and return the same type");
   1820     Type *PtrType = Ptr->getType();
   1821 
   1822     bool PtrTypeConversionNeeded = PtrType != ArgumentAndReturnType;
   1823     if (PtrTypeConversionNeeded)
   1824       Ptr = CreateBitCast(Ptr, ArgumentAndReturnType);
   1825 
   1826     CallInst *Fn = CreateCall(FnInvariantGroupBarrier, {Ptr});
   1827 
   1828     if (PtrTypeConversionNeeded)
   1829       return CreateBitCast(Fn, PtrType);
   1830     return Fn;
   1831   }
   1832 
   1833   /// \brief Return a vector value that contains \arg V broadcasted to \p
   1834   /// NumElts elements.
   1835   Value *CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name = "") {
   1836     assert(NumElts > 0 && "Cannot splat to an empty vector!");
   1837 
   1838     // First insert it into an undef vector so we can shuffle it.
   1839     Type *I32Ty = getInt32Ty();
   1840     Value *Undef = UndefValue::get(VectorType::get(V->getType(), NumElts));
   1841     V = CreateInsertElement(Undef, V, ConstantInt::get(I32Ty, 0),
   1842                             Name + ".splatinsert");
   1843 
   1844     // Shuffle the value across the desired number of elements.
   1845     Value *Zeros = ConstantAggregateZero::get(VectorType::get(I32Ty, NumElts));
   1846     return CreateShuffleVector(V, Undef, Zeros, Name + ".splat");
   1847   }
   1848 
   1849   /// \brief Return a value that has been extracted from a larger integer type.
   1850   Value *CreateExtractInteger(const DataLayout &DL, Value *From,
   1851                               IntegerType *ExtractedTy, uint64_t Offset,
   1852                               const Twine &Name) {
   1853     IntegerType *IntTy = cast<IntegerType>(From->getType());
   1854     assert(DL.getTypeStoreSize(ExtractedTy) + Offset <=
   1855                DL.getTypeStoreSize(IntTy) &&
   1856            "Element extends past full value");
   1857     uint64_t ShAmt = 8 * Offset;
   1858     Value *V = From;
   1859     if (DL.isBigEndian())
   1860       ShAmt = 8 * (DL.getTypeStoreSize(IntTy) -
   1861                    DL.getTypeStoreSize(ExtractedTy) - Offset);
   1862     if (ShAmt) {
   1863       V = CreateLShr(V, ShAmt, Name + ".shift");
   1864     }
   1865     assert(ExtractedTy->getBitWidth() <= IntTy->getBitWidth() &&
   1866            "Cannot extract to a larger integer!");
   1867     if (ExtractedTy != IntTy) {
   1868       V = CreateTrunc(V, ExtractedTy, Name + ".trunc");
   1869     }
   1870     return V;
   1871   }
   1872 
   1873 private:
   1874   /// \brief Helper function that creates an assume intrinsic call that
   1875   /// represents an alignment assumption on the provided Ptr, Mask, Type
   1876   /// and Offset.
   1877   CallInst *CreateAlignmentAssumptionHelper(const DataLayout &DL,
   1878                                             Value *PtrValue, Value *Mask,
   1879                                             Type *IntPtrTy,
   1880                                             Value *OffsetValue) {
   1881     Value *PtrIntValue = CreatePtrToInt(PtrValue, IntPtrTy, "ptrint");
   1882 
   1883     if (OffsetValue) {
   1884       bool IsOffsetZero = false;
   1885       if (ConstantInt *CI = dyn_cast<ConstantInt>(OffsetValue))
   1886         IsOffsetZero = CI->isZero();
   1887 
   1888       if (!IsOffsetZero) {
   1889         if (OffsetValue->getType() != IntPtrTy)
   1890           OffsetValue = CreateIntCast(OffsetValue, IntPtrTy, /*isSigned*/ true,
   1891                                       "offsetcast");
   1892         PtrIntValue = CreateSub(PtrIntValue, OffsetValue, "offsetptr");
   1893       }
   1894     }
   1895 
   1896     Value *Zero = ConstantInt::get(IntPtrTy, 0);
   1897     Value *MaskedPtr = CreateAnd(PtrIntValue, Mask, "maskedptr");
   1898     Value *InvCond = CreateICmpEQ(MaskedPtr, Zero, "maskcond");
   1899     return CreateAssumption(InvCond);
   1900   }
   1901 
   1902 public:
   1903   /// \brief Create an assume intrinsic call that represents an alignment
   1904   /// assumption on the provided pointer.
   1905   ///
   1906   /// An optional offset can be provided, and if it is provided, the offset
   1907   /// must be subtracted from the provided pointer to get the pointer with the
   1908   /// specified alignment.
   1909   CallInst *CreateAlignmentAssumption(const DataLayout &DL, Value *PtrValue,
   1910                                       unsigned Alignment,
   1911                                       Value *OffsetValue = nullptr) {
   1912     assert(isa<PointerType>(PtrValue->getType()) &&
   1913            "trying to create an alignment assumption on a non-pointer?");
   1914     PointerType *PtrTy = cast<PointerType>(PtrValue->getType());
   1915     Type *IntPtrTy = getIntPtrTy(DL, PtrTy->getAddressSpace());
   1916 
   1917     Value *Mask = ConstantInt::get(IntPtrTy, Alignment > 0 ? Alignment - 1 : 0);
   1918     return CreateAlignmentAssumptionHelper(DL, PtrValue, Mask, IntPtrTy,
   1919                                            OffsetValue);
   1920   }
   1921   //
   1922   /// \brief Create an assume intrinsic call that represents an alignment
   1923   /// assumption on the provided pointer.
   1924   ///
   1925   /// An optional offset can be provided, and if it is provided, the offset
   1926   /// must be subtracted from the provided pointer to get the pointer with the
   1927   /// specified alignment.
   1928   ///
   1929   /// This overload handles the condition where the Alignment is dependent
   1930   /// on an existing value rather than a static value.
   1931   CallInst *CreateAlignmentAssumption(const DataLayout &DL, Value *PtrValue,
   1932                                       Value *Alignment,
   1933                                       Value *OffsetValue = nullptr) {
   1934     assert(isa<PointerType>(PtrValue->getType()) &&
   1935            "trying to create an alignment assumption on a non-pointer?");
   1936     PointerType *PtrTy = cast<PointerType>(PtrValue->getType());
   1937     Type *IntPtrTy = getIntPtrTy(DL, PtrTy->getAddressSpace());
   1938 
   1939     if (Alignment->getType() != IntPtrTy)
   1940       Alignment = CreateIntCast(Alignment, IntPtrTy, /*isSigned*/ true,
   1941                                 "alignmentcast");
   1942     Value *IsPositive =
   1943         CreateICmp(CmpInst::ICMP_SGT, Alignment,
   1944                    ConstantInt::get(Alignment->getType(), 0), "ispositive");
   1945     Value *PositiveMask =
   1946         CreateSub(Alignment, ConstantInt::get(IntPtrTy, 1), "positivemask");
   1947     Value *Mask = CreateSelect(IsPositive, PositiveMask,
   1948                                ConstantInt::get(IntPtrTy, 0), "mask");
   1949 
   1950     return CreateAlignmentAssumptionHelper(DL, PtrValue, Mask, IntPtrTy,
   1951                                            OffsetValue);
   1952   }
   1953 };
   1954 
   1955 // Create wrappers for C Binding types (see CBindingWrapping.h).
   1956 DEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef)
   1957 
   1958 } // end namespace llvm
   1959 
   1960 #endif // LLVM_IR_IRBUILDER_H
   1961