[llvm-commits] [llvm] r82638 - in /llvm/trunk: include/llvm/Metadata.h include/llvm/Value.h lib/VMCore/Instructions.cpp lib/VMCore/Metadata.cpp
Devang Patel
devang.patel at gmail.com
Wed Sep 23 11:44:45 PDT 2009
On Wed, Sep 23, 2009 at 11:37 AM, Chris Lattner <clattner at apple.com> wrote:
> On Sep 23, 2009, at 11:32 AM, Devang Patel wrote:
>> Author: dpatel
>> Date: Wed Sep 23 13:32:25 2009
>> New Revision: 82638
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=82638&view=rev
>> Log:
>> Do not leave behind metadata while cloning an instruction.
>
> This fix doesn't feel right. How about renaming the virtual "clone"
> method to a protected "cloneImpl()" virtual method, then have a
> nonvirtual clone() that calls cloneImpl() and then handles the
> metadata shuffle?
ok
-
Devang
> -Chris
>
>>
>>
>> Modified:
>> llvm/trunk/include/llvm/Metadata.h
>> llvm/trunk/include/llvm/Value.h
>> llvm/trunk/lib/VMCore/Instructions.cpp
>> llvm/trunk/lib/VMCore/Metadata.cpp
>>
>> Modified: llvm/trunk/include/llvm/Metadata.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Metadata.h?rev=82638&r1=82637&r2=82638&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> ======================================================================
>> --- llvm/trunk/include/llvm/Metadata.h (original)
>> +++ llvm/trunk/include/llvm/Metadata.h Wed Sep 23 13:32:25 2009
>> @@ -351,8 +351,12 @@
>>
>> /// ValueIsDeleted - This handler is used to update metadata store
>> /// when a value is deleted.
>> - void ValueIsDeleted(Value *V) {}
>> + void ValueIsDeleted(const Value *V) {}
>> void ValueIsDeleted(const Instruction *Inst);
>> +
>> + /// ValueIsCloned - This handler is used to update metadata store
>> + /// when In1 is cloned to create In2.
>> + void ValueIsCloned(const Instruction *In1, Instruction *In2);
>> };
>>
>> } // end llvm namespace
>>
>> Modified: llvm/trunk/include/llvm/Value.h
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Value.h?rev=82638&r1=82637&r2=82638&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> ======================================================================
>> --- llvm/trunk/include/llvm/Value.h (original)
>> +++ llvm/trunk/include/llvm/Value.h Wed Sep 23 13:32:25 2009
>> @@ -298,6 +298,9 @@
>> const BasicBlock *PredBB) const{
>> return const_cast<Value*>(this)->DoPHITranslation(CurBB, PredBB);
>> }
>> +
>> + /// hasMetadata - Return true if metadata is attached with this
>> value.
>> + bool hasMetadata() const { return HasMetadata; }
>> };
>>
>> inline raw_ostream &operator<<(raw_ostream &OS, const Value &V) {
>>
>> Modified: llvm/trunk/lib/VMCore/Instructions.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Instructions.cpp?rev=82638&r1=82637&r2=82638&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> ======================================================================
>> --- llvm/trunk/lib/VMCore/Instructions.cpp (original)
>> +++ llvm/trunk/lib/VMCore/Instructions.cpp Wed Sep 23 13:32:25 2009
>> @@ -12,6 +12,7 @@
>> //
>> //
>> =
>> =
>> =
>> ----------------------------------------------------------------------=
>> ==//
>>
>> +#include "LLVMContextImpl.h"
>> #include "llvm/Constants.h"
>> #include "llvm/DerivedTypes.h"
>> #include "llvm/Function.h"
>> @@ -23,6 +24,7 @@
>> #include "llvm/Support/CallSite.h"
>> #include "llvm/Support/ConstantRange.h"
>> #include "llvm/Support/MathExtras.h"
>> +
>> using namespace llvm;
>>
>> //
>> =
>> =
>> =
>> ----------------------------------------------------------------------=
>> ==//
>> @@ -3000,34 +3002,58 @@
>> GetElementPtrInst *GetElementPtrInst::clone(LLVMContext&) const {
>> GetElementPtrInst *New = new(getNumOperands())
>> GetElementPtrInst(*this);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> BinaryOperator *BinaryOperator::clone(LLVMContext&) const {
>> BinaryOperator *New = Create(getOpcode(), Op<0>(), Op<1>());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> FCmpInst* FCmpInst::clone(LLVMContext &Context) const {
>> FCmpInst *New = new FCmpInst(getPredicate(), Op<0>(), Op<1>());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>> ICmpInst* ICmpInst::clone(LLVMContext &Context) const {
>> ICmpInst *New = new ICmpInst(getPredicate(), Op<0>(), Op<1>());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> ExtractValueInst *ExtractValueInst::clone(LLVMContext&) const {
>> ExtractValueInst *New = new ExtractValueInst(*this);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>> InsertValueInst *InsertValueInst::clone(LLVMContext&) const {
>> InsertValueInst *New = new InsertValueInst(*this);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> @@ -3036,6 +3062,10 @@
>> (Value*)getOperand(0),
>> getAlignment());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> @@ -3044,12 +3074,20 @@
>> (Value*)getOperand(0),
>> getAlignment());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> FreeInst *FreeInst::clone(LLVMContext&) const {
>> FreeInst *New = new FreeInst(getOperand(0));
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> @@ -3058,6 +3096,10 @@
>> Twine(), isVolatile(),
>> getAlignment());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> @@ -3065,84 +3107,140 @@
>> StoreInst *New = new StoreInst(getOperand(0), getOperand(1),
>> isVolatile(), getAlignment());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> TruncInst *TruncInst::clone(LLVMContext&) const {
>> TruncInst *New = new TruncInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> ZExtInst *ZExtInst::clone(LLVMContext&) const {
>> ZExtInst *New = new ZExtInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> SExtInst *SExtInst::clone(LLVMContext&) const {
>> SExtInst *New = new SExtInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> FPTruncInst *FPTruncInst::clone(LLVMContext&) const {
>> FPTruncInst *New = new FPTruncInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> FPExtInst *FPExtInst::clone(LLVMContext&) const {
>> FPExtInst *New = new FPExtInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> UIToFPInst *UIToFPInst::clone(LLVMContext&) const {
>> UIToFPInst *New = new UIToFPInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> SIToFPInst *SIToFPInst::clone(LLVMContext&) const {
>> SIToFPInst *New = new SIToFPInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> FPToUIInst *FPToUIInst::clone(LLVMContext&) const {
>> FPToUIInst *New = new FPToUIInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> FPToSIInst *FPToSIInst::clone(LLVMContext&) const {
>> FPToSIInst *New = new FPToSIInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> PtrToIntInst *PtrToIntInst::clone(LLVMContext&) const {
>> PtrToIntInst *New = new PtrToIntInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> IntToPtrInst *IntToPtrInst::clone(LLVMContext&) const {
>> IntToPtrInst *New = new IntToPtrInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> BitCastInst *BitCastInst::clone(LLVMContext&) const {
>> BitCastInst *New = new BitCastInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> CallInst *CallInst::clone(LLVMContext&) const {
>> CallInst *New = new(getNumOperands()) CallInst(*this);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> @@ -3151,12 +3249,20 @@
>> getOperand(1),
>> getOperand(2));
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> VAArgInst *VAArgInst::clone(LLVMContext&) const {
>> VAArgInst *New = new VAArgInst(getOperand(0), getType());
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> @@ -3164,6 +3270,10 @@
>> ExtractElementInst *New = ExtractElementInst::Create(getOperand(0),
>> getOperand(1));
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> @@ -3172,6 +3282,10 @@
>> getOperand(1),
>> getOperand(2));
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> @@ -3180,18 +3294,30 @@
>> getOperand(1),
>> getOperand(2));
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> PHINode *PHINode::clone(LLVMContext&) const {
>> PHINode *New = new PHINode(*this);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> ReturnInst *ReturnInst::clone(LLVMContext&) const {
>> ReturnInst *New = new(getNumOperands()) ReturnInst(*this);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> @@ -3199,29 +3325,49 @@
>> unsigned Ops(getNumOperands());
>> BranchInst *New = new(Ops, Ops == 1) BranchInst(*this);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> SwitchInst *SwitchInst::clone(LLVMContext&) const {
>> SwitchInst *New = new SwitchInst(*this);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> InvokeInst *InvokeInst::clone(LLVMContext&) const {
>> InvokeInst *New = new(getNumOperands()) InvokeInst(*this);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> UnwindInst *UnwindInst::clone(LLVMContext &C) const {
>> UnwindInst *New = new UnwindInst(C);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> UnreachableInst *UnreachableInst::clone(LLVMContext &C) const {
>> UnreachableInst *New = new UnreachableInst(C);
>> New->SubclassOptionalData = SubclassOptionalData;
>> + if (hasMetadata()) {
>> + LLVMContext &Context = getContext();
>> + Context.pImpl->TheMetadata.ValueIsCloned(this, New);
>> + }
>> return New;
>> }
>>
>> Modified: llvm/trunk/lib/VMCore/Metadata.cpp
>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/VMCore/Metadata.cpp?rev=82638&r1=82637&r2=82638&view=diff
>>
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> =
>> ======================================================================
>> --- llvm/trunk/lib/VMCore/Metadata.cpp (original)
>> +++ llvm/trunk/lib/VMCore/Metadata.cpp Wed Sep 23 13:32:25 2009
>> @@ -338,3 +338,20 @@
>> Info.clear();
>> MetadataStore.erase(Inst);
>> }
>> +
>> +/// ValueIsCloned - This handler is used to update metadata store
>> +/// when In1 is cloned to create In2.
>> +void Metadata::ValueIsCloned(const Instruction *In1, Instruction
>> *In2) {
>> + // Find Metadata handles for In1.
>> + MDStoreTy::iterator I = MetadataStore.find(In1);
>> + if (I == MetadataStore.end())
>> + return;
>> +
>> + // FIXME : Give all metadata handlers a chance to adjust.
>> +
>> + MDMapTy &In1Info = I->second;
>> + MDMapTy In2Info;
>> + for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I !
>> = E; ++I)
>> + if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second))
>> + setMD(I->first, MD, In2);
>> +}
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
--
-
Devang
More information about the llvm-commits
mailing list