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 | |
| parent | 84a6856928a27afb463f7ba70dc807dbafc83747 (diff) | |
| download | bcm5719-llvm-7f8c809592ed268b822c4361b896b4ce1a858ed9.tar.gz bcm5719-llvm-7f8c809592ed268b822c4361b896b4ce1a858ed9.zip | |
[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')
| -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 fef10352482..ce296b9d4dd 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); | 

