[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