106cb8ed00696eb14d1b831921452e50ec0568ea2Chandler Carruth//===---- llvm/IRBuilder.h - Builder for LLVM Instructions ------*- C++ -*-===//
2848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner//
3848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner//                     The LLVM Compiler Infrastructure
4848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner//
57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source
67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details.
7848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner//
8848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner//===----------------------------------------------------------------------===//
9848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner//
1089f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands// This file defines the IRBuilder class, which is used as a convenient way
11848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner// to create LLVM instructions with a consistent and simplified interface.
12848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner//
13848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner//===----------------------------------------------------------------------===//
14848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_IR_IRBUILDER_H
16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_IR_IRBUILDER_H
17848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner
18255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/ArrayRef.h"
19255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/StringRef.h"
20255f89faee13dc491cb64fbeae3c763e7e2ea4e6Chandler Carruth#include "llvm/ADT/Twine.h"
210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/BasicBlock.h"
220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Operator.h"
2640be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo#include "llvm/Support/CBindingWrapping.h"
271e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands#include "llvm/Support/ConstantFolder.h"
28848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner
29848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattnernamespace llvm {
3043469b6957140898709382082ef95dd4b77ac20aChris Lattner  class MDNode;
31848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner
32bc977bab42fb3f45df054af63b4bd748300f005aMichael Gottesman/// \brief This provides the default implementation of the IRBuilder
33bc977bab42fb3f45df054af63b4bd748300f005aMichael Gottesman/// 'InsertHelper' method that is called whenever an instruction is created by
34bc977bab42fb3f45df054af63b4bd748300f005aMichael Gottesman/// IRBuilder and needs to be inserted.
35bc977bab42fb3f45df054af63b4bd748300f005aMichael Gottesman///
36bc977bab42fb3f45df054af63b4bd748300f005aMichael Gottesman/// By default, this inserts the instruction at the insertion point.
370a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattnertemplate <bool preserveNames = true>
380a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattnerclass IRBuilderDefaultInserter {
390a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattnerprotected:
400a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattner  void InsertHelper(Instruction *I, const Twine &Name,
410a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattner                    BasicBlock *BB, BasicBlock::iterator InsertPt) const {
420a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattner    if (BB) BB->getInstList().insert(InsertPt, I);
430a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattner    if (preserveNames)
440a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattner      I->setName(Name);
450a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattner  }
460a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattner};
47a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner
48bc977bab42fb3f45df054af63b4bd748300f005aMichael Gottesman/// \brief Common base class shared among various IRBuilders.
49a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattnerclass IRBuilderBase {
5084e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner  DebugLoc CurDbgLocation;
51a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattnerprotected:
52848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  BasicBlock *BB;
53848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  BasicBlock::iterator InsertPt;
54d1fbd142945f5ef0c273c3d756431f8cb9d25dedOwen Anderson  LLVMContext &Context;
55848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattnerpublic:
560da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
57a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  IRBuilderBase(LLVMContext &context)
58a41b9153c3e568c874eb777d2b295659a9aca10aChris Lattner    : Context(context) {
59b2d746ce6df9b6c4ceef991ffb740eac6aea8173Dan Gohman    ClearInsertionPoint();
60b2d746ce6df9b6c4ceef991ffb740eac6aea8173Dan Gohman  }
610da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
62848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  //===--------------------------------------------------------------------===//
63848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  // Builder configuration methods
64848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  //===--------------------------------------------------------------------===//
650da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
66864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Clear the insertion point: created instructions will not be
67864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// inserted into a block.
68848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  void ClearInsertionPoint() {
69848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner    BB = 0;
707b934079c044311c56ebf3809c8c0047d88f825aNadav Rotem    InsertPt = 0;
71848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
720da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
73848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  BasicBlock *GetInsertBlock() const { return BB; }
74b60182f1b0218e0196c78f1cfeda2cf223a47146Dan Gohman  BasicBlock::iterator GetInsertPoint() const { return InsertPt; }
75a41b9153c3e568c874eb777d2b295659a9aca10aChris Lattner  LLVMContext &getContext() const { return Context; }
760da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
77864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief This specifies that created instructions should be appended to the
78864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// end of the specified block.
79848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  void SetInsertPoint(BasicBlock *TheBB) {
80848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner    BB = TheBB;
81848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner    InsertPt = BB->end();
82848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
830da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
84864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief This specifies that created instructions should be inserted before
85864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// the specified instruction.
86cc3029acdd4489c2cfe4c3e39fcb59241790d590Chris Lattner  void SetInsertPoint(Instruction *I) {
87cc3029acdd4489c2cfe4c3e39fcb59241790d590Chris Lattner    BB = I->getParent();
88cc3029acdd4489c2cfe4c3e39fcb59241790d590Chris Lattner    InsertPt = I;
89bcd5a0f7efa75eb48c88e0e94168ed7c77b6575dNadav Rotem    assert(I != BB->end() && "Can't read debug loc from end()");
902d48ad67cd3c18098edd9ed14437139bdf5b5f53Devang Patel    SetCurrentDebugLocation(I->getDebugLoc());
91cc3029acdd4489c2cfe4c3e39fcb59241790d590Chris Lattner  }
9245f454d5691cc23584992974f4460728a02186c8Andrew Trick
93864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief This specifies that created instructions should be inserted at the
94864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// specified point.
95848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  void SetInsertPoint(BasicBlock *TheBB, BasicBlock::iterator IP) {
96848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner    BB = TheBB;
97848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner    InsertPt = IP;
98848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
990da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
100864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Find the nearest point that dominates this use, and specify that
101864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// created instructions should be inserted at this point.
1023290239daff266dce1051dfd103106956e05a7b1Andrew Trick  void SetInsertPoint(Use &U) {
1033290239daff266dce1051dfd103106956e05a7b1Andrew Trick    Instruction *UseInst = cast<Instruction>(U.getUser());
1043290239daff266dce1051dfd103106956e05a7b1Andrew Trick    if (PHINode *Phi = dyn_cast<PHINode>(UseInst)) {
1053290239daff266dce1051dfd103106956e05a7b1Andrew Trick      BasicBlock *PredBB = Phi->getIncomingBlock(U);
1063290239daff266dce1051dfd103106956e05a7b1Andrew Trick      assert(U != PredBB->getTerminator() && "critical edge not split");
1073290239daff266dce1051dfd103106956e05a7b1Andrew Trick      SetInsertPoint(PredBB, PredBB->getTerminator());
1083290239daff266dce1051dfd103106956e05a7b1Andrew Trick      return;
1093290239daff266dce1051dfd103106956e05a7b1Andrew Trick    }
1103290239daff266dce1051dfd103106956e05a7b1Andrew Trick    SetInsertPoint(UseInst);
1113290239daff266dce1051dfd103106956e05a7b1Andrew Trick  }
1123290239daff266dce1051dfd103106956e05a7b1Andrew Trick
113864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Set location information used by debugging information.
11484e679beea11ac55ed7871eec4deaccdf393de3eChris Lattner  void SetCurrentDebugLocation(const DebugLoc &L) {
1155169c9e56771bb6a60d55de4786287eb6ec192eaChris Lattner    CurDbgLocation = L;
1165169c9e56771bb6a60d55de4786287eb6ec192eaChris Lattner  }
1170da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
118864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get location information used by debugging information.
119a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  DebugLoc getCurrentDebugLocation() const { return CurDbgLocation; }
1200da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
121864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief If this builder has a current debug location, set it on the
122864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// specified instruction.
1235169c9e56771bb6a60d55de4786287eb6ec192eaChris Lattner  void SetInstDebugLocation(Instruction *I) const {
124a41b9153c3e568c874eb777d2b295659a9aca10aChris Lattner    if (!CurDbgLocation.isUnknown())
125a41b9153c3e568c874eb777d2b295659a9aca10aChris Lattner      I->setDebugLoc(CurDbgLocation);
1265169c9e56771bb6a60d55de4786287eb6ec192eaChris Lattner  }
12743469b6957140898709382082ef95dd4b77ac20aChris Lattner
128864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get the return type of the current function that we're emitting
129864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// into.
130a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  Type *getCurrentFunctionReturnType() const;
13145f454d5691cc23584992974f4460728a02186c8Andrew Trick
1325ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall  /// InsertPoint - A saved insertion point.
1335ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall  class InsertPoint {
1345ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    BasicBlock *Block;
1355ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    BasicBlock::iterator Point;
1365ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall
1375ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall  public:
138864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman    /// \brief Creates a new insertion point which doesn't point to anything.
1395ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    InsertPoint() : Block(0) {}
1405ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall
141864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman    /// \brief Creates a new insertion point at the given location.
1425ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    InsertPoint(BasicBlock *InsertBlock, BasicBlock::iterator InsertPoint)
1435ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall      : Block(InsertBlock), Point(InsertPoint) {}
1445ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall
145864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman    /// \brief Returns true if this insert point is set.
1465ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    bool isSet() const { return (Block != 0); }
1475ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall
1485ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    llvm::BasicBlock *getBlock() const { return Block; }
1495ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    llvm::BasicBlock::iterator getPoint() const { return Point; }
1505ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall  };
1515ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall
152864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Returns the current insert point.
1535ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall  InsertPoint saveIP() const {
1545ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    return InsertPoint(GetInsertBlock(), GetInsertPoint());
1555ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall  }
1565ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall
157864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Returns the current insert point, clearing it in the process.
1585ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall  InsertPoint saveAndClearIP() {
1595ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    InsertPoint IP(GetInsertBlock(), GetInsertPoint());
1605ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    ClearInsertionPoint();
1615ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    return IP;
1625ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall  }
1635ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall
164864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Sets the current insert point to a previously-saved location.
1655ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall  void restoreIP(InsertPoint IP) {
1665ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    if (IP.isSet())
1675ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall      SetInsertPoint(IP.getBlock(), IP.getPoint());
1685ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall    else
1695ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall      ClearInsertionPoint();
1705ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall  }
1715ed9eee61aa8d87e8c2eaa2025bd7c73365fedbbJohn McCall
172a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  //===--------------------------------------------------------------------===//
173a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  // Miscellaneous creation methods.
174a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  //===--------------------------------------------------------------------===//
1750da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
176864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Make a new global variable with initializer type i8*
177864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  ///
178864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// Make a new global variable with an initializer that has array of i8 type
179864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// filled in with the null terminated string value specified.  The new global
180864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// variable will be marked mergable with any others of the same contents.  If
181864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// Name is specified, it is the name of the global variable created.
182cb4e4eae1afaa243c0654bc5dd668f9eb5085f06Nick Lewycky  Value *CreateGlobalString(StringRef Str, const Twine &Name = "");
183b271d8679ded357e70ee989d708cdd2c963342b2John McCall
184864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get a constant value representing either true or false.
185b271d8679ded357e70ee989d708cdd2c963342b2John McCall  ConstantInt *getInt1(bool V) {
186b271d8679ded357e70ee989d708cdd2c963342b2John McCall    return ConstantInt::get(getInt1Ty(), V);
187b271d8679ded357e70ee989d708cdd2c963342b2John McCall  }
188b271d8679ded357e70ee989d708cdd2c963342b2John McCall
189864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get the constant value for i1 true.
190b271d8679ded357e70ee989d708cdd2c963342b2John McCall  ConstantInt *getTrue() {
191b271d8679ded357e70ee989d708cdd2c963342b2John McCall    return ConstantInt::getTrue(Context);
192b271d8679ded357e70ee989d708cdd2c963342b2John McCall  }
193b271d8679ded357e70ee989d708cdd2c963342b2John McCall
194864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get the constant value for i1 false.
195b271d8679ded357e70ee989d708cdd2c963342b2John McCall  ConstantInt *getFalse() {
196b271d8679ded357e70ee989d708cdd2c963342b2John McCall    return ConstantInt::getFalse(Context);
197b271d8679ded357e70ee989d708cdd2c963342b2John McCall  }
198b271d8679ded357e70ee989d708cdd2c963342b2John McCall
199864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get a constant 8-bit value.
200b271d8679ded357e70ee989d708cdd2c963342b2John McCall  ConstantInt *getInt8(uint8_t C) {
201b271d8679ded357e70ee989d708cdd2c963342b2John McCall    return ConstantInt::get(getInt8Ty(), C);
202b271d8679ded357e70ee989d708cdd2c963342b2John McCall  }
203b271d8679ded357e70ee989d708cdd2c963342b2John McCall
204864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get a constant 16-bit value.
205b271d8679ded357e70ee989d708cdd2c963342b2John McCall  ConstantInt *getInt16(uint16_t C) {
206b271d8679ded357e70ee989d708cdd2c963342b2John McCall    return ConstantInt::get(getInt16Ty(), C);
207b271d8679ded357e70ee989d708cdd2c963342b2John McCall  }
208b271d8679ded357e70ee989d708cdd2c963342b2John McCall
209864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get a constant 32-bit value.
210b271d8679ded357e70ee989d708cdd2c963342b2John McCall  ConstantInt *getInt32(uint32_t C) {
211b271d8679ded357e70ee989d708cdd2c963342b2John McCall    return ConstantInt::get(getInt32Ty(), C);
212b271d8679ded357e70ee989d708cdd2c963342b2John McCall  }
2130da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
214864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get a constant 64-bit value.
215b271d8679ded357e70ee989d708cdd2c963342b2John McCall  ConstantInt *getInt64(uint64_t C) {
216b271d8679ded357e70ee989d708cdd2c963342b2John McCall    return ConstantInt::get(getInt64Ty(), C);
217b271d8679ded357e70ee989d708cdd2c963342b2John McCall  }
21845f454d5691cc23584992974f4460728a02186c8Andrew Trick
219864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get a constant integer value.
220562ae4bba616de518f76a73618c96835637c8d4aChris Lattner  ConstantInt *getInt(const APInt &AI) {
221562ae4bba616de518f76a73618c96835637c8d4aChris Lattner    return ConstantInt::get(Context, AI);
222562ae4bba616de518f76a73618c96835637c8d4aChris Lattner  }
2230da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
224848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  //===--------------------------------------------------------------------===//
2250668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  // Type creation methods
2260668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  //===--------------------------------------------------------------------===//
2270da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
228864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Fetch the type representing a single bit
229a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  IntegerType *getInt1Ty() {
2300668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson    return Type::getInt1Ty(Context);
2310668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  }
2320da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
233864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Fetch the type representing an 8-bit integer.
234a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  IntegerType *getInt8Ty() {
2350668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson    return Type::getInt8Ty(Context);
2360668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  }
2370da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
238864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Fetch the type representing a 16-bit integer.
239a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  IntegerType *getInt16Ty() {
2400668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson    return Type::getInt16Ty(Context);
2410668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  }
2420da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
243864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Fetch the type representing a 32-bit integer.
244a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  IntegerType *getInt32Ty() {
2450668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson    return Type::getInt32Ty(Context);
2460668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  }
2470da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
248864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Fetch the type representing a 64-bit integer.
249a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  IntegerType *getInt64Ty() {
2500668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson    return Type::getInt64Ty(Context);
2510668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  }
2520da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
253864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Fetch the type representing a 32-bit floating point value.
254a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  Type *getFloatTy() {
2550668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson    return Type::getFloatTy(Context);
2560668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  }
2570da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
258864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Fetch the type representing a 64-bit floating point value.
259a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  Type *getDoubleTy() {
2600668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson    return Type::getDoubleTy(Context);
2610668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  }
2620da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
263864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Fetch the type representing void.
264a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  Type *getVoidTy() {
2650668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson    return Type::getVoidTy(Context);
266e2381787aa98b995daf56f1277b169aabba9cd46Eric Christopher  }
2670da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
268864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Fetch the type representing a pointer to an 8-bit integer value.
269a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner  PointerType *getInt8PtrTy(unsigned AddrSpace = 0) {
270c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner    return Type::getInt8PtrTy(Context, AddrSpace);
2710668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  }
2720da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
273864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Fetch the type representing a pointer to an integer value.
274e08a57824c78c98601860df12d4184acbf1c9de2Matt Arsenault  IntegerType* getIntPtrTy(const DataLayout *DL, unsigned AddrSpace = 0) {
2750ceb855d5251c67c3a129c172a520c1d2682c344Evgeniy Stepanov    return DL->getIntPtrType(Context, AddrSpace);
2760ceb855d5251c67c3a129c172a520c1d2682c344Evgeniy Stepanov  }
2770ceb855d5251c67c3a129c172a520c1d2682c344Evgeniy Stepanov
2780cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky  //===--------------------------------------------------------------------===//
2790cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky  // Intrinsic creation methods
2800cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky  //===--------------------------------------------------------------------===//
2810cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky
282864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create and insert a memset to the specified pointer and the
283864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// specified value.
284864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  ///
285864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// If the pointer isn't an i8*, it will be converted.  If a TBAA tag is
286864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// specified, it will be added to the instruction.
287c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  CallInst *CreateMemSet(Value *Ptr, Value *Val, uint64_t Size, unsigned Align,
288c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner                         bool isVolatile = false, MDNode *TBAATag = 0) {
289c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner    return CreateMemSet(Ptr, Val, getInt64(Size), Align, isVolatile, TBAATag);
290c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  }
29145f454d5691cc23584992974f4460728a02186c8Andrew Trick
292c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  CallInst *CreateMemSet(Value *Ptr, Value *Val, Value *Size, unsigned Align,
293c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner                         bool isVolatile = false, MDNode *TBAATag = 0);
294c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner
295864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create and insert a memcpy between the specified pointers.
296864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  ///
297c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  /// If the pointers aren't i8*, they will be converted.  If a TBAA tag is
298c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  /// specified, it will be added to the instruction.
299c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  CallInst *CreateMemCpy(Value *Dst, Value *Src, uint64_t Size, unsigned Align,
3008a63f99f038e56245d0f5049966727cc87264c0cDan Gohman                         bool isVolatile = false, MDNode *TBAATag = 0,
3018a63f99f038e56245d0f5049966727cc87264c0cDan Gohman                         MDNode *TBAAStructTag = 0) {
3028a63f99f038e56245d0f5049966727cc87264c0cDan Gohman    return CreateMemCpy(Dst, Src, getInt64(Size), Align, isVolatile, TBAATag,
3038a63f99f038e56245d0f5049966727cc87264c0cDan Gohman                        TBAAStructTag);
304c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  }
30545f454d5691cc23584992974f4460728a02186c8Andrew Trick
306c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  CallInst *CreateMemCpy(Value *Dst, Value *Src, Value *Size, unsigned Align,
3078a63f99f038e56245d0f5049966727cc87264c0cDan Gohman                         bool isVolatile = false, MDNode *TBAATag = 0,
3088a63f99f038e56245d0f5049966727cc87264c0cDan Gohman                         MDNode *TBAAStructTag = 0);
309c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner
310864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create and insert a memmove between the specified
311864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// pointers.
312864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  ///
313864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// If the pointers aren't i8*, they will be converted.  If a TBAA tag is
314864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// specified, it will be added to the instruction.
315c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  CallInst *CreateMemMove(Value *Dst, Value *Src, uint64_t Size, unsigned Align,
316c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner                          bool isVolatile = false, MDNode *TBAATag = 0) {
317c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner    return CreateMemMove(Dst, Src, getInt64(Size), Align, isVolatile, TBAATag);
318c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  }
31945f454d5691cc23584992974f4460728a02186c8Andrew Trick
320c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  CallInst *CreateMemMove(Value *Dst, Value *Src, Value *Size, unsigned Align,
32145f454d5691cc23584992974f4460728a02186c8Andrew Trick                          bool isVolatile = false, MDNode *TBAATag = 0);
3220cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky
323864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create a lifetime.start intrinsic.
324864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  ///
325864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// If the pointer isn't i8* it will be converted.
3260cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky  CallInst *CreateLifetimeStart(Value *Ptr, ConstantInt *Size = 0);
3270cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky
328864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create a lifetime.end intrinsic.
329864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  ///
330864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// If the pointer isn't i8* it will be converted.
3310cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky  CallInst *CreateLifetimeEnd(Value *Ptr, ConstantInt *Size = 0);
3320cf51561eddd659a7b427f40144e22363fd95a57Nick Lewycky
333c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattnerprivate:
334c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  Value *getCastedInt8PtrValue(Value *Ptr);
335a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner};
3360da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
337bc977bab42fb3f45df054af63b4bd748300f005aMichael Gottesman/// \brief This provides a uniform API for creating instructions and inserting
338bc977bab42fb3f45df054af63b4bd748300f005aMichael Gottesman/// them into a basic block: either at the end of a BasicBlock, or at a specific
339bc977bab42fb3f45df054af63b4bd748300f005aMichael Gottesman/// iterator location in a block.
340a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner///
341a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// Note that the builder does not expose the full generality of LLVM
342a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// instructions.  For access to extra instruction properties, use the mutators
3439992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman/// (e.g. setVolatile) on the instructions after they have been
3449992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman/// created. Convenience state exists to specify fast-math flags and fp-math
3459992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman/// tags.
3469992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman///
347a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// The first template argument handles whether or not to preserve names in the
348a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// final instruction output. This defaults to on.  The second template argument
349a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// specifies a class to use for creating constants.  This defaults to creating
350a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// minimally folded constants.  The fourth template argument allows clients to
351a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// specify custom insertion hooks that are called on every newly created
352a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner/// insertion.
353a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattnertemplate<bool preserveNames = true, typename T = ConstantFolder,
354a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner         typename Inserter = IRBuilderDefaultInserter<preserveNames> >
355a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattnerclass IRBuilder : public IRBuilderBase, public Inserter {
356a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  T Folder;
3578883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  MDNode *DefaultFPMathTag;
3589992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman  FastMathFlags FMF;
359a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattnerpublic:
3608883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  IRBuilder(LLVMContext &C, const T &F, const Inserter &I = Inserter(),
3618883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands            MDNode *FPMathTag = 0)
3629992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    : IRBuilderBase(C), Inserter(I), Folder(F), DefaultFPMathTag(FPMathTag),
3639992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman      FMF() {
364a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  }
3650da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
3669992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman  explicit IRBuilder(LLVMContext &C, MDNode *FPMathTag = 0)
3679992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    : IRBuilderBase(C), Folder(), DefaultFPMathTag(FPMathTag), FMF() {
368a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  }
3690da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
3708883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  explicit IRBuilder(BasicBlock *TheBB, const T &F, MDNode *FPMathTag = 0)
3718883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands    : IRBuilderBase(TheBB->getContext()), Folder(F),
3729992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman      DefaultFPMathTag(FPMathTag), FMF() {
373a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner    SetInsertPoint(TheBB);
374a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  }
3750da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
3768883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  explicit IRBuilder(BasicBlock *TheBB, MDNode *FPMathTag = 0)
3778883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands    : IRBuilderBase(TheBB->getContext()), Folder(),
3789992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman      DefaultFPMathTag(FPMathTag), FMF() {
379a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner    SetInsertPoint(TheBB);
380a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  }
3810da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
3828883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  explicit IRBuilder(Instruction *IP, MDNode *FPMathTag = 0)
3839992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    : IRBuilderBase(IP->getContext()), Folder(), DefaultFPMathTag(FPMathTag),
3849992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman      FMF() {
385c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner    SetInsertPoint(IP);
3866a0ce750f795be672b0cbe58d963d4d49d2cd90cDevang Patel    SetCurrentDebugLocation(IP->getDebugLoc());
387c0d5496b8aa9993e61ac5770e58184dd32f709bfChris Lattner  }
38845f454d5691cc23584992974f4460728a02186c8Andrew Trick
3898883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  explicit IRBuilder(Use &U, MDNode *FPMathTag = 0)
3909992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    : IRBuilderBase(U->getContext()), Folder(), DefaultFPMathTag(FPMathTag),
3919992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman      FMF() {
3923290239daff266dce1051dfd103106956e05a7b1Andrew Trick    SetInsertPoint(U);
3933290239daff266dce1051dfd103106956e05a7b1Andrew Trick    SetCurrentDebugLocation(cast<Instruction>(U.getUser())->getDebugLoc());
3943290239daff266dce1051dfd103106956e05a7b1Andrew Trick  }
3953290239daff266dce1051dfd103106956e05a7b1Andrew Trick
3968883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, const T& F,
3978883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands            MDNode *FPMathTag = 0)
3988883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands    : IRBuilderBase(TheBB->getContext()), Folder(F),
3999992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman      DefaultFPMathTag(FPMathTag), FMF() {
400a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner    SetInsertPoint(TheBB, IP);
401a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  }
4020da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
4038883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  IRBuilder(BasicBlock *TheBB, BasicBlock::iterator IP, MDNode *FPMathTag = 0)
4048883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands    : IRBuilderBase(TheBB->getContext()), Folder(),
4059992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman      DefaultFPMathTag(FPMathTag), FMF() {
406a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner    SetInsertPoint(TheBB, IP);
407a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  }
408a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner
409864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get the constant folder being used.
410a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  const T &getFolder() { return Folder; }
411a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner
412864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get the floating point math metadata being used.
4138883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  MDNode *getDefaultFPMathTag() const { return DefaultFPMathTag; }
4148883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands
415864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Get the flags to be applied to created floating point ops
4169992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman  FastMathFlags getFastMathFlags() const { return FMF; }
4179992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman
418864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Clear the fast-math flags.
4199992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman  void clearFastMathFlags() { FMF.clear(); }
4209992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman
421864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief SetDefaultFPMathTag - Set the floating point math metadata to be used.
4228883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  void SetDefaultFPMathTag(MDNode *FPMathTag) { DefaultFPMathTag = FPMathTag; }
4238883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands
424864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Set the fast-math flags to be used with generated fp-math operators
4259992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman  void SetFastMathFlags(FastMathFlags NewFMF) { FMF = NewFMF; }
4269992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman
427864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Return true if this builder is configured to actually add the
428864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// requested names to IR created through it.
429a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  bool isNamePreserving() const { return preserveNames; }
4300da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
431864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Insert and return the specified instruction.
432a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  template<typename InstTy>
433a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  InstTy *Insert(InstTy *I, const Twine &Name = "") const {
434a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner    this->InsertHelper(I, Name, BB, InsertPt);
435da6de52435d05e73e3691006e9f8d78e0102343eDavid Blaikie    this->SetInstDebugLocation(I);
436a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner    return I;
437a53cfd16f075f22655a8c965b122aea38e635aa3Chris Lattner  }
4380668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson
439864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief No-op overload to handle constants.
44085a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner  Constant *Insert(Constant *C, const Twine& = "") const {
44185a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner    return C;
44285a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner  }
44385a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner
4440668dc7955644dcf5003b5356dabf9edb847932fOwen Anderson  //===--------------------------------------------------------------------===//
445848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  // Instruction creation methods: Terminators
446848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  //===--------------------------------------------------------------------===//
447848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner
448299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruthprivate:
449299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth  /// \brief Helper to add branch weight metadata onto an instruction.
450299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth  /// \returns The annotated instruction.
451299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth  template <typename InstTy>
452299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth  InstTy *addBranchWeights(InstTy *I, MDNode *Weights) {
453299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth    if (Weights)
454299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth      I->setMetadata(LLVMContext::MD_prof, Weights);
455299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth    return I;
456299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth  }
457299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth
458299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruthpublic:
459864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create a 'ret void' instruction.
460848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  ReturnInst *CreateRetVoid() {
461d644cb8ff5c4774af8c9c75d73c6cb7b29102809Erick Tryzelaar    return Insert(ReturnInst::Create(Context));
462848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
463848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner
464864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create a 'ret <val>' instruction.
465848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  ReturnInst *CreateRet(Value *V) {
466d644cb8ff5c4774af8c9c75d73c6cb7b29102809Erick Tryzelaar    return Insert(ReturnInst::Create(Context, V));
467848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
4680da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
469864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create a sequence of N insertvalue instructions,
470d6851816690847d0fd9384aa4cdde36d78462918Dan Gohman  /// with one Value from the retVals array each, that build a aggregate
471d6851816690847d0fd9384aa4cdde36d78462918Dan Gohman  /// return value one value at a time, and a ret instruction to return
472864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// the resulting aggregate value.
473d6851816690847d0fd9384aa4cdde36d78462918Dan Gohman  ///
474864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// This is a convenience function for code that uses aggregate return values
475864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// as a vehicle for having multiple return values.
4762ad32752b9a880902550c7c47f1b9ca175ee851cChris Lattner  ReturnInst *CreateAggregateRet(Value *const *retVals, unsigned N) {
4772ad32752b9a880902550c7c47f1b9ca175ee851cChris Lattner    Value *V = UndefValue::get(getCurrentFunctionReturnType());
478fc74abfba5128544a750fce22fdf13eb0403e3ceDan Gohman    for (unsigned i = 0; i != N; ++i)
479fc74abfba5128544a750fce22fdf13eb0403e3ceDan Gohman      V = CreateInsertValue(V, retVals[i], i, "mrv");
480d644cb8ff5c4774af8c9c75d73c6cb7b29102809Erick Tryzelaar    return Insert(ReturnInst::Create(Context, V));
481751858304488f40ea4632c0b217799df159b15cdDevang Patel  }
4821e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
483864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create an unconditional 'br label X' instruction.
484848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  BranchInst *CreateBr(BasicBlock *Dest) {
485051a950000e21935165db56695e35bade668193bGabor Greif    return Insert(BranchInst::Create(Dest));
486848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
487848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner
488864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create a conditional 'br Cond, TrueDest, FalseDest'
489848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  /// instruction.
490299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth  BranchInst *CreateCondBr(Value *Cond, BasicBlock *True, BasicBlock *False,
491299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth                           MDNode *BranchWeights = 0) {
492299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth    return Insert(addBranchWeights(BranchInst::Create(True, False, Cond),
493299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth                                   BranchWeights));
494848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
4951e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
496864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create a switch instruction with the specified value, default dest,
497864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// and with a hint for the number of cases that will be added (for efficient
498864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// allocation).
499299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth  SwitchInst *CreateSwitch(Value *V, BasicBlock *Dest, unsigned NumCases = 10,
500299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth                           MDNode *BranchWeights = 0) {
501299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth    return Insert(addBranchWeights(SwitchInst::Create(V, Dest, NumCases),
502299493720382ab26e0842eca233fd240dce3b3d6Chandler Carruth                                   BranchWeights));
503848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
5041e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
505864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create an indirect branch instruction with the specified address
506864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// operand, with an optional hint for the number of destinations that will be
507864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// added (for efficient allocation).
508a809d2fb2759807e11babd294e4257ff45c220deChris Lattner  IndirectBrInst *CreateIndirectBr(Value *Addr, unsigned NumDests = 10) {
509a809d2fb2759807e11babd294e4257ff45c220deChris Lattner    return Insert(IndirectBrInst::Create(Addr, NumDests));
510a809d2fb2759807e11babd294e4257ff45c220deChris Lattner  }
511a809d2fb2759807e11babd294e4257ff45c220deChris Lattner
512b39a40757680a4d2e713614abe7b0ac723206178Mike Stump  InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
513b39a40757680a4d2e713614abe7b0ac723206178Mike Stump                           BasicBlock *UnwindDest, const Twine &Name = "") {
514a3efbb15ddd5aa9006564cd79086723640084878Jay Foad    return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest,
515a3efbb15ddd5aa9006564cd79086723640084878Jay Foad                                     ArrayRef<Value *>()),
516a3efbb15ddd5aa9006564cd79086723640084878Jay Foad                  Name);
517b39a40757680a4d2e713614abe7b0ac723206178Mike Stump  }
518b39a40757680a4d2e713614abe7b0ac723206178Mike Stump  InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
519b39a40757680a4d2e713614abe7b0ac723206178Mike Stump                           BasicBlock *UnwindDest, Value *Arg1,
520b39a40757680a4d2e713614abe7b0ac723206178Mike Stump                           const Twine &Name = "") {
521a3efbb15ddd5aa9006564cd79086723640084878Jay Foad    return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Arg1),
522a3efbb15ddd5aa9006564cd79086723640084878Jay Foad                  Name);
523b39a40757680a4d2e713614abe7b0ac723206178Mike Stump  }
5249b195eaefd1fbffe2df5cd7378182eb836505240Mike Stump  InvokeInst *CreateInvoke3(Value *Callee, BasicBlock *NormalDest,
5259b195eaefd1fbffe2df5cd7378182eb836505240Mike Stump                            BasicBlock *UnwindDest, Value *Arg1,
5269b195eaefd1fbffe2df5cd7378182eb836505240Mike Stump                            Value *Arg2, Value *Arg3,
5279b195eaefd1fbffe2df5cd7378182eb836505240Mike Stump                            const Twine &Name = "") {
5289b195eaefd1fbffe2df5cd7378182eb836505240Mike Stump    Value *Args[] = { Arg1, Arg2, Arg3 };
529a3efbb15ddd5aa9006564cd79086723640084878Jay Foad    return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args),
530a3efbb15ddd5aa9006564cd79086723640084878Jay Foad                  Name);
5319b195eaefd1fbffe2df5cd7378182eb836505240Mike Stump  }
532864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create an invoke instruction.
5331e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  InvokeInst *CreateInvoke(Value *Callee, BasicBlock *NormalDest,
534a3efbb15ddd5aa9006564cd79086723640084878Jay Foad                           BasicBlock *UnwindDest, ArrayRef<Value *> Args,
535d33b77bbb04d8f90e58cd83f695745ba21178d41Mikhail Glushenkov                           const Twine &Name = "") {
536a3efbb15ddd5aa9006564cd79086723640084878Jay Foad    return Insert(InvokeInst::Create(Callee, NormalDest, UnwindDest, Args),
537a3efbb15ddd5aa9006564cd79086723640084878Jay Foad                  Name);
538848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
5391e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
540dccc03b2423fe65efb5963ae816b99c24fc53374Bill Wendling  ResumeInst *CreateResume(Value *Exn) {
541dccc03b2423fe65efb5963ae816b99c24fc53374Bill Wendling    return Insert(ResumeInst::Create(Exn));
542dccc03b2423fe65efb5963ae816b99c24fc53374Bill Wendling  }
543dccc03b2423fe65efb5963ae816b99c24fc53374Bill Wendling
544848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  UnreachableInst *CreateUnreachable() {
5451d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson    return Insert(new UnreachableInst(Context));
546848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
5471e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
548848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  //===--------------------------------------------------------------------===//
549848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  // Instruction creation methods: Binary Operators
550848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  //===--------------------------------------------------------------------===//
55181baf14fdfa29c22a08d609144c285169e23a247Chris Lattnerprivate:
55281baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  BinaryOperator *CreateInsertNUWNSWBinOp(BinaryOperator::BinaryOps Opc,
55381baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                                          Value *LHS, Value *RHS,
55481baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                                          const Twine &Name,
55581baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                                          bool HasNUW, bool HasNSW) {
55681baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    BinaryOperator *BO = Insert(BinaryOperator::Create(Opc, LHS, RHS), Name);
55781baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    if (HasNUW) BO->setHasNoUnsignedWrap();
55881baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    if (HasNSW) BO->setHasNoSignedWrap();
55981baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return BO;
56081baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  }
5618883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands
5629992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman  Instruction *AddFPMathAttributes(Instruction *I,
5639992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman                                   MDNode *FPMathTag,
5649992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman                                   FastMathFlags FMF) const {
5658883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands    if (!FPMathTag)
5668883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands      FPMathTag = DefaultFPMathTag;
5678883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands    if (FPMathTag)
5688883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands      I->setMetadata(LLVMContext::MD_fpmath, FPMathTag);
5699992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    I->setFastMathFlags(FMF);
5708883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands    return I;
5718883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  }
57281baf14fdfa29c22a08d609144c285169e23a247Chris Lattnerpublic:
57381baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Value *CreateAdd(Value *LHS, Value *RHS, const Twine &Name = "",
57481baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                   bool HasNUW = false, bool HasNSW = false) {
57589f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
57689f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
57781baf14fdfa29c22a08d609144c285169e23a247Chris Lattner        return Insert(Folder.CreateAdd(LC, RC, HasNUW, HasNSW), Name);
57881baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateInsertNUWNSWBinOp(Instruction::Add, LHS, RHS, Name,
57981baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                                   HasNUW, HasNSW);
580848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
5819d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateNSWAdd(Value *LHS, Value *RHS, const Twine &Name = "") {
58281baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateAdd(LHS, RHS, Name, false, true);
583d6474fa1f19224e62e5095a6373bed0c69bdb215Dan Gohman  }
5848991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  Value *CreateNUWAdd(Value *LHS, Value *RHS, const Twine &Name = "") {
58581baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateAdd(LHS, RHS, Name, true, false);
5868991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
5878883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  Value *CreateFAdd(Value *LHS, Value *RHS, const Twine &Name = "",
5888883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands                    MDNode *FPMathTag = 0) {
589ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    if (Constant *LC = dyn_cast<Constant>(LHS))
590ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman      if (Constant *RC = dyn_cast<Constant>(RHS))
59185a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateFAdd(LC, RC), Name);
5929992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    return Insert(AddFPMathAttributes(BinaryOperator::CreateFAdd(LHS, RHS),
5939992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman                                      FPMathTag, FMF), Name);
594ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
59581baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Value *CreateSub(Value *LHS, Value *RHS, const Twine &Name = "",
59681baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                   bool HasNUW = false, bool HasNSW = false) {
59789f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
59889f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
59985a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateSub(LC, RC), Name);
60081baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateInsertNUWNSWBinOp(Instruction::Sub, LHS, RHS, Name,
60181baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                                   HasNUW, HasNSW);
602b9c129d553c8f2ebdb82969d31c5478f899033bcDuncan Sands  }
603b9c129d553c8f2ebdb82969d31c5478f899033bcDuncan Sands  Value *CreateNSWSub(Value *LHS, Value *RHS, const Twine &Name = "") {
60481baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateSub(LHS, RHS, Name, false, true);
605848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
6068991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  Value *CreateNUWSub(Value *LHS, Value *RHS, const Twine &Name = "") {
60781baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateSub(LHS, RHS, Name, true, false);
6088991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
6098883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  Value *CreateFSub(Value *LHS, Value *RHS, const Twine &Name = "",
6108883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands                    MDNode *FPMathTag = 0) {
611ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    if (Constant *LC = dyn_cast<Constant>(LHS))
612ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman      if (Constant *RC = dyn_cast<Constant>(RHS))
61385a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateFSub(LC, RC), Name);
6149992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    return Insert(AddFPMathAttributes(BinaryOperator::CreateFSub(LHS, RHS),
6159992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman                                      FPMathTag, FMF), Name);
616ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
61781baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Value *CreateMul(Value *LHS, Value *RHS, const Twine &Name = "",
61881baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                   bool HasNUW = false, bool HasNSW = false) {
61989f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
62089f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
62185a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateMul(LC, RC), Name);
62281baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateInsertNUWNSWBinOp(Instruction::Mul, LHS, RHS, Name,
62381baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                                   HasNUW, HasNSW);
624848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
625411984810e4a66591123e1b16873e5f19ae18817Dan Gohman  Value *CreateNSWMul(Value *LHS, Value *RHS, const Twine &Name = "") {
62681baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateMul(LHS, RHS, Name, false, true);
627411984810e4a66591123e1b16873e5f19ae18817Dan Gohman  }
6288991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  Value *CreateNUWMul(Value *LHS, Value *RHS, const Twine &Name = "") {
62981baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateMul(LHS, RHS, Name, true, false);
6308991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
6318883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  Value *CreateFMul(Value *LHS, Value *RHS, const Twine &Name = "",
6328883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands                    MDNode *FPMathTag = 0) {
633ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman    if (Constant *LC = dyn_cast<Constant>(LHS))
634ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman      if (Constant *RC = dyn_cast<Constant>(RHS))
63585a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateFMul(LC, RC), Name);
6369992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    return Insert(AddFPMathAttributes(BinaryOperator::CreateFMul(LHS, RHS),
6379992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman                                      FPMathTag, FMF), Name);
638ae3a0be92e33bc716722aa600983fc1535acb122Dan Gohman  }
639aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner  Value *CreateUDiv(Value *LHS, Value *RHS, const Twine &Name = "",
640aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner                    bool isExact = false) {
64189f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
64289f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
643aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner        return Insert(Folder.CreateUDiv(LC, RC, isExact), Name);
644aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    if (!isExact)
645aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner      return Insert(BinaryOperator::CreateUDiv(LHS, RHS), Name);
646aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return Insert(BinaryOperator::CreateExactUDiv(LHS, RHS), Name);
647848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
6481dbf0df996bba398a70abccc714b1a9652330014Duncan Sands  Value *CreateExactUDiv(Value *LHS, Value *RHS, const Twine &Name = "") {
649aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateUDiv(LHS, RHS, Name, true);
6501dbf0df996bba398a70abccc714b1a9652330014Duncan Sands  }
651aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner  Value *CreateSDiv(Value *LHS, Value *RHS, const Twine &Name = "",
652aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner                    bool isExact = false) {
65389f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
65489f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
655aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner        return Insert(Folder.CreateSDiv(LC, RC, isExact), Name);
656aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    if (!isExact)
657aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner      return Insert(BinaryOperator::CreateSDiv(LHS, RHS), Name);
658aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return Insert(BinaryOperator::CreateExactSDiv(LHS, RHS), Name);
659848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
6609d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateExactSDiv(Value *LHS, Value *RHS, const Twine &Name = "") {
661aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateSDiv(LHS, RHS, Name, true);
66259c4f5c2fc82af14b0f4f332709aac62921c6177Dan Gohman  }
6638883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  Value *CreateFDiv(Value *LHS, Value *RHS, const Twine &Name = "",
6648883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands                    MDNode *FPMathTag = 0) {
66589f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
66689f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
66785a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateFDiv(LC, RC), Name);
6689992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    return Insert(AddFPMathAttributes(BinaryOperator::CreateFDiv(LHS, RHS),
6699992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman                                      FPMathTag, FMF), Name);
670848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
6719d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateURem(Value *LHS, Value *RHS, const Twine &Name = "") {
67289f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
67389f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
67485a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateURem(LC, RC), Name);
67525b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(BinaryOperator::CreateURem(LHS, RHS), Name);
676848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
6779d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateSRem(Value *LHS, Value *RHS, const Twine &Name = "") {
67889f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
67989f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
68085a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateSRem(LC, RC), Name);
68125b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(BinaryOperator::CreateSRem(LHS, RHS), Name);
682848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
6838883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  Value *CreateFRem(Value *LHS, Value *RHS, const Twine &Name = "",
6848883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands                    MDNode *FPMathTag = 0) {
68589f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
68689f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
68785a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateFRem(LC, RC), Name);
6889992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    return Insert(AddFPMathAttributes(BinaryOperator::CreateFRem(LHS, RHS),
6899992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman                                      FPMathTag, FMF), Name);
690848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
691ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar
69281baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Value *CreateShl(Value *LHS, Value *RHS, const Twine &Name = "",
69381baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                   bool HasNUW = false, bool HasNSW = false) {
69489f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
69589f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
69681baf14fdfa29c22a08d609144c285169e23a247Chris Lattner        return Insert(Folder.CreateShl(LC, RC, HasNUW, HasNSW), Name);
69781baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateInsertNUWNSWBinOp(Instruction::Shl, LHS, RHS, Name,
69881baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                                   HasNUW, HasNSW);
699848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
70081baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Value *CreateShl(Value *LHS, const APInt &RHS, const Twine &Name = "",
70181baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                   bool HasNUW = false, bool HasNSW = false) {
70281baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateShl(LHS, ConstantInt::get(LHS->getType(), RHS), Name,
70381baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                     HasNUW, HasNSW);
704ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  }
70581baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Value *CreateShl(Value *LHS, uint64_t RHS, const Twine &Name = "",
70681baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                   bool HasNUW = false, bool HasNSW = false) {
70781baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateShl(LHS, ConstantInt::get(LHS->getType(), RHS), Name,
70881baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                     HasNUW, HasNSW);
70990ec9680a9b0c76bbc739d7309e4611b478ebe91Chris Lattner  }
71090ec9680a9b0c76bbc739d7309e4611b478ebe91Chris Lattner
711aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner  Value *CreateLShr(Value *LHS, Value *RHS, const Twine &Name = "",
712aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner                    bool isExact = false) {
71389f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
71489f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
715aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner        return Insert(Folder.CreateLShr(LC, RC, isExact), Name);
716aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    if (!isExact)
717aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner      return Insert(BinaryOperator::CreateLShr(LHS, RHS), Name);
718aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return Insert(BinaryOperator::CreateExactLShr(LHS, RHS), Name);
719848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
720aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner  Value *CreateLShr(Value *LHS, const APInt &RHS, const Twine &Name = "",
721aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner                    bool isExact = false) {
722aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateLShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
723ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  }
724aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner  Value *CreateLShr(Value *LHS, uint64_t RHS, const Twine &Name = "",
725aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner                    bool isExact = false) {
726aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateLShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
72790ec9680a9b0c76bbc739d7309e4611b478ebe91Chris Lattner  }
728ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar
729aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner  Value *CreateAShr(Value *LHS, Value *RHS, const Twine &Name = "",
730aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner                    bool isExact = false) {
73189f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
73289f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
733aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner        return Insert(Folder.CreateAShr(LC, RC, isExact), Name);
734aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    if (!isExact)
735aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner      return Insert(BinaryOperator::CreateAShr(LHS, RHS), Name);
736aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return Insert(BinaryOperator::CreateExactAShr(LHS, RHS), Name);
737848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
738aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner  Value *CreateAShr(Value *LHS, const APInt &RHS, const Twine &Name = "",
739aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner                    bool isExact = false) {
740aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateAShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
741ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  }
742aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner  Value *CreateAShr(Value *LHS, uint64_t RHS, const Twine &Name = "",
743aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner                    bool isExact = false) {
744aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateAShr(LHS, ConstantInt::get(LHS->getType(), RHS), Name,isExact);
74590ec9680a9b0c76bbc739d7309e4611b478ebe91Chris Lattner  }
74690ec9680a9b0c76bbc739d7309e4611b478ebe91Chris Lattner
7479d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateAnd(Value *LHS, Value *RHS, const Twine &Name = "") {
7486bffa63dfea29a525bbd38ff46d03bcc40459dcaChris Lattner    if (Constant *RC = dyn_cast<Constant>(RHS)) {
7496bffa63dfea29a525bbd38ff46d03bcc40459dcaChris Lattner      if (isa<ConstantInt>(RC) && cast<ConstantInt>(RC)->isAllOnesValue())
7506bffa63dfea29a525bbd38ff46d03bcc40459dcaChris Lattner        return LHS;  // LHS & -1 -> LHS
7516bffa63dfea29a525bbd38ff46d03bcc40459dcaChris Lattner      if (Constant *LC = dyn_cast<Constant>(LHS))
75285a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateAnd(LC, RC), Name);
7536bffa63dfea29a525bbd38ff46d03bcc40459dcaChris Lattner    }
75425b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(BinaryOperator::CreateAnd(LHS, RHS), Name);
755848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
756ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  Value *CreateAnd(Value *LHS, const APInt &RHS, const Twine &Name = "") {
757aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateAnd(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
758ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  }
759ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  Value *CreateAnd(Value *LHS, uint64_t RHS, const Twine &Name = "") {
760aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateAnd(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
761ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  }
762ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar
7639d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateOr(Value *LHS, Value *RHS, const Twine &Name = "") {
7646bffa63dfea29a525bbd38ff46d03bcc40459dcaChris Lattner    if (Constant *RC = dyn_cast<Constant>(RHS)) {
7656bffa63dfea29a525bbd38ff46d03bcc40459dcaChris Lattner      if (RC->isNullValue())
7666bffa63dfea29a525bbd38ff46d03bcc40459dcaChris Lattner        return LHS;  // LHS | 0 -> LHS
7676bffa63dfea29a525bbd38ff46d03bcc40459dcaChris Lattner      if (Constant *LC = dyn_cast<Constant>(LHS))
76885a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateOr(LC, RC), Name);
7696bffa63dfea29a525bbd38ff46d03bcc40459dcaChris Lattner    }
77025b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(BinaryOperator::CreateOr(LHS, RHS), Name);
771848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
772ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  Value *CreateOr(Value *LHS, const APInt &RHS, const Twine &Name = "") {
773aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateOr(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
774ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  }
775ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  Value *CreateOr(Value *LHS, uint64_t RHS, const Twine &Name = "") {
776aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateOr(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
777ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  }
778ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar
7799d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateXor(Value *LHS, Value *RHS, const Twine &Name = "") {
78089f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *LC = dyn_cast<Constant>(LHS))
78189f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands      if (Constant *RC = dyn_cast<Constant>(RHS))
78285a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateXor(LC, RC), Name);
78325b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(BinaryOperator::CreateXor(LHS, RHS), Name);
784848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
785ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  Value *CreateXor(Value *LHS, const APInt &RHS, const Twine &Name = "") {
786aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateXor(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
787ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  }
788ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  Value *CreateXor(Value *LHS, uint64_t RHS, const Twine &Name = "") {
789aeaf3d484b4d4c35e8794378c4b6cfbbde718dd1Chris Lattner    return CreateXor(LHS, ConstantInt::get(LHS->getType(), RHS), Name);
790ee09d2781de2f5a47bbb991a5a525c67557ac5cdDaniel Dunbar  }
791848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner
792fcf0e86bf2ea9ddf104bea9a0764f78623a11889Chris Lattner  Value *CreateBinOp(Instruction::BinaryOps Opc,
7939d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                     Value *LHS, Value *RHS, const Twine &Name = "") {
794fcf0e86bf2ea9ddf104bea9a0764f78623a11889Chris Lattner    if (Constant *LC = dyn_cast<Constant>(LHS))
795fcf0e86bf2ea9ddf104bea9a0764f78623a11889Chris Lattner      if (Constant *RC = dyn_cast<Constant>(RHS))
79685a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateBinOp(Opc, LC, RC), Name);
79725b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(BinaryOperator::Create(Opc, LHS, RHS), Name);
798848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
7991e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
80081baf14fdfa29c22a08d609144c285169e23a247Chris Lattner  Value *CreateNeg(Value *V, const Twine &Name = "",
80181baf14fdfa29c22a08d609144c285169e23a247Chris Lattner                   bool HasNUW = false, bool HasNSW = false) {
802fcf0e86bf2ea9ddf104bea9a0764f78623a11889Chris Lattner    if (Constant *VC = dyn_cast<Constant>(V))
80381baf14fdfa29c22a08d609144c285169e23a247Chris Lattner      return Insert(Folder.CreateNeg(VC, HasNUW, HasNSW), Name);
80481baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    BinaryOperator *BO = Insert(BinaryOperator::CreateNeg(V), Name);
80581baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    if (HasNUW) BO->setHasNoUnsignedWrap();
80681baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    if (HasNSW) BO->setHasNoSignedWrap();
80781baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return BO;
808848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
809bdc46c6af5ffcf3596a72df75880fe8703436060Dan Gohman  Value *CreateNSWNeg(Value *V, const Twine &Name = "") {
81081baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateNeg(V, Name, false, true);
811bdc46c6af5ffcf3596a72df75880fe8703436060Dan Gohman  }
8128991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  Value *CreateNUWNeg(Value *V, const Twine &Name = "") {
81381baf14fdfa29c22a08d609144c285169e23a247Chris Lattner    return CreateNeg(V, Name, true, false);
8148991d51ddcea31e198aff1fd01c05af2679ee8f8Duncan Sands  }
8158883c43ddc13e5f92ba8dfe00f2116a153a570d5Duncan Sands  Value *CreateFNeg(Value *V, const Twine &Name = "", MDNode *FPMathTag = 0) {
816a7a8af0c586032479527fbde647333c1ce277033Dan Gohman    if (Constant *VC = dyn_cast<Constant>(V))
81785a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner      return Insert(Folder.CreateFNeg(VC), Name);
8189992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman    return Insert(AddFPMathAttributes(BinaryOperator::CreateFNeg(V),
8199992bf75fce8a2917c43fd4af299c72a40809056Michael Ilseman                                      FPMathTag, FMF), Name);
820a7a8af0c586032479527fbde647333c1ce277033Dan Gohman  }
8219d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateNot(Value *V, const Twine &Name = "") {
822fcf0e86bf2ea9ddf104bea9a0764f78623a11889Chris Lattner    if (Constant *VC = dyn_cast<Constant>(V))
82385a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner      return Insert(Folder.CreateNot(VC), Name);
8244ae5126d041768ab9665cf2f11c024becd76c41fDan Gohman    return Insert(BinaryOperator::CreateNot(V), Name);
825848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
8261e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
827848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  //===--------------------------------------------------------------------===//
828848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  // Instruction creation methods: Memory Instructions
829848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  //===--------------------------------------------------------------------===//
8301e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
831db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  AllocaInst *CreateAlloca(Type *Ty, Value *ArraySize = 0,
8329d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                           const Twine &Name = "") {
83350dead06ffc107edb7e84857baaeeb09039c631cOwen Anderson    return Insert(new AllocaInst(Ty, ArraySize), Name);
834848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
835864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  // \brief Provided to resolve 'CreateLoad(Ptr, "...")' correctly, instead of
8369d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  // converting the string to 'bool' for the isVolatile parameter.
8379d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  LoadInst *CreateLoad(Value *Ptr, const char *Name) {
8381378c1dd22842d59ef6dd4c6c1e84cd05f63948cChris Lattner    return Insert(new LoadInst(Ptr), Name);
839848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
8409d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  LoadInst *CreateLoad(Value *Ptr, const Twine &Name = "") {
8419d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar    return Insert(new LoadInst(Ptr), Name);
8429d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  }
8430a9ad97b3558a7d2a8a353fa5ba23d696829c094Chris Lattner  LoadInst *CreateLoad(Value *Ptr, bool isVolatile, const Twine &Name = "") {
8441378c1dd22842d59ef6dd4c6c1e84cd05f63948cChris Lattner    return Insert(new LoadInst(Ptr, 0, isVolatile), Name);
845848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
846848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  StoreInst *CreateStore(Value *Val, Value *Ptr, bool isVolatile = false) {
847848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner    return Insert(new StoreInst(Val, Ptr, isVolatile));
848848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner  }
849864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  // \brief Provided to resolve 'CreateAlignedLoad(Ptr, Align, "...")'
850864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  // correctly, instead of converting the string to 'bool' for the isVolatile
851864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  // parameter.
8524d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth  LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align, const char *Name) {
8534d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    LoadInst *LI = CreateLoad(Ptr, Name);
8544d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    LI->setAlignment(Align);
8554d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    return LI;
8564d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth  }
8574d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth  LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align,
8584d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth                              const Twine &Name = "") {
8594d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    LoadInst *LI = CreateLoad(Ptr, Name);
8604d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    LI->setAlignment(Align);
8614d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    return LI;
8624d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth  }
8634d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth  LoadInst *CreateAlignedLoad(Value *Ptr, unsigned Align, bool isVolatile,
8644d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth                              const Twine &Name = "") {
8654d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    LoadInst *LI = CreateLoad(Ptr, isVolatile, Name);
8664d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    LI->setAlignment(Align);
8674d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    return LI;
8684d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth  }
8694d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth  StoreInst *CreateAlignedStore(Value *Val, Value *Ptr, unsigned Align,
8704d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth                                bool isVolatile = false) {
8714d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    StoreInst *SI = CreateStore(Val, Ptr, isVolatile);
8724d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    SI->setAlignment(Align);
8734d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth    return SI;
8744d7aa6dbcedfbee7482b8473a63af5ac065380e8Chandler Carruth  }
87547f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman  FenceInst *CreateFence(AtomicOrdering Ordering,
87647f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman                         SynchronizationScope SynchScope = CrossThread) {
87747f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman    return Insert(new FenceInst(Context, Ordering, SynchScope));
87847f3513dd574535aeb40c9eb11134f0899e92269Eli Friedman  }
8799b0a479bb763c3d7dcdbdfe0bfff4fd835d33475Eli Friedman  AtomicCmpXchgInst *CreateAtomicCmpXchg(Value *Ptr, Value *Cmp, Value *New,
8809b0a479bb763c3d7dcdbdfe0bfff4fd835d33475Eli Friedman                                         AtomicOrdering Ordering,
8819b0a479bb763c3d7dcdbdfe0bfff4fd835d33475Eli Friedman                               SynchronizationScope SynchScope = CrossThread) {
88255ba816883842e793cdeb32fcb805c4e011b527fEli Friedman    return Insert(new AtomicCmpXchgInst(Ptr, Cmp, New, Ordering, SynchScope));
88355ba816883842e793cdeb32fcb805c4e011b527fEli Friedman  }
8849b0a479bb763c3d7dcdbdfe0bfff4fd835d33475Eli Friedman  AtomicRMWInst *CreateAtomicRMW(AtomicRMWInst::BinOp Op, Value *Ptr, Value *Val,
8859b0a479bb763c3d7dcdbdfe0bfff4fd835d33475Eli Friedman                                 AtomicOrdering Ordering,
8869b0a479bb763c3d7dcdbdfe0bfff4fd835d33475Eli Friedman                               SynchronizationScope SynchScope = CrossThread) {
88755ba816883842e793cdeb32fcb805c4e011b527fEli Friedman    return Insert(new AtomicRMWInst(Op, Ptr, Val, Ordering, SynchScope));
88855ba816883842e793cdeb32fcb805c4e011b527fEli Friedman  }
8890a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad  Value *CreateGEP(Value *Ptr, ArrayRef<Value *> IdxList,
8909d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                   const Twine &Name = "") {
891a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    if (Constant *PC = dyn_cast<Constant>(Ptr)) {
892a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel      // Every index must be constant.
8930a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad      size_t i, e;
8940a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad      for (i = 0, e = IdxList.size(); i != e; ++i)
8950a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad        if (!isa<Constant>(IdxList[i]))
896a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel          break;
8970a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad      if (i == e)
8980a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad        return Insert(Folder.CreateGetElementPtr(PC, IdxList), Name);
8991e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands    }
900a9203109f4ac95aa7e9624f2838e3d89623ec902Jay Foad    return Insert(GetElementPtrInst::Create(Ptr, IdxList), Name);
901a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
9020a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad  Value *CreateInBoundsGEP(Value *Ptr, ArrayRef<Value *> IdxList,
903d33b77bbb04d8f90e58cd83f695745ba21178d41Mikhail Glushenkov                           const Twine &Name = "") {
904e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    if (Constant *PC = dyn_cast<Constant>(Ptr)) {
905e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman      // Every index must be constant.
9060a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad      size_t i, e;
9070a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad      for (i = 0, e = IdxList.size(); i != e; ++i)
9080a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad        if (!isa<Constant>(IdxList[i]))
909e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman          break;
9100a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad      if (i == e)
9110a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad        return Insert(Folder.CreateInBoundsGetElementPtr(PC, IdxList), Name);
912e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    }
913a9203109f4ac95aa7e9624f2838e3d89623ec902Jay Foad    return Insert(GetElementPtrInst::CreateInBounds(Ptr, IdxList), Name);
914e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
9159d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateGEP(Value *Ptr, Value *Idx, const Twine &Name = "") {
916a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    if (Constant *PC = dyn_cast<Constant>(Ptr))
917a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel      if (Constant *IC = dyn_cast<Constant>(Idx))
91812fc16f1950796486988dc91ba69797efa5bdb64Jay Foad        return Insert(Folder.CreateGetElementPtr(PC, IC), Name);
91925b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(GetElementPtrInst::Create(Ptr, Idx), Name);
92089f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  }
9219d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateInBoundsGEP(Value *Ptr, Value *Idx, const Twine &Name = "") {
922e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    if (Constant *PC = dyn_cast<Constant>(Ptr))
923e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman      if (Constant *IC = dyn_cast<Constant>(Idx))
92412fc16f1950796486988dc91ba69797efa5bdb64Jay Foad        return Insert(Folder.CreateInBoundsGetElementPtr(PC, IC), Name);
925e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    return Insert(GetElementPtrInst::CreateInBounds(Ptr, Idx), Name);
926e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
9279d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateConstGEP1_32(Value *Ptr, unsigned Idx0, const Twine &Name = "") {
9281d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson    Value *Idx = ConstantInt::get(Type::getInt32Ty(Context), Idx0);
9291779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar
9301779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar    if (Constant *PC = dyn_cast<Constant>(Ptr))
93112fc16f1950796486988dc91ba69797efa5bdb64Jay Foad      return Insert(Folder.CreateGetElementPtr(PC, Idx), Name);
9321779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar
9330a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad    return Insert(GetElementPtrInst::Create(Ptr, Idx), Name);
9341779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar  }
935e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  Value *CreateConstInBoundsGEP1_32(Value *Ptr, unsigned Idx0,
9369d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                                    const Twine &Name = "") {
9371d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson    Value *Idx = ConstantInt::get(Type::getInt32Ty(Context), Idx0);
938e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
939e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    if (Constant *PC = dyn_cast<Constant>(Ptr))
94012fc16f1950796486988dc91ba69797efa5bdb64Jay Foad      return Insert(Folder.CreateInBoundsGetElementPtr(PC, Idx), Name);
941e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
9420a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad    return Insert(GetElementPtrInst::CreateInBounds(Ptr, Idx), Name);
943e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
9440da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov  Value *CreateConstGEP2_32(Value *Ptr, unsigned Idx0, unsigned Idx1,
9459d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                    const Twine &Name = "") {
946cb8c4778d3b86d47475a3ba3dea86dc0c887e5afNick Lewycky    Value *Idxs[] = {
9471d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      ConstantInt::get(Type::getInt32Ty(Context), Idx0),
9481d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      ConstantInt::get(Type::getInt32Ty(Context), Idx1)
9491779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar    };
9501779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar
9511779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar    if (Constant *PC = dyn_cast<Constant>(Ptr))
95212fc16f1950796486988dc91ba69797efa5bdb64Jay Foad      return Insert(Folder.CreateGetElementPtr(PC, Idxs), Name);
9531779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar
954a9203109f4ac95aa7e9624f2838e3d89623ec902Jay Foad    return Insert(GetElementPtrInst::Create(Ptr, Idxs), Name);
9551779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar  }
956e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  Value *CreateConstInBoundsGEP2_32(Value *Ptr, unsigned Idx0, unsigned Idx1,
9579d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                                    const Twine &Name = "") {
958e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    Value *Idxs[] = {
9591d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      ConstantInt::get(Type::getInt32Ty(Context), Idx0),
9601d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      ConstantInt::get(Type::getInt32Ty(Context), Idx1)
961e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    };
962e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
963e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    if (Constant *PC = dyn_cast<Constant>(Ptr))
96412fc16f1950796486988dc91ba69797efa5bdb64Jay Foad      return Insert(Folder.CreateInBoundsGetElementPtr(PC, Idxs), Name);
965e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
966a9203109f4ac95aa7e9624f2838e3d89623ec902Jay Foad    return Insert(GetElementPtrInst::CreateInBounds(Ptr, Idxs), Name);
967e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
9689d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateConstGEP1_64(Value *Ptr, uint64_t Idx0, const Twine &Name = "") {
9691d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson    Value *Idx = ConstantInt::get(Type::getInt64Ty(Context), Idx0);
9701779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar
9711779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar    if (Constant *PC = dyn_cast<Constant>(Ptr))
97212fc16f1950796486988dc91ba69797efa5bdb64Jay Foad      return Insert(Folder.CreateGetElementPtr(PC, Idx), Name);
9731779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar
9740a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad    return Insert(GetElementPtrInst::Create(Ptr, Idx), Name);
9751779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar  }
976e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  Value *CreateConstInBoundsGEP1_64(Value *Ptr, uint64_t Idx0,
9779d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                                    const Twine &Name = "") {
9781d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson    Value *Idx = ConstantInt::get(Type::getInt64Ty(Context), Idx0);
979e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
980e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    if (Constant *PC = dyn_cast<Constant>(Ptr))
98112fc16f1950796486988dc91ba69797efa5bdb64Jay Foad      return Insert(Folder.CreateInBoundsGetElementPtr(PC, Idx), Name);
982e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
9830a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad    return Insert(GetElementPtrInst::CreateInBounds(Ptr, Idx), Name);
984e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
985e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  Value *CreateConstGEP2_64(Value *Ptr, uint64_t Idx0, uint64_t Idx1,
9869d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                    const Twine &Name = "") {
987cb8c4778d3b86d47475a3ba3dea86dc0c887e5afNick Lewycky    Value *Idxs[] = {
9881d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      ConstantInt::get(Type::getInt64Ty(Context), Idx0),
9891d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      ConstantInt::get(Type::getInt64Ty(Context), Idx1)
99089f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    };
9911e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
99289f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands    if (Constant *PC = dyn_cast<Constant>(Ptr))
99312fc16f1950796486988dc91ba69797efa5bdb64Jay Foad      return Insert(Folder.CreateGetElementPtr(PC, Idxs), Name);
9941e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
995a9203109f4ac95aa7e9624f2838e3d89623ec902Jay Foad    return Insert(GetElementPtrInst::Create(Ptr, Idxs), Name);
9961779f2213f108bc688f9fe32c1fa58b95a0a4aa9Daniel Dunbar  }
997e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  Value *CreateConstInBoundsGEP2_64(Value *Ptr, uint64_t Idx0, uint64_t Idx1,
9989d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                                    const Twine &Name = "") {
999e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    Value *Idxs[] = {
10001d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      ConstantInt::get(Type::getInt64Ty(Context), Idx0),
10011d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson      ConstantInt::get(Type::getInt64Ty(Context), Idx1)
1002e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    };
1003e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
1004e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    if (Constant *PC = dyn_cast<Constant>(Ptr))
100512fc16f1950796486988dc91ba69797efa5bdb64Jay Foad      return Insert(Folder.CreateInBoundsGetElementPtr(PC, Idxs), Name);
1006e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman
1007a9203109f4ac95aa7e9624f2838e3d89623ec902Jay Foad    return Insert(GetElementPtrInst::CreateInBounds(Ptr, Idxs), Name);
1008e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman  }
10099d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateStructGEP(Value *Ptr, unsigned Idx, const Twine &Name = "") {
1010e2574d3215c412a15763d26aee9aa5d856764c2cDan Gohman    return CreateConstInBoundsGEP2_32(Ptr, 0, Idx, Name);
1011a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
10120da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
1013864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Same as CreateGlobalString, but return a pointer with "i8*" type
1014864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// instead of a pointer to array of i8.
1015cb4e4eae1afaa243c0654bc5dd668f9eb5085f06Nick Lewycky  Value *CreateGlobalStringPtr(StringRef Str, const Twine &Name = "") {
10169bd64ea1d935c54d0cd51953b5ce94e22c0aa538Eric Christopher    Value *gv = CreateGlobalString(Str, Name);
10171d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson    Value *zero = ConstantInt::get(Type::getInt32Ty(Context), 0);
10189bd64ea1d935c54d0cd51953b5ce94e22c0aa538Eric Christopher    Value *Args[] = { zero, zero };
10190a2a60ace9b79164b71794ce7ff981171c61e442Jay Foad    return CreateInBoundsGEP(gv, Args, Name);
10209bd64ea1d935c54d0cd51953b5ce94e22c0aa538Eric Christopher  }
10210da14f7a9d31ae1c7bebe8ef1fe0b593ac828c1aMikhail Glushenkov
1022a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  //===--------------------------------------------------------------------===//
1023a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  // Instruction creation methods: Cast/Conversion Operators
1024a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  //===--------------------------------------------------------------------===//
10251e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1026db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateTrunc(Value *V, Type *DestTy, const Twine &Name = "") {
1027a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::Trunc, V, DestTy, Name);
1028a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1029db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateZExt(Value *V, Type *DestTy, const Twine &Name = "") {
1030a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::ZExt, V, DestTy, Name);
1031a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1032db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateSExt(Value *V, Type *DestTy, const Twine &Name = "") {
1033a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::SExt, V, DestTy, Name);
1034a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1035864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create a ZExt or Trunc from the integer value V to DestTy. Return
1036864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// the value untouched if the type of V is already DestTy.
1037ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman  Value *CreateZExtOrTrunc(Value *V, Type *DestTy,
103850b7d70707960155ad28ff23d7622009b7b97eb3Hans Wennborg                           const Twine &Name = "") {
1039ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman    assert(V->getType()->isIntOrIntVectorTy() &&
1040ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman           DestTy->isIntOrIntVectorTy() &&
1041bd12e22d7af1609af2b9614dcab2a035d7388a79Michael Gottesman           "Can only zero extend/truncate integers!");
1042ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman    Type *VTy = V->getType();
1043ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman    if (VTy->getScalarSizeInBits() < DestTy->getScalarSizeInBits())
104450b7d70707960155ad28ff23d7622009b7b97eb3Hans Wennborg      return CreateZExt(V, DestTy, Name);
1045ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman    if (VTy->getScalarSizeInBits() > DestTy->getScalarSizeInBits())
104650b7d70707960155ad28ff23d7622009b7b97eb3Hans Wennborg      return CreateTrunc(V, DestTy, Name);
104750b7d70707960155ad28ff23d7622009b7b97eb3Hans Wennborg    return V;
104850b7d70707960155ad28ff23d7622009b7b97eb3Hans Wennborg  }
1049864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Create a SExt or Trunc from the integer value V to DestTy. Return
1050864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// the value untouched if the type of V is already DestTy.
1051ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman  Value *CreateSExtOrTrunc(Value *V, Type *DestTy,
105250b7d70707960155ad28ff23d7622009b7b97eb3Hans Wennborg                           const Twine &Name = "") {
1053ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman    assert(V->getType()->isIntOrIntVectorTy() &&
1054ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman           DestTy->isIntOrIntVectorTy() &&
1055bd12e22d7af1609af2b9614dcab2a035d7388a79Michael Gottesman           "Can only sign extend/truncate integers!");
1056ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman    Type *VTy = V->getType();
1057ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman    if (VTy->getScalarSizeInBits() < DestTy->getScalarSizeInBits())
105850b7d70707960155ad28ff23d7622009b7b97eb3Hans Wennborg      return CreateSExt(V, DestTy, Name);
1059ec98d2ce5ec51148e442c024b77a7483c81eee6cMichael Gottesman    if (VTy->getScalarSizeInBits() > DestTy->getScalarSizeInBits())
106050b7d70707960155ad28ff23d7622009b7b97eb3Hans Wennborg      return CreateTrunc(V, DestTy, Name);
106150b7d70707960155ad28ff23d7622009b7b97eb3Hans Wennborg    return V;
106250b7d70707960155ad28ff23d7622009b7b97eb3Hans Wennborg  }
1063db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateFPToUI(Value *V, Type *DestTy, const Twine &Name = ""){
1064a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::FPToUI, V, DestTy, Name);
1065a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1066db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateFPToSI(Value *V, Type *DestTy, const Twine &Name = ""){
1067a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::FPToSI, V, DestTy, Name);
1068a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1069db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateUIToFP(Value *V, Type *DestTy, const Twine &Name = ""){
1070a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::UIToFP, V, DestTy, Name);
1071a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1072db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateSIToFP(Value *V, Type *DestTy, const Twine &Name = ""){
1073a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::SIToFP, V, DestTy, Name);
1074a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1075db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateFPTrunc(Value *V, Type *DestTy,
10769d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                       const Twine &Name = "") {
1077a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::FPTrunc, V, DestTy, Name);
1078a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1079db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateFPExt(Value *V, Type *DestTy, const Twine &Name = "") {
1080a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::FPExt, V, DestTy, Name);
1081a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1082db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreatePtrToInt(Value *V, Type *DestTy,
10839d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                        const Twine &Name = "") {
1084a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::PtrToInt, V, DestTy, Name);
1085a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1086db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateIntToPtr(Value *V, Type *DestTy,
10879d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                        const Twine &Name = "") {
1088a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::IntToPtr, V, DestTy, Name);
1089a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1090db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateBitCast(Value *V, Type *DestTy,
10919d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                       const Twine &Name = "") {
1092a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    return CreateCast(Instruction::BitCast, V, DestTy, Name);
1093a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1094db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateZExtOrBitCast(Value *V, Type *DestTy,
10959d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                             const Twine &Name = "") {
109602904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    if (V->getType() == DestTy)
109702904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar      return V;
109802904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    if (Constant *VC = dyn_cast<Constant>(V))
109985a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner      return Insert(Folder.CreateZExtOrBitCast(VC, DestTy), Name);
110002904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return Insert(CastInst::CreateZExtOrBitCast(V, DestTy), Name);
110102904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
1102db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateSExtOrBitCast(Value *V, Type *DestTy,
11039d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                             const Twine &Name = "") {
110402904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    if (V->getType() == DestTy)
110502904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar      return V;
110602904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    if (Constant *VC = dyn_cast<Constant>(V))
110785a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner      return Insert(Folder.CreateSExtOrBitCast(VC, DestTy), Name);
110802904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return Insert(CastInst::CreateSExtOrBitCast(V, DestTy), Name);
110902904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
1110db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateTruncOrBitCast(Value *V, Type *DestTy,
11119d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                              const Twine &Name = "") {
111202904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    if (V->getType() == DestTy)
111302904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar      return V;
111402904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    if (Constant *VC = dyn_cast<Constant>(V))
111585a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner      return Insert(Folder.CreateTruncOrBitCast(VC, DestTy), Name);
111602904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return Insert(CastInst::CreateTruncOrBitCast(V, DestTy), Name);
111702904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
1118db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateCast(Instruction::CastOps Op, Value *V, Type *DestTy,
11199d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                    const Twine &Name = "") {
1120b51a0d87ac4c3f9c651b2ff7cdf663dff18f995bDuncan Sands    if (V->getType() == DestTy)
1121b51a0d87ac4c3f9c651b2ff7cdf663dff18f995bDuncan Sands      return V;
1122a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    if (Constant *VC = dyn_cast<Constant>(V))
112385a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner      return Insert(Folder.CreateCast(Op, VC, DestTy), Name);
112425b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(CastInst::Create(Op, V, DestTy), Name);
1125a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
1126db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreatePointerCast(Value *V, Type *DestTy,
11279d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                           const Twine &Name = "") {
112802904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    if (V->getType() == DestTy)
112902904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar      return V;
113002904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    if (Constant *VC = dyn_cast<Constant>(V))
113185a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner      return Insert(Folder.CreatePointerCast(VC, DestTy), Name);
113202904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return Insert(CastInst::CreatePointerCast(V, DestTy), Name);
113302904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
1134db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateIntCast(Value *V, Type *DestTy, bool isSigned,
11359d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                       const Twine &Name = "") {
1136b51a0d87ac4c3f9c651b2ff7cdf663dff18f995bDuncan Sands    if (V->getType() == DestTy)
1137b51a0d87ac4c3f9c651b2ff7cdf663dff18f995bDuncan Sands      return V;
1138a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    if (Constant *VC = dyn_cast<Constant>(V))
113985a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner      return Insert(Folder.CreateIntCast(VC, DestTy, isSigned), Name);
114025b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(CastInst::CreateIntegerCast(V, DestTy, isSigned), Name);
1141a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
11428dc071a6e522ea5e3eb265e28b410be8f57cffb2Duncan Sandsprivate:
1143864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  // \brief Provided to resolve 'CreateIntCast(Ptr, Ptr, "...")', giving a
1144864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  // compile time error, instead of converting the string to bool for the
1145864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  // isSigned parameter.
11460cb0a3533788c6c622518cb030048012eb69af15Craig Topper  Value *CreateIntCast(Value *, Type *, const char *) LLVM_DELETED_FUNCTION;
11478dc071a6e522ea5e3eb265e28b410be8f57cffb2Duncan Sandspublic:
1148db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  Value *CreateFPCast(Value *V, Type *DestTy, const Twine &Name = "") {
114902904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    if (V->getType() == DestTy)
115002904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar      return V;
115102904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    if (Constant *VC = dyn_cast<Constant>(V))
115285a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner      return Insert(Folder.CreateFPCast(VC, DestTy), Name);
115302904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar    return Insert(CastInst::CreateFPCast(V, DestTy), Name);
115402904d5d848a12be0d5857fc7a25261fb162e0edErick Tryzelaar  }
1155b51a0d87ac4c3f9c651b2ff7cdf663dff18f995bDuncan Sands
1156cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  //===--------------------------------------------------------------------===//
1157cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  // Instruction creation methods: Compare Instructions
1158cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  //===--------------------------------------------------------------------===//
11591e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
11609d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateICmpEQ(Value *LHS, Value *RHS, const Twine &Name = "") {
1161cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateICmp(ICmpInst::ICMP_EQ, LHS, RHS, Name);
1162cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11639d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateICmpNE(Value *LHS, Value *RHS, const Twine &Name = "") {
1164cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateICmp(ICmpInst::ICMP_NE, LHS, RHS, Name);
1165cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11669d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateICmpUGT(Value *LHS, Value *RHS, const Twine &Name = "") {
1167cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateICmp(ICmpInst::ICMP_UGT, LHS, RHS, Name);
1168cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11699d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateICmpUGE(Value *LHS, Value *RHS, const Twine &Name = "") {
1170cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateICmp(ICmpInst::ICMP_UGE, LHS, RHS, Name);
1171cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11729d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateICmpULT(Value *LHS, Value *RHS, const Twine &Name = "") {
1173cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateICmp(ICmpInst::ICMP_ULT, LHS, RHS, Name);
1174cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11759d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateICmpULE(Value *LHS, Value *RHS, const Twine &Name = "") {
1176cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateICmp(ICmpInst::ICMP_ULE, LHS, RHS, Name);
1177cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11789d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateICmpSGT(Value *LHS, Value *RHS, const Twine &Name = "") {
1179cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateICmp(ICmpInst::ICMP_SGT, LHS, RHS, Name);
1180cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11819d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateICmpSGE(Value *LHS, Value *RHS, const Twine &Name = "") {
1182cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateICmp(ICmpInst::ICMP_SGE, LHS, RHS, Name);
1183cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11849d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateICmpSLT(Value *LHS, Value *RHS, const Twine &Name = "") {
1185cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateICmp(ICmpInst::ICMP_SLT, LHS, RHS, Name);
1186cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11879d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateICmpSLE(Value *LHS, Value *RHS, const Twine &Name = "") {
1188cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateICmp(ICmpInst::ICMP_SLE, LHS, RHS, Name);
1189cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11901e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
11919d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpOEQ(Value *LHS, Value *RHS, const Twine &Name = "") {
1192cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_OEQ, LHS, RHS, Name);
1193cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11949d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpOGT(Value *LHS, Value *RHS, const Twine &Name = "") {
1195cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_OGT, LHS, RHS, Name);
1196cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
11979d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpOGE(Value *LHS, Value *RHS, const Twine &Name = "") {
1198cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_OGE, LHS, RHS, Name);
1199cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12009d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpOLT(Value *LHS, Value *RHS, const Twine &Name = "") {
1201cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_OLT, LHS, RHS, Name);
1202cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12039d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpOLE(Value *LHS, Value *RHS, const Twine &Name = "") {
1204cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_OLE, LHS, RHS, Name);
1205cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12069d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpONE(Value *LHS, Value *RHS, const Twine &Name = "") {
1207cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_ONE, LHS, RHS, Name);
1208cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12099d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpORD(Value *LHS, Value *RHS, const Twine &Name = "") {
1210cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_ORD, LHS, RHS, Name);
1211cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12129d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpUNO(Value *LHS, Value *RHS, const Twine &Name = "") {
1213cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_UNO, LHS, RHS, Name);
1214cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12159d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpUEQ(Value *LHS, Value *RHS, const Twine &Name = "") {
1216cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_UEQ, LHS, RHS, Name);
1217cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12189d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpUGT(Value *LHS, Value *RHS, const Twine &Name = "") {
1219cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_UGT, LHS, RHS, Name);
1220cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12219d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpUGE(Value *LHS, Value *RHS, const Twine &Name = "") {
1222cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_UGE, LHS, RHS, Name);
1223cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12249d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpULT(Value *LHS, Value *RHS, const Twine &Name = "") {
1225cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_ULT, LHS, RHS, Name);
1226cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12279d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpULE(Value *LHS, Value *RHS, const Twine &Name = "") {
1228cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_ULE, LHS, RHS, Name);
1229cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12309d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateFCmpUNE(Value *LHS, Value *RHS, const Twine &Name = "") {
1231cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel    return CreateFCmp(FCmpInst::FCMP_UNE, LHS, RHS, Name);
1232cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
123389f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands
12341e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Value *CreateICmp(CmpInst::Predicate P, Value *LHS, Value *RHS,
12359d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                    const Twine &Name = "") {
1236ec1f94423034014d4cc63d30aecdca7e30342fe8Devang Patel    if (Constant *LC = dyn_cast<Constant>(LHS))
1237cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel      if (Constant *RC = dyn_cast<Constant>(RHS))
123885a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateICmp(P, LC, RC), Name);
12391c8a23c440b1665ba422778cdc74a0c59ecaf39eDan Gohman    return Insert(new ICmpInst(P, LHS, RHS), Name);
1240cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
12411e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands  Value *CreateFCmp(CmpInst::Predicate P, Value *LHS, Value *RHS,
12429d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                    const Twine &Name = "") {
1243ec1f94423034014d4cc63d30aecdca7e30342fe8Devang Patel    if (Constant *LC = dyn_cast<Constant>(LHS))
1244cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel      if (Constant *RC = dyn_cast<Constant>(RHS))
124585a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateFCmp(P, LC, RC), Name);
12461c8a23c440b1665ba422778cdc74a0c59ecaf39eDan Gohman    return Insert(new FCmpInst(P, LHS, RHS), Name);
1247cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel  }
1248a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel
1249a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  //===--------------------------------------------------------------------===//
1250a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  // Instruction creation methods: Other Instructions
1251a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  //===--------------------------------------------------------------------===//
125289f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands
1253db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  PHINode *CreatePHI(Type *Ty, unsigned NumReservedValues,
12543ecfc861b4365f341c5c969b40e1afccde676e6fJay Foad                     const Twine &Name = "") {
12553ecfc861b4365f341c5c969b40e1afccde676e6fJay Foad    return Insert(PHINode::Create(Ty, NumReservedValues), Name);
125689f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  }
125789f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands
12589d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  CallInst *CreateCall(Value *Callee, const Twine &Name = "") {
12599547cdfa35a466ef16a72306531465f63b212888Anton Korobeynikov    return Insert(CallInst::Create(Callee), Name);
126089f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  }
12619d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  CallInst *CreateCall(Value *Callee, Value *Arg, const Twine &Name = "") {
12629547cdfa35a466ef16a72306531465f63b212888Anton Korobeynikov    return Insert(CallInst::Create(Callee, Arg), Name);
126389f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  }
12644b9f046869073ab37e376d9314ca1685f103ab19Chris Lattner  CallInst *CreateCall2(Value *Callee, Value *Arg1, Value *Arg2,
12659d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                        const Twine &Name = "") {
12664b9f046869073ab37e376d9314ca1685f103ab19Chris Lattner    Value *Args[] = { Arg1, Arg2 };
1267a3efbb15ddd5aa9006564cd79086723640084878Jay Foad    return Insert(CallInst::Create(Callee, Args), Name);
12684b9f046869073ab37e376d9314ca1685f103ab19Chris Lattner  }
126970100131d1c368d0902ddb7604d750d6131bba8aChris Lattner  CallInst *CreateCall3(Value *Callee, Value *Arg1, Value *Arg2, Value *Arg3,
12709d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                        const Twine &Name = "") {
127170100131d1c368d0902ddb7604d750d6131bba8aChris Lattner    Value *Args[] = { Arg1, Arg2, Arg3 };
1272a3efbb15ddd5aa9006564cd79086723640084878Jay Foad    return Insert(CallInst::Create(Callee, Args), Name);
127370100131d1c368d0902ddb7604d750d6131bba8aChris Lattner  }
127470100131d1c368d0902ddb7604d750d6131bba8aChris Lattner  CallInst *CreateCall4(Value *Callee, Value *Arg1, Value *Arg2, Value *Arg3,
12759d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                        Value *Arg4, const Twine &Name = "") {
127670100131d1c368d0902ddb7604d750d6131bba8aChris Lattner    Value *Args[] = { Arg1, Arg2, Arg3, Arg4 };
1277a3efbb15ddd5aa9006564cd79086723640084878Jay Foad    return Insert(CallInst::Create(Callee, Args), Name);
127870100131d1c368d0902ddb7604d750d6131bba8aChris Lattner  }
127920adc9dc4650313f017b27d9818eb2176238113dMon P Wang  CallInst *CreateCall5(Value *Callee, Value *Arg1, Value *Arg2, Value *Arg3,
128020adc9dc4650313f017b27d9818eb2176238113dMon P Wang                        Value *Arg4, Value *Arg5, const Twine &Name = "") {
128120adc9dc4650313f017b27d9818eb2176238113dMon P Wang    Value *Args[] = { Arg1, Arg2, Arg3, Arg4, Arg5 };
1282a3efbb15ddd5aa9006564cd79086723640084878Jay Foad    return Insert(CallInst::Create(Callee, Args), Name);
128320adc9dc4650313f017b27d9818eb2176238113dMon P Wang  }
12841e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
1285a3efbb15ddd5aa9006564cd79086723640084878Jay Foad  CallInst *CreateCall(Value *Callee, ArrayRef<Value *> Args,
1286c60a47509162412c4a776abae28402541bb73b15Nick Lewycky                       const Twine &Name = "") {
128759c1ba96ba99cf07647073c672fd9f2e5f571bc8Peter Collingbourne    return Insert(CallInst::Create(Callee, Args), Name);
128889f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  }
128989f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands
1290a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  Value *CreateSelect(Value *C, Value *True, Value *False,
12919d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                      const Twine &Name = "") {
1292a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    if (Constant *CC = dyn_cast<Constant>(C))
1293a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel      if (Constant *TC = dyn_cast<Constant>(True))
1294a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel        if (Constant *FC = dyn_cast<Constant>(False))
129585a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner          return Insert(Folder.CreateSelect(CC, TC, FC), Name);
129625b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(SelectInst::Create(C, True, False), Name);
1297a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
129889f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands
1299db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  VAArgInst *CreateVAArg(Value *List, Type *Ty, const Twine &Name = "") {
130025b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(new VAArgInst(List, Ty), Name);
130189f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands  }
130289f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands
1303a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  Value *CreateExtractElement(Value *Vec, Value *Idx,
13049d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                              const Twine &Name = "") {
1305a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    if (Constant *VC = dyn_cast<Constant>(Vec))
1306a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel      if (Constant *IC = dyn_cast<Constant>(Idx))
130785a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner        return Insert(Folder.CreateExtractElement(VC, IC), Name);
1308a3500da5592aee83675d6714d4f1e9d5ad96d1f2Eric Christopher    return Insert(ExtractElementInst::Create(Vec, Idx), Name);
1309a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
131089f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands
1311a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  Value *CreateInsertElement(Value *Vec, Value *NewElt, Value *Idx,
13129d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                             const Twine &Name = "") {
1313a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    if (Constant *VC = dyn_cast<Constant>(Vec))
1314a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel      if (Constant *NC = dyn_cast<Constant>(NewElt))
1315a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel        if (Constant *IC = dyn_cast<Constant>(Idx))
131685a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner          return Insert(Folder.CreateInsertElement(VC, NC, IC), Name);
131725b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(InsertElementInst::Create(Vec, NewElt, Idx), Name);
1318a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
131989f6d88db334ba088672ae0753deb7d7b7509bacDuncan Sands
1320a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  Value *CreateShuffleVector(Value *V1, Value *V2, Value *Mask,
13219d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                             const Twine &Name = "") {
1322a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel    if (Constant *V1C = dyn_cast<Constant>(V1))
1323a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel      if (Constant *V2C = dyn_cast<Constant>(V2))
1324a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel        if (Constant *MC = dyn_cast<Constant>(Mask))
132585a0a06b18be145feb0c10cbdf4d521c1a8835bfChris Lattner          return Insert(Folder.CreateShuffleVector(V1C, V2C, MC), Name);
132625b825b3b848eeb25d49a51f0c78a16db7677465Chris Lattner    return Insert(new ShuffleVectorInst(V1, V2, Mask), Name);
1327a6e757ec9982d68d6e89276a564f38eaa85798daDevang Patel  }
13284e00987f09474f4e1a3bf850ec5d7a9020bf1aefDan Gohman
1329a3da83270505fea08f0a4650aa082fa608db54fdDan Gohman  Value *CreateExtractValue(Value *Agg,
1330fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad                            ArrayRef<unsigned> Idxs,
13319d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                            const Twine &Name = "") {
1332a3da83270505fea08f0a4650aa082fa608db54fdDan Gohman    if (Constant *AggC = dyn_cast<Constant>(Agg))
1333fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad      return Insert(Folder.CreateExtractValue(AggC, Idxs), Name);
1334fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad    return Insert(ExtractValueInst::Create(Agg, Idxs), Name);
13354e00987f09474f4e1a3bf850ec5d7a9020bf1aefDan Gohman  }
13364e00987f09474f4e1a3bf850ec5d7a9020bf1aefDan Gohman
1337a3da83270505fea08f0a4650aa082fa608db54fdDan Gohman  Value *CreateInsertValue(Value *Agg, Value *Val,
1338fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad                           ArrayRef<unsigned> Idxs,
13399d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar                           const Twine &Name = "") {
1340a3da83270505fea08f0a4650aa082fa608db54fdDan Gohman    if (Constant *AggC = dyn_cast<Constant>(Agg))
1341a3da83270505fea08f0a4650aa082fa608db54fdDan Gohman      if (Constant *ValC = dyn_cast<Constant>(Val))
1342fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad        return Insert(Folder.CreateInsertValue(AggC, ValC, Idxs), Name);
1343fc6d3a49867cd38954dc40936a88f1907252c6d2Jay Foad    return Insert(InsertValueInst::Create(Agg, Val, Idxs), Name);
13444e00987f09474f4e1a3bf850ec5d7a9020bf1aefDan Gohman  }
13457a3ec1e148c4985775588949d03d9d4d108dec6dDaniel Dunbar
1346e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling  LandingPadInst *CreateLandingPad(Type *Ty, Value *PersFn, unsigned NumClauses,
1347e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling                                   const Twine &Name = "") {
134812ea410114702006849feca17d834e41d535a6c6Duncan Sands    return Insert(LandingPadInst::Create(Ty, PersFn, NumClauses), Name);
1349e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling  }
1350e6e8826870bee3facb04f950f0bd725f8a88623dBill Wendling
13517a3ec1e148c4985775588949d03d9d4d108dec6dDaniel Dunbar  //===--------------------------------------------------------------------===//
13527a3ec1e148c4985775588949d03d9d4d108dec6dDaniel Dunbar  // Utility creation methods
13537a3ec1e148c4985775588949d03d9d4d108dec6dDaniel Dunbar  //===--------------------------------------------------------------------===//
13547a3ec1e148c4985775588949d03d9d4d108dec6dDaniel Dunbar
1355864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Return an i1 value testing if \p Arg is null.
13569d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateIsNull(Value *Arg, const Twine &Name = "") {
1357a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson    return CreateICmpEQ(Arg, Constant::getNullValue(Arg->getType()),
13587a3ec1e148c4985775588949d03d9d4d108dec6dDaniel Dunbar                        Name);
13597a3ec1e148c4985775588949d03d9d4d108dec6dDaniel Dunbar  }
13607a3ec1e148c4985775588949d03d9d4d108dec6dDaniel Dunbar
1361864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Return an i1 value testing if \p Arg is not null.
13629d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreateIsNotNull(Value *Arg, const Twine &Name = "") {
1363a7235ea7245028a0723e8ab7fd011386b3900777Owen Anderson    return CreateICmpNE(Arg, Constant::getNullValue(Arg->getType()),
13647a3ec1e148c4985775588949d03d9d4d108dec6dDaniel Dunbar                        Name);
13657a3ec1e148c4985775588949d03d9d4d108dec6dDaniel Dunbar  }
1366fe2cce63aa26d0916fa7be32c6bf7fa8fb059ee7Misha Brukman
1367864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Return the i64 difference between two pointer values, dividing out
1368864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// the size of the pointed-to objects.
1369864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  ///
1370864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// This is intended to implement C-style pointer subtraction. As such, the
1371864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// pointers must be appropriately aligned for their element types and
1372864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// pointing into the same object.
13739d8f0042665cc9a3038deece29492b6a7813fe24Daniel Dunbar  Value *CreatePtrDiff(Value *LHS, Value *RHS, const Twine &Name = "") {
1374b9fc36085706c131296e5a7eb91a68f7c8572c31Nick Lewycky    assert(LHS->getType() == RHS->getType() &&
1375b9fc36085706c131296e5a7eb91a68f7c8572c31Nick Lewycky           "Pointer subtraction operand types must match!");
1376a17ce80a1e475ab3526a4787b878d55a42727d19Chris Lattner    PointerType *ArgType = cast<PointerType>(LHS->getType());
13771d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson    Value *LHS_int = CreatePtrToInt(LHS, Type::getInt64Ty(Context));
13781d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson    Value *RHS_int = CreatePtrToInt(RHS, Type::getInt64Ty(Context));
1379b9fc36085706c131296e5a7eb91a68f7c8572c31Nick Lewycky    Value *Difference = CreateSub(LHS_int, RHS_int);
138059c4f5c2fc82af14b0f4f332709aac62921c6177Dan Gohman    return CreateExactSDiv(Difference,
138159c4f5c2fc82af14b0f4f332709aac62921c6177Dan Gohman                           ConstantExpr::getSizeOf(ArgType->getElementType()),
138259c4f5c2fc82af14b0f4f332709aac62921c6177Dan Gohman                           Name);
1383b9fc36085706c131296e5a7eb91a68f7c8572c31Nick Lewycky  }
13846c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer
1385864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// \brief Return a vector value that contains \arg V broadcasted to \p
1386864c2a261a551545b1929dbb4d498fd655f4239dMichael Gottesman  /// NumElts elements.
13876c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer  Value *CreateVectorSplat(unsigned NumElts, Value *V, const Twine &Name = "") {
13886c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer    assert(NumElts > 0 && "Cannot splat to an empty vector!");
13896c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer
13906c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer    // First insert it into an undef vector so we can shuffle it.
13916c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer    Type *I32Ty = getInt32Ty();
13926c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer    Value *Undef = UndefValue::get(VectorType::get(V->getType(), NumElts));
13936c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer    V = CreateInsertElement(Undef, V, ConstantInt::get(I32Ty, 0),
13946c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer                            Name + ".splatinsert");
13956c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer
13966c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer    // Shuffle the value across the desired number of elements.
13976c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer    Value *Zeros = ConstantAggregateZero::get(VectorType::get(I32Ty, NumElts));
13986c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer    return CreateShuffleVector(V, Undef, Zeros, Name + ".splat");
13996c3074958370bf25dc6e4e4b757f0c083e245dbeBenjamin Kramer  }
1400cd80c169d744148f1ad709d21ef1694173f397e1Devang Patel};
14011e7f7865ebd3b47c93dc8867abe5baae0df0ebceDuncan Sands
140240be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo// Create wrappers for C Binding types (see CBindingWrapping.h).
140340be1e85665d10f5444186f0e7106e368dd735b8Filip PizloDEFINE_SIMPLE_CONVERSION_FUNCTIONS(IRBuilder<>, LLVMBuilderRef)
140440be1e85665d10f5444186f0e7106e368dd735b8Filip Pizlo
1405848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner}
1406848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner
1407848377d53360fa1c87592bdeb61eaffcc09de8c5Chris Lattner#endif
1408