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