[LLVMdev] Proposal for Adding MetaData to a BasicBlock

kalyan ponnala ponnala.kalyan at gmail.com
Sat Apr 24 02:21:54 PDT 2010


Hello group,

Per my posting on the Clang Newsgroup.

I'm interested in doing some loop optimizations, towards this end I would
like to add some custom Metadata to a Loop header.

Loops in LLVM are represented using BasicBlocks, but unfortunately you can
NOT add MetaData to a BasicBlock.  Although you can add Metadata to an
instruction.  So I'm proposing to add the Metadata manipulation methods and
state from class "Instruction" to class "BasicBlock".

The class "Instruction" stores a private enumeration:

enum
{
  // HasMetadataBit - This is a bit stored in the SubClassData field which
  // indicates whether this instruction has metadata attached to it or not.

  HasMetadataBit = 1 << 15
};

This enumeration is then utilized by hasMetadata() which is inlined in class
Instruction:

// hasMetadata() - Return true if this instruction has any metadata attached
to it.

bool hasMetadata() const
{
  return (getSubclassDataFromValue() & HasMetadataBit) != 0;
}

>> First Question:

Since I do not expect to require any subclasses of BasicBlock, should I just
implement in BasicBlock the following:

bool hasMetadata() const
{
  return (HasMetadataBit) != 0;
}

>> Second Question:

Additionally, after studying the way Metadata is manipulated in class
"Instruction", I propose to add the following methods from class
"Instruction" to class "BasicBlock":

  public:
    bool hasMetadata() const
    MDNode *getMetadata(unsigned KindID) const;
    MDNode *getMetadata(const char *Kind) const;
    void getAllMetadata(SmallVectorImpl<std::pair<unsigned, MDNode*> >
&MDs)const;
    void setMetadata(unsigned KindID, MDNode *Node);
    void setMetadata(const char *Kind, MDNode *Node);

  private:
    // These are all implemented in Metadata.cpp.
    MDNode *getMetadataImpl(unsigned KindID) const;
    MDNode *getMetadataImpl(const char *Kind) const;
    void getAllMetadataImpl(SmallVectorImpl<std::pair<unsigned,MDNode*> >
&)const;
    void removeAllMetadata();

I noticed that BasicBlock seems to be referenced by almost every class in
LLVM, so I wanted to ask which particular client classes I will need to
update so I don't break any existing code.  It seems to me, that all I'm
doing is adding code, so I shouldn't break any of the client classes, but I
will need to update the classes that will need to utilize these new methods
in class BasicBlock.

Per Chris's earlier comment, I realize that BitcodeReader / BitcodeWriter &
LLParser will need to be updated.  For the moment I am just trying to make
sure that I can procedurally add Metadata to a Loop Header via adding
Metadata to a BasicBlock.

>> Third Question:

I had some trouble understanding the implementation of SetMetadata in the
Instruction class, is this where Metadata is "attached" to an Instruction?

Any detailed comments / suggestions as to which client LLVM IR classes I
need to dig into as well as what all the changes I will have to make would
be greatly appreciated.

Thanks,
-- 
Kalyan Ponnala
phone: 8163772059
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20100424/f0486816/attachment.html>


More information about the llvm-dev mailing list