Derive GetResultInst from UnaryInstruction, this simplifies code and removes a FIXME.
authorGabor Greif <ggreif@gmail.com>
Tue, 13 May 2008 07:09:08 +0000 (07:09 +0000)
committerGabor Greif <ggreif@gmail.com>
Tue, 13 May 2008 07:09:08 +0000 (07:09 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51023 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/InstrTypes.h
include/llvm/Instructions.h
lib/VMCore/Instructions.cpp

index 25fa5f012ddc3c3371d013e4f05fc339a5847f58..a320ad00e419aed4c1849e02b830f548174a8f59 100644 (file)
@@ -85,8 +85,9 @@ public:
 //===----------------------------------------------------------------------===//
 
 class UnaryInstruction : public Instruction {
-  void *operator new(size_t, unsigned); // Do not implement
-  
+  void *operator new(size_t, unsigned);      // Do not implement
+  UnaryInstruction(const UnaryInstruction&); // Do not implement
+
 protected:
   UnaryInstruction(const Type *Ty, unsigned iType, Value *V, Instruction *IB = 0)
     : Instruction(Ty, iType, &Op<0>(), 1, IB) {
@@ -116,6 +117,7 @@ public:
            I->getOpcode() == Instruction::Free ||
            I->getOpcode() == Instruction::Load ||
            I->getOpcode() == Instruction::VAArg ||
+           I->getOpcode() == Instruction::GetResult ||
            (I->getOpcode() >= CastOpsBegin && I->getOpcode() < CastOpsEnd);
   }
   static inline bool classof(const Value *V) {
index e7b42f34b440a4166bc445994d547b2005ceddc5..3b3aecf816614ab9e80162477401156ac66a2443 100644 (file)
@@ -2761,20 +2761,14 @@ public:
 /// GetResultInst - This instruction extracts individual result value from
 /// aggregate value, where aggregate value is returned by CallInst.
 ///
-class GetResultInst : public /*FIXME: Unary*/Instruction {
-  void *operator new(size_t, unsigned);  // DO NOT IMPLEMENT
+class GetResultInst : public UnaryInstruction {
   unsigned Idx;
   GetResultInst(const GetResultInst &GRI) :
-    Instruction(GRI.getType(), Instruction::GetResult, &Op<0>(), 1) {
-    Op<0>().init(GRI.Op<0>(), this);
-    Idx = GRI.Idx;
+    UnaryInstruction(GRI.getType(), Instruction::GetResult, GRI.getOperand(0)),
+    Idx(GRI.Idx) {
   }
 
 public:
-  // allocate space for exactly one operand
-  void *operator new(size_t s) {
-    return User::operator new(s, 1);
-  }
   GetResultInst(Value *Aggr, unsigned index,
                 const std::string &Name = "",
                 Instruction *InsertBefore = 0);
@@ -2797,9 +2791,6 @@ public:
     return Idx;
   }
 
-  /// Provide fast operand accessors
-  DECLARE_TRANSPARENT_OPERAND_ACCESSORS(Value);
-
   // Methods for support type inquiry through isa, cast, and dyn_cast:
   static inline bool classof(const GetResultInst *) { return true; }
   static inline bool classof(const Instruction *I) {
@@ -2810,14 +2801,6 @@ public:
   }
 };
 
-// FIXME: these are redundant if GetResultInst < UnaryInstruction
-template <>
-struct OperandTraits<GetResultInst> : FixedNumOperandTraits<1> {
-};
-
-DEFINE_TRANSPARENT_OPERAND_ACCESSORS(GetResultInst, Value)
-
-
 } // End llvm namespace
 
 #endif
index d34aa5931983121bb8c9cdd76586f49c510f1006..cea496d1ca78e28e9b9f1aa84c3045cb55623c23 100644 (file)
@@ -2734,14 +2734,12 @@ void SwitchInst::setSuccessorV(unsigned idx, BasicBlock *B) {
 GetResultInst::GetResultInst(Value *Aggregate, unsigned Index,
                              const std::string &Name,
                              Instruction *InsertBef)
-  : Instruction(cast<StructType>(Aggregate->getType())->getElementType(Index),
-                GetResult,
-                OperandTraits<GetResultInst>::op_begin(this),
-                OperandTraits<GetResultInst>::operands(this),
-                InsertBef) {
-  assert(isValidOperands(Aggregate, Index) && "Invalid GetResultInst operands!");
-  Op<0>().init(Aggregate, this);
-  Idx = Index;
+  : UnaryInstruction(cast<StructType>(Aggregate->getType())
+                       ->getElementType(Index),
+                     GetResult, Aggregate, InsertBef),
+    Idx(Index) {
+  assert(isValidOperands(Aggregate, Index)
+         && "Invalid GetResultInst operands!");
   setName(Name);
 }