diff --git a/include/llvm/Instructions.h b/include/llvm/Instructions.h index 63a3dc0212b..1afcc5fc053 100644 --- a/include/llvm/Instructions.h +++ b/include/llvm/Instructions.h @@ -1270,15 +1270,25 @@ class ExtractElementInst : public Instruction { Op<1>() = EE.Op<1>(); } -public: - // allocate space for exactly two operands - void *operator new(size_t s) { - return User::operator new(s, 2); // FIXME: "unsigned Idx" forms of ctor? - } ExtractElementInst(Value *Vec, Value *Idx, const std::string &NameStr = "", Instruction *InsertBefore = 0); ExtractElementInst(Value *Vec, Value *Idx, const std::string &NameStr, BasicBlock *InsertAtEnd); +public: + static ExtractElementInst *Create(const ExtractElementInst &EE) { + return new(EE.getNumOperands()) ExtractElementInst(EE); + } + + static ExtractElementInst *Create(Value *Vec, Value *Idx, + const std::string &NameStr = "", + Instruction *InsertBefore = 0) { + return new(2) ExtractElementInst(Vec, Idx, NameStr, InsertBefore); + } + static ExtractElementInst *Create(Value *Vec, Value *Idx, + const std::string &NameStr, + BasicBlock *InsertAtEnd) { + return new(2) ExtractElementInst(Vec, Idx, NameStr, InsertAtEnd); + } /// isValidOperands - Return true if an extractelement instruction can be /// formed with the specified operands. diff --git a/include/llvm/Support/IRBuilder.h b/include/llvm/Support/IRBuilder.h index ac134ec303f..d22bc3d1038 100644 --- a/include/llvm/Support/IRBuilder.h +++ b/include/llvm/Support/IRBuilder.h @@ -641,7 +641,7 @@ public: if (Constant *VC = dyn_cast(Vec)) if (Constant *IC = dyn_cast(Idx)) return Folder.CreateExtractElement(VC, IC); - return Insert(new ExtractElementInst(Vec, Idx), Name); + return Insert(ExtractElementInst::Create(Vec, Idx), Name); } Value *CreateInsertElement(Value *Vec, Value *NewElt, Value *Idx, diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 10d9470d40e..60fc8ade7ac 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -3103,7 +3103,7 @@ bool LLParser::ParseExtractElement(Instruction *&Inst, PerFunctionState &PFS) { if (!ExtractElementInst::isValidOperands(Op0, Op1)) return Error(Loc, "invalid extractelement operands"); - Inst = new ExtractElementInst(Op0, Op1); + Inst = ExtractElementInst::Create(Op0, Op1); return false; } diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index cf90c64ac69..dadfb9ebbce 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1666,7 +1666,7 @@ bool BitcodeReader::ParseFunctionBody(Function *F) { if (getValueTypePair(Record, OpNum, NextValueNo, Vec) || getValue(Record, OpNum, Type::Int32Ty, Idx)) return Error("Invalid EXTRACTELT record"); - I = new ExtractElementInst(Vec, Idx); + I = ExtractElementInst::Create(Vec, Idx); break; } diff --git a/lib/Transforms/Scalar/GVNPRE.cpp b/lib/Transforms/Scalar/GVNPRE.cpp index 85c272d7112..4588a7f24c5 100644 --- a/lib/Transforms/Scalar/GVNPRE.cpp +++ b/lib/Transforms/Scalar/GVNPRE.cpp @@ -869,7 +869,7 @@ Value* GVNPRE::phi_translate(Value* V, BasicBlock* pred, BasicBlock* succ) { newOp1, newOp2, C->getName()+".expr"); else if (ExtractElementInst* E = dyn_cast(U)) - newVal = new ExtractElementInst(newOp1, newOp2, E->getName()+".expr"); + newVal = ExtractElementInst::Create(newOp1, newOp2, E->getName()+".expr"); uint32_t v = VN.lookup_or_add(newVal); @@ -1694,7 +1694,7 @@ void GVNPRE::insertion_pre(Value* e, BasicBlock* BB, newVal = InsertElementInst::Create(s1, s2, s3, S->getName()+".gvnpre", (*PI)->getTerminator()); else if (ExtractElementInst* S = dyn_cast(U)) - newVal = new ExtractElementInst(s1, s2, S->getName()+".gvnpre", + newVal = ExtractElementInst::Create(s1, s2, S->getName()+".gvnpre", (*PI)->getTerminator()); else if (SelectInst* S = dyn_cast(U)) newVal = SelectInst::Create(s1, s2, s3, S->getName()+".gvnpre", diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp index e3d0744b303..3451b717264 100644 --- a/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/lib/Transforms/Scalar/InstructionCombining.cpp @@ -1734,9 +1734,9 @@ Value *InstCombiner::SimplifyDemandedVectorElts(Value *V, APInt DemandedElts, Value *LHS = II->getOperand(1); Value *RHS = II->getOperand(2); // Extract the element as scalars. - LHS = InsertNewInstBefore(new ExtractElementInst(LHS, + LHS = InsertNewInstBefore(ExtractElementInst::Create(LHS, ConstantInt::get(Type::Int32Ty, 0U, false), "tmp"), *II); - RHS = InsertNewInstBefore(new ExtractElementInst(RHS, + RHS = InsertNewInstBefore(ExtractElementInst::Create(RHS, ConstantInt::get(Type::Int32Ty, 0U, false), "tmp"), *II); switch (II->getIntrinsicID()) { @@ -9012,7 +9012,7 @@ Instruction *InstCombiner::visitBitCast(BitCastInst &CI) { if (SrcVTy->getNumElements() == 1) { if (!isa(DestTy)) { Instruction *Elem = - new ExtractElementInst(Src, Context->getNullValue(Type::Int32Ty)); + ExtractElementInst::Create(Src, Context->getNullValue(Type::Int32Ty)); InsertNewInstBefore(Elem, CI); return CastInst::Create(Instruction::BitCast, Elem, DestTy); } @@ -9956,7 +9956,7 @@ Instruction *InstCombiner::visitCallInst(CallInst &CI) { if (ExtractedElts[Idx] == 0) { Instruction *Elt = - new ExtractElementInst(Idx < 16 ? Op0 : Op1, + ExtractElementInst::Create(Idx < 16 ? Op0 : Op1, ConstantInt::get(Type::Int32Ty, Idx&15, false), "tmp"); InsertNewInstBefore(Elt, CI); ExtractedElts[Idx] = Elt; @@ -12419,10 +12419,10 @@ Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) { bool isConstantElt = isa(EI.getOperand(1)); if (CheapToScalarize(BO, isConstantElt)) { ExtractElementInst *newEI0 = - new ExtractElementInst(BO->getOperand(0), EI.getOperand(1), + ExtractElementInst::Create(BO->getOperand(0), EI.getOperand(1), EI.getName()+".lhs"); ExtractElementInst *newEI1 = - new ExtractElementInst(BO->getOperand(1), EI.getOperand(1), + ExtractElementInst::Create(BO->getOperand(1), EI.getOperand(1), EI.getName()+".rhs"); InsertNewInstBefore(newEI0, EI); InsertNewInstBefore(newEI1, EI); @@ -12468,7 +12468,7 @@ Instruction *InstCombiner::visitExtractElementInst(ExtractElementInst &EI) { } else { return ReplaceInstUsesWith(EI, Context->getUndef(EI.getType())); } - return new ExtractElementInst(Src, + return ExtractElementInst::Create(Src, ConstantInt::get(Type::Int32Ty, SrcIdx, false)); } } diff --git a/lib/VMCore/Instructions.cpp b/lib/VMCore/Instructions.cpp index 6fc94514e5b..e1583c9ffd2 100644 --- a/lib/VMCore/Instructions.cpp +++ b/lib/VMCore/Instructions.cpp @@ -2982,7 +2982,7 @@ VAArgInst *VAArgInst::clone(LLVMContext&) const { } ExtractElementInst *ExtractElementInst::clone(LLVMContext&) const { - return new ExtractElementInst(*this); + return ExtractElementInst::Create(*this); } InsertElementInst *InsertElementInst::clone(LLVMContext&) const {