diff options
author | Serguei Katkov <serguei.katkov@azul.com> | 2019-07-26 07:04:34 +0000 |
---|---|---|
committer | Serguei Katkov <serguei.katkov@azul.com> | 2019-07-26 07:04:34 +0000 |
commit | 7f8c809592ed268b822c4361b896b4ce1a858ed9 (patch) | |
tree | fa3e03a9d913fe9781219e290194794b1d4cb6c3 /llvm/lib/Transforms/Utils/LoopUtils.cpp | |
parent | 84a6856928a27afb463f7ba70dc807dbafc83747 (diff) | |
download | llvm-7f8c809592ed268b822c4361b896b4ce1a858ed9.zip llvm-7f8c809592ed268b822c4361b896b4ce1a858ed9.tar.gz llvm-7f8c809592ed268b822c4361b896b4ce1a858ed9.tar.bz2 |
[Loop Utils] Extend the scope of addStringMetadataToLoop.
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
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUtils.cpp | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index fef1035..ce296b9 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -201,7 +201,9 @@ 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. @@ -209,11 +211,25 @@ void llvm::addStringMetadataToLoop(Loop *TheLoop, const char *MDString, 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); |