Eliminate the Instruction::iType field, folding it into the Value::VTy field.
authorChris Lattner <sabre@nondot.org>
Sun, 27 Jun 2004 18:38:24 +0000 (18:38 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 27 Jun 2004 18:38:24 +0000 (18:38 +0000)
This reduces the size of the instruction class by 4 bytes, and means that
isa<CallInst>(V) (for example) only needs to do one load from memory instead
of two.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14434 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Instruction.h
include/llvm/Value.h

index d2f61965dddc07121a575d93d61bfcccf4c8e4e5..31407ff8498842b730db2c659e6ccd42221ac78d 100644 (file)
@@ -21,6 +21,7 @@
 namespace llvm {
 
 struct AssemblyAnnotationWriter;
+class BinaryOperator;
 
 template<typename SC> struct ilist_traits;
 template<typename ValueSubClass, typename ItemParentClass, typename SymTabClass,
@@ -38,9 +39,12 @@ class Instruction : public User, public Annotable {
   void setParent(BasicBlock *P);
   void init();
 
+private:
+  // FIXME: This is a dirty hack.  Setcc instructions shouldn't encode the CC
+  // into the opcode field.  When they don't, this will be unneeded.
+  void setOpcode(unsigned NewOpcode);
+  friend class BinaryOperator;
 protected:
-  unsigned iType;      // InstructionType: The opcode of the instruction
-
   Instruction(const Type *Ty, unsigned iType, const std::string &Name = "",
               Instruction *InsertBefore = 0);
   Instruction(const Type *Ty, unsigned iType, const std::string &Name,
@@ -81,7 +85,7 @@ public:
   /// Subclass classification... getOpcode() returns a member of 
   /// one of the enums that is coming soon (down below)...
   ///
-  unsigned getOpcode() const { return iType; }
+  unsigned getOpcode() const { return getValueType() - InstructionVal; }
   virtual const char *getOpcodeName() const {
     return getOpcodeName(getOpcode());
   }
@@ -92,11 +96,11 @@ public:
   }
 
   inline bool isTerminator() const {   // Instance of TerminatorInst?
-    return isTerminator(iType);
+    return isTerminator(getOpcode());
   }
 
   inline bool isBinaryOp() const {
-    return iType >= BinaryOpsBegin && iType < BinaryOpsEnd;
+    return getOpcode() >= BinaryOpsBegin && getOpcode() < BinaryOpsEnd;
   }
 
   /// isAssociative - Return true if the instruction is associative:
index c47c96962f4d2f8e7155323ce94dd77279bf9f4f..7d870d67097de735e9ebbc751d421b7fc88c3917 100644 (file)
@@ -133,6 +133,11 @@ public:
   unsigned getValueType() const {
     return SubclassID;
   }
+
+private:
+  /// FIXME: this is a gross hack, needed by another gross hack.  Eliminate!
+  void setValueType(unsigned VT) { SubclassID = VT; }
+  friend class Instruction;
 };
 
 inline std::ostream &operator<<(std::ostream &OS, const Value *V) {
@@ -190,7 +195,7 @@ template <> inline bool isa_impl<Argument, Value>(const Value &Val) {
   return Val.getValueType() == Value::ArgumentVal;
 }
 template <> inline bool isa_impl<Instruction, Value>(const Value &Val) { 
-  return Val.getValueType() == Value::InstructionVal;
+  return Val.getValueType() >= Value::InstructionVal;
 }
 template <> inline bool isa_impl<BasicBlock, Value>(const Value &Val) { 
   return Val.getValueType() == Value::BasicBlockVal;