]> granicus.if.org Git - llvm/commitdiff
[Loop Utils] Extend the scope of addStringMetadataToLoop.
authorSerguei Katkov <serguei.katkov@azul.com>
Fri, 26 Jul 2019 07:04:34 +0000 (07:04 +0000)
committerSerguei Katkov <serguei.katkov@azul.com>
Fri, 26 Jul 2019 07:04:34 +0000 (07:04 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@367087 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/Utils/LoopUtils.h
lib/Transforms/Utils/LoopUtils.cpp

index 68bdded5cf93f16b03fe80aeb38b3829c523fc01..533cde11b27e40987a706e39bd938be4a02d3392 100644 (file)
@@ -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);
 
index fef10352482ca3699bc6e5c613f98f10361578bb..ce296b9d4dd3e823128db164ce4b56c990706c34 100644 (file)
@@ -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);