remove some exclusions that don't exist anymore.
[oota-llvm.git] / include / llvm / Instruction.h
index 29ae5c3cfbf5aa853482a1388e35ff5707b3ff0b..9a7f769a94f9c5bb8fd3f13aadac6bc73435ffb7 100644 (file)
 #define LLVM_INSTRUCTION_H
 
 #include "llvm/User.h"
+#include "llvm/ADT/ilist_node.h"
 
 namespace llvm {
 
-struct AssemblyAnnotationWriter;
-class BinaryOperator;
-
 template<typename ValueSubClass, typename ItemParentClass>
   class SymbolTableListTraits;
 
-class Instruction : public User {
+class Instruction : public User, public ilist_node<Instruction> {
   void operator=(const Instruction &);     // Do not implement
   Instruction(const Instruction &);        // Do not implement
 
   BasicBlock *Parent;
-  Instruction *Prev, *Next; // Next and Prev links for our intrusive linked list
-
-  void setNext(Instruction *N) { Next = N; }
-  void setPrev(Instruction *N) { Prev = N; }
 
   friend class SymbolTableListTraits<Instruction, BasicBlock>;
   void setParent(BasicBlock *P);
@@ -64,7 +58,7 @@ public:
   /// isIdenticalTo - Return true if the specified instruction is exactly
   /// identical to the current one.  This means that all operands match and any
   /// extra information (e.g. load is volatile) agree.
-  bool isIdenticalTo(Instruction *I) const;
+  bool isIdenticalTo(const Instruction *I) const;
 
   /// This function determines if the specified instruction executes the same
   /// operation as the current one. This means that the opcodes, type, operand
@@ -74,7 +68,7 @@ public:
   /// @returns true if the specified instruction is the same operation as
   /// the current one.
   /// @brief Determine if one instruction is the same operation as another.
-  bool isSameOperationAs(Instruction *I) const;
+  bool isSameOperationAs(const Instruction *I) const;
 
   /// isUsedOutsideOfBlock - Return true if there are any uses of this
   /// instruction in blocks other than the specified block.  Note that PHI nodes
@@ -103,6 +97,10 @@ public:
   ///
   void eraseFromParent();
 
+  /// insertBefore - Insert an unlinked instructions into a basic block
+  /// immediately before the specified instruction.
+  void insertBefore(Instruction *InsertPos);
+
   /// moveBefore - Unlink this instruction from its current basic block and
   /// insert it into the basic block that MovePos lives in, right before
   /// MovePos.
@@ -173,17 +171,13 @@ public:
   bool isCommutative() const { return isCommutative(getOpcode()); }
   static bool isCommutative(unsigned op);
 
-  /// isTrappingInstruction - Return true if the instruction may trap.
+  /// isTrapping - Return true if the instruction may trap.
   ///
   bool isTrapping() const {
     return isTrapping(getOpcode());
   }
   static bool isTrapping(unsigned op);
 
-  virtual void print(std::ostream &OS) const { print(OS, 0); }
-  void print(std::ostream *OS) const { if (OS) print(*OS); }
-  void print(std::ostream &OS, AssemblyAnnotationWriter *AAW) const;
-
   /// Methods for support type inquiry through isa, cast, and dyn_cast:
   static inline bool classof(const Instruction *) { return true; }
   static inline bool classof(const Value *V) {
@@ -227,14 +221,6 @@ public:
 #define   LAST_OTHER_INST(N)             OtherOpsEnd = N+1
 #include "llvm/Instruction.def"
   };
-  
-private:
-  // getNext/Prev - Return the next or previous instruction in the list.  The
-  // last node in the list is a terminator instruction.
-  Instruction *getNext()             { return Next; }
-  const Instruction *getNext() const { return Next; }
-  Instruction *getPrev()             { return Prev; }
-  const Instruction *getPrev() const { return Prev; }
 };
 
 } // End llvm namespace