Skip to content

Commit

Permalink
[Loop Utils] Extend the scope of addStringMetadataToLoop.
Browse files Browse the repository at this point in the history
To avoid duplicates in loop metadata, if the string to add is
already there, just update the value.

Reviewers: reames, Ashutosh
Reviewed By: reames
Subscribers: hiraditya, llvm-commits
Differential Revision: https://reviews.llvm.org/D65265

llvm-svn: 367087
  • Loading branch information
Serguei Katkov committed Jul 26, 2019
1 parent 84a6856 commit 7f8c809
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 2 deletions.
2 changes: 2 additions & 0 deletions llvm/include/llvm/Transforms/Utils/LoopUtils.h
Expand Up @@ -252,6 +252,8 @@ TransformationMode hasLICMVersioningTransformation(Loop *L);
/// @}

/// Set input string into loop metadata by keeping other values intact.
/// If the string is already in loop metadata update value if it is
/// different.
void addStringMetadataToLoop(Loop *TheLoop, const char *MDString,
unsigned V = 0);

Expand Down
20 changes: 18 additions & 2 deletions llvm/lib/Transforms/Utils/LoopUtils.cpp
Expand Up @@ -201,19 +201,35 @@ static MDNode *createStringMetadata(Loop *TheLoop, StringRef Name, unsigned V) {
}

/// Set input string into loop metadata by keeping other values intact.
void llvm::addStringMetadataToLoop(Loop *TheLoop, const char *MDString,
/// If the string is already in loop metadata update value if it is
/// different.
void llvm::addStringMetadataToLoop(Loop *TheLoop, const char *StringMD,
unsigned V) {
SmallVector<Metadata *, 4> MDs(1);
// If the loop already has metadata, retain it.
MDNode *LoopID = TheLoop->getLoopID();
if (LoopID) {
for (unsigned i = 1, ie = LoopID->getNumOperands(); i < ie; ++i) {
MDNode *Node = cast<MDNode>(LoopID->getOperand(i));
// If it is of form key = value, try to parse it.
if (Node->getNumOperands() == 2) {
MDString *S = dyn_cast<MDString>(Node->getOperand(0));
if (S && S->getString().equals(StringMD)) {
ConstantInt *IntMD =
mdconst::extract_or_null<ConstantInt>(Node->getOperand(1));
if (IntMD && IntMD->getSExtValue() == V)
// It is already in place. Do nothing.
return;
// We need to update the value, so just skip it here and it will
// be added after copying other existed nodes.
continue;
}
}
MDs.push_back(Node);
}
}
// Add new metadata.
MDs.push_back(createStringMetadata(TheLoop, MDString, V));
MDs.push_back(createStringMetadata(TheLoop, StringMD, V));
// Replace current metadata node with new one.
LLVMContext &Context = TheLoop->getHeader()->getContext();
MDNode *NewLoopID = MDNode::get(Context, MDs);
Expand Down

0 comments on commit 7f8c809

Please sign in to comment.