141ff717e85267367bb82e5c0bb863adcba07d0f2Jim Laskey//===-- llvm/IntrinsicInst.h - Intrinsic Instruction Wrappers ---*- C++ -*-===// 29769ab22265b313171d201b5928688524a01bd87Misha Brukman// 3e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// The LLVM Compiler Infrastructure 4e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 79769ab22265b313171d201b5928688524a01bd87Misha Brukman// 8e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner//===----------------------------------------------------------------------===// 9e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// 10e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// This file defines classes that make it really easy to deal with intrinsic 11e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// functions with the isa/dyncast family of functions. In particular, this 12e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// allows you to do things like: 13e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// 14e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// if (MemCpyInst *MCI = dyn_cast<MemCpyInst>(Inst)) 15e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// ... MCI->getDest() ... MCI->getSource() ... 16e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// 17e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// All intrinsic function calls are instances of the call instruction, so these 18e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// are all subclasses of the CallInst class. Note that none of these classes 19e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// has state or virtual methods, which is an important part of this gross/neat 20e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// hack working. 21e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner// 22e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner//===----------------------------------------------------------------------===// 23e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner 24e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner#ifndef LLVM_INTRINSICINST_H 25e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner#define LLVM_INTRINSICINST_H 26e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner 27e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner#include "llvm/Constants.h" 28e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner#include "llvm/Function.h" 29e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner#include "llvm/Instructions.h" 30e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner#include "llvm/Intrinsics.h" 31e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner 32e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattnernamespace llvm { 33874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner /// IntrinsicInst - A useful wrapper class for inspecting calls to intrinsic 34874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner /// functions. This allows the standard isa/dyncast/cast functionality to 35874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner /// work with calls to intrinsic functions. 36e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner class IntrinsicInst : public CallInst { 37e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner IntrinsicInst(); // DO NOT IMPLEMENT 38e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner IntrinsicInst(const IntrinsicInst&); // DO NOT IMPLEMENT 39e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner void operator=(const IntrinsicInst&); // DO NOT IMPLEMENT 40e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner public: 41874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner /// getIntrinsicID - Return the intrinsic ID of this intrinsic. 42874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner /// 43874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner Intrinsic::ID getIntrinsicID() const { 44874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner return (Intrinsic::ID)getCalledFunction()->getIntrinsicID(); 45874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner } 46009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 47874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner // Methods for support type inquiry through isa, cast, and dyn_cast: 48874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner static inline bool classof(const IntrinsicInst *) { return true; } 49874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner static inline bool classof(const CallInst *I) { 50874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner if (const Function *CF = I->getCalledFunction()) 51874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner return CF->getIntrinsicID() != 0; 52874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner return false; 53874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner } 54874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner static inline bool classof(const Value *V) { 55874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner return isa<CallInst>(V) && classof(cast<CallInst>(V)); 56874357fa759c8d3b61fad1bcc73aab3e473ecd1aChris Lattner } 57e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner }; 58d6f02d1fffb1f05b98905d0e4a61d8364320617cChris Lattner 593e775143fb562cddc27734ba46a3ccf3aa0f3e01Chris Lattner /// DbgInfoIntrinsic - This is the common base class for debug info intrinsics 601085548d35ccaf5e90e001b5c2af8cc311872f15Chris Lattner /// 6143fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner class DbgInfoIntrinsic : public IntrinsicInst { 6243fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner public: 631085548d35ccaf5e90e001b5c2af8cc311872f15Chris Lattner 643e775143fb562cddc27734ba46a3ccf3aa0f3e01Chris Lattner // Methods for support type inquiry through isa, cast, and dyn_cast: 653e775143fb562cddc27734ba46a3ccf3aa0f3e01Chris Lattner static inline bool classof(const DbgInfoIntrinsic *) { return true; } 66b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner static inline bool classof(const IntrinsicInst *I) { 67b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner switch (I->getIntrinsicID()) { 684556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey case Intrinsic::dbg_declare: 692f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez case Intrinsic::dbg_value: 70b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner return true; 71b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner default: return false; 72b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner } 733e775143fb562cddc27734ba46a3ccf3aa0f3e01Chris Lattner } 743e775143fb562cddc27734ba46a3ccf3aa0f3e01Chris Lattner static inline bool classof(const Value *V) { 75b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 763e775143fb562cddc27734ba46a3ccf3aa0f3e01Chris Lattner } 77009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 784556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey static Value *StripCast(Value *C); 793e775143fb562cddc27734ba46a3ccf3aa0f3e01Chris Lattner }; 803e775143fb562cddc27734ba46a3ccf3aa0f3e01Chris Lattner 814556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey /// DbgDeclareInst - This represents the llvm.dbg.declare instruction. 824556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey /// 8343fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner class DbgDeclareInst : public DbgInfoIntrinsic { 8443fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner public: 853a32865d58f015e7058444eab7085195c34da95aVictor Hernandez Value *getAddress() const; 86009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif MDNode *getVariable() const { return cast<MDNode>(getArgOperand(1)); } 874556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey 884556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey // Methods for support type inquiry through isa, cast, and dyn_cast: 894556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey static inline bool classof(const DbgDeclareInst *) { return true; } 904556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey static inline bool classof(const IntrinsicInst *I) { 914556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey return I->getIntrinsicID() == Intrinsic::dbg_declare; 924556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey } 934556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey static inline bool classof(const Value *V) { 944556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 954556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey } 964556ce5d115f93ad6809d77810b9b770e5f737f2Jim Laskey }; 971085548d35ccaf5e90e001b5c2af8cc311872f15Chris Lattner 982f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez /// DbgValueInst - This represents the llvm.dbg.value instruction. 992f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez /// 10043fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner class DbgValueInst : public DbgInfoIntrinsic { 10143fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner public: 1025b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor Hernandez const Value *getValue() const; 1035b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor Hernandez Value *getValue(); 1045b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor Hernandez uint64_t getOffset() const { 1055b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor Hernandez return cast<ConstantInt>( 1061ac022974a75aaccc11d9f7f024044cba7ee99f8Gabor Greif const_cast<Value*>(getArgOperand(1)))->getZExtValue(); 1075b7e48b56cfc0904636a0a1c0d4f7b81133c48c2Victor Hernandez } 108009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif MDNode *getVariable() const { return cast<MDNode>(getArgOperand(2)); } 1092f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez 1102f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez // Methods for support type inquiry through isa, cast, and dyn_cast: 1112f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez static inline bool classof(const DbgValueInst *) { return true; } 1122f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez static inline bool classof(const IntrinsicInst *I) { 1132f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez return I->getIntrinsicID() == Intrinsic::dbg_value; 1142f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez } 1152f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez static inline bool classof(const Value *V) { 1162f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 1172f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez } 1182f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez }; 1192f9dac721d6b015fd16730bd51bffc86e29e6fdfVictor Hernandez 120e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// MemIntrinsic - This is the common base class for memset/memcpy/memmove. 121e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// 12243fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner class MemIntrinsic : public IntrinsicInst { 12343fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner public: 124009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif Value *getRawDest() const { return const_cast<Value*>(getArgOperand(0)); } 125e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner 126009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif Value *getLength() const { return const_cast<Value*>(getArgOperand(2)); } 127dfe964ce8c367248e587f2d9ecc7fac5ee2c6fdcChris Lattner ConstantInt *getAlignmentCst() const { 128009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif return cast<ConstantInt>(const_cast<Value*>(getArgOperand(3))); 129e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 130009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 131dfe964ce8c367248e587f2d9ecc7fac5ee2c6fdcChris Lattner unsigned getAlignment() const { 132dfe964ce8c367248e587f2d9ecc7fac5ee2c6fdcChris Lattner return getAlignmentCst()->getZExtValue(); 133dfe964ce8c367248e587f2d9ecc7fac5ee2c6fdcChris Lattner } 134e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner 13520adc9dc4650313f017b27d9818eb2176238113dMon P Wang ConstantInt *getVolatileCst() const { 136009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif return cast<ConstantInt>(const_cast<Value*>(getArgOperand(4))); 13720adc9dc4650313f017b27d9818eb2176238113dMon P Wang } 13820adc9dc4650313f017b27d9818eb2176238113dMon P Wang bool isVolatile() const { 139e368b460a206fafa0d31d5d059b1779b94f7df8cDan Gohman return !getVolatileCst()->isZero(); 14020adc9dc4650313f017b27d9818eb2176238113dMon P Wang } 14120adc9dc4650313f017b27d9818eb2176238113dMon P Wang 14269388e5a4a941e7e02c7f4b52d6e743a480e135fEli Friedman unsigned getDestAddressSpace() const { 143786c7cd14174265cfb0847f6e7faf53b6b96f9f6Nick Lewycky return cast<PointerType>(getRawDest()->getType())->getAddressSpace(); 144786c7cd14174265cfb0847f6e7faf53b6b96f9f6Nick Lewycky } 145786c7cd14174265cfb0847f6e7faf53b6b96f9f6Nick Lewycky 146e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// getDest - This is just like getRawDest, but it strips off any cast 147e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// instructions that feed it, giving the original input. The returned 148e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// value is guaranteed to be a pointer. 1490b12ecf6ff6b5d3a144178257b6206f0c4788792Anton Korobeynikov Value *getDest() const { return getRawDest()->stripPointerCasts(); } 150e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner 151e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// set* - Set the specified arguments of the instruction. 152e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// 153e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner void setDest(Value *Ptr) { 154e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner assert(getRawDest()->getType() == Ptr->getType() && 155e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner "setDest called with pointer of wrong type!"); 156009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif setArgOperand(0, Ptr); 157e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 158e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner 159e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner void setLength(Value *L) { 160e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner assert(getLength()->getType() == L->getType() && 161e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner "setLength called with value of wrong type!"); 162009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif setArgOperand(2, L); 163e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 164009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 165a547b4708b8e1dce218c5a1aab6f3ad33f6fab16Owen Anderson void setAlignment(Constant* A) { 166009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif setArgOperand(3, A); 167a547b4708b8e1dce218c5a1aab6f3ad33f6fab16Owen Anderson } 16820adc9dc4650313f017b27d9818eb2176238113dMon P Wang 16920adc9dc4650313f017b27d9818eb2176238113dMon P Wang void setVolatile(Constant* V) { 170009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif setArgOperand(4, V); 17120adc9dc4650313f017b27d9818eb2176238113dMon P Wang } 17220adc9dc4650313f017b27d9818eb2176238113dMon P Wang 173db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *getAlignmentType() const { 174009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif return getArgOperand(3)->getType(); 175e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 176009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 177e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner // Methods for support type inquiry through isa, cast, and dyn_cast: 178e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner static inline bool classof(const MemIntrinsic *) { return true; } 179b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner static inline bool classof(const IntrinsicInst *I) { 180b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner switch (I->getIntrinsicID()) { 181824b958e6fb1236e92e4d07f3acf18fca107cdc0Chris Lattner case Intrinsic::memcpy: 182824b958e6fb1236e92e4d07f3acf18fca107cdc0Chris Lattner case Intrinsic::memmove: 183824b958e6fb1236e92e4d07f3acf18fca107cdc0Chris Lattner case Intrinsic::memset: 184b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner return true; 185b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner default: return false; 186b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner } 187e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 188e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner static inline bool classof(const Value *V) { 189b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 190e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 191e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner }; 192e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner 1933ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner /// MemSetInst - This class wraps the llvm.memset intrinsic. 194e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// 19543fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner class MemSetInst : public MemIntrinsic { 19643fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner public: 197e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// get* - Return the arguments to the instruction. 198e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// 199009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif Value *getValue() const { return const_cast<Value*>(getArgOperand(1)); } 200009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 2013ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner void setValue(Value *Val) { 2023ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner assert(getValue()->getType() == Val->getType() && 203009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif "setValue called with value of wrong type!"); 204009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif setArgOperand(1, Val); 205e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 206009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 207e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner // Methods for support type inquiry through isa, cast, and dyn_cast: 2083ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner static inline bool classof(const MemSetInst *) { return true; } 209b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner static inline bool classof(const IntrinsicInst *I) { 2103ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner return I->getIntrinsicID() == Intrinsic::memset; 211e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 212e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner static inline bool classof(const Value *V) { 213b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 214e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 215e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner }; 216009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 2173ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner /// MemTransferInst - This class wraps the llvm.memcpy/memmove intrinsics. 218e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// 21943fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner class MemTransferInst : public MemIntrinsic { 22043fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner public: 221e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// get* - Return the arguments to the instruction. 222e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// 223009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif Value *getRawSource() const { return const_cast<Value*>(getArgOperand(1)); } 224009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 225e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// getSource - This is just like getRawSource, but it strips off any cast 226e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// instructions that feed it, giving the original input. The returned 227e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// value is guaranteed to be a pointer. 2280b12ecf6ff6b5d3a144178257b6206f0c4788792Anton Korobeynikov Value *getSource() const { return getRawSource()->stripPointerCasts(); } 229009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 23069388e5a4a941e7e02c7f4b52d6e743a480e135fEli Friedman unsigned getSourceAddressSpace() const { 23169388e5a4a941e7e02c7f4b52d6e743a480e135fEli Friedman return cast<PointerType>(getRawSource()->getType())->getAddressSpace(); 23269388e5a4a941e7e02c7f4b52d6e743a480e135fEli Friedman } 23369388e5a4a941e7e02c7f4b52d6e743a480e135fEli Friedman 234e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner void setSource(Value *Ptr) { 235e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner assert(getRawSource()->getType() == Ptr->getType() && 236e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner "setSource called with pointer of wrong type!"); 237009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif setArgOperand(1, Ptr); 238e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 239009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 240e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner // Methods for support type inquiry through isa, cast, and dyn_cast: 2413ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner static inline bool classof(const MemTransferInst *) { return true; } 242b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner static inline bool classof(const IntrinsicInst *I) { 2433ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner return I->getIntrinsicID() == Intrinsic::memcpy || 2443ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner I->getIntrinsicID() == Intrinsic::memmove; 245e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 246e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner static inline bool classof(const Value *V) { 247b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 248e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 249e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner }; 250009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 251009105c3938466e93b4cbb38b44d83acfc98d817Gabor Greif 2523ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner /// MemCpyInst - This class wraps the llvm.memcpy intrinsic. 253e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner /// 25443fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner class MemCpyInst : public MemTransferInst { 25543fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner public: 2563ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner // Methods for support type inquiry through isa, cast, and dyn_cast: 2573ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner static inline bool classof(const MemCpyInst *) { return true; } 2583ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner static inline bool classof(const IntrinsicInst *I) { 2593ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner return I->getIntrinsicID() == Intrinsic::memcpy; 2603ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner } 2613ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner static inline bool classof(const Value *V) { 2623ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 263e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 2643ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner }; 265e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner 2663ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner /// MemMoveInst - This class wraps the llvm.memmove intrinsic. 2673ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner /// 26843fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner class MemMoveInst : public MemTransferInst { 26943fd9017a69a6314fb780f87083b1e57a0981287Chris Lattner public: 270e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner // Methods for support type inquiry through isa, cast, and dyn_cast: 2713ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner static inline bool classof(const MemMoveInst *) { return true; } 272b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner static inline bool classof(const IntrinsicInst *I) { 2733ce5e887aef457701da95f1c6ccbd58ec3d32fe4Chris Lattner return I->getIntrinsicID() == Intrinsic::memmove; 274e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 275e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner static inline bool classof(const Value *V) { 276b419b0e68220296dbae8016d35718f55c39244c1Chris Lattner return isa<IntrinsicInst>(V) && classof(cast<IntrinsicInst>(V)); 277e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner } 278e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner }; 2796df60a9effe4d20a48cfd9d105c0ab3c5dc3e690Reid Spencer 280e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner} 281e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner 282e80c8191c2f07c62fe5bf889e2781821852aa5a9Chris Lattner#endif 283