diff --git a/include/llvm/InstrTypes.h b/include/llvm/InstrTypes.h index 25fa5f012dd..a320ad00e41 100644 --- a/include/llvm/InstrTypes.h +++ b/include/llvm/InstrTypes.h @@ -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) { diff --git a/include/llvm/Instructions.h b/include/llvm/Instructions.h index e7b42f34b44..3b3aecf8166 100644 --- a/include/llvm/Instructions.h +++ b/include/llvm/Instructions.h @@ -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 : FixedNumOperandTraits<1> { -}; - -DEFINE_TRANSPARENT_OPERAND_ACCESSORS(GetResultInst, Value) - - } // End llvm namespace #endif diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index d34aa593198..cea496d1ca7 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -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(Aggregate->getType())->getElementType(Index), - GetResult, - OperandTraits::op_begin(this), - OperandTraits::operands(this), - InsertBef) { - assert(isValidOperands(Aggregate, Index) && "Invalid GetResultInst operands!"); - Op<0>().init(Aggregate, this); - Idx = Index; + : UnaryInstruction(cast(Aggregate->getType()) + ->getElementType(Index), + GetResult, Aggregate, InsertBef), + Idx(Index) { + assert(isValidOperands(Aggregate, Index) + && "Invalid GetResultInst operands!"); setName(Name); }