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