From 702039b96394bc32ccf0615d0084c5b79e8b5bed Mon Sep 17 00:00:00 2001 From: Adam Nemet Date: Fri, 22 Apr 2016 19:10:05 +0000 Subject: [PATCH] [LoopUtils] Extend findStringMetadataForLoop to return the value for metadata E.g. for: !1 = {"llvm.distribute", i32 1} it now returns the MDOperand for 1. I will use this in LoopDistribution to check the value of the metadata. Note that the change is backward-compatible with its current use in LoopVersioningLICM. An Optional implicitly converts to a bool depending whether it contains a value or not. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@267190 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Transforms/Utils/LoopUtils.h | 10 ++++++--- lib/Transforms/Utils/LoopUtils.cpp | 25 ++++++++++++++++------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/include/llvm/Transforms/Utils/LoopUtils.h b/include/llvm/Transforms/Utils/LoopUtils.h index cb789b80a93..ff0d673d16e 100644 --- a/include/llvm/Transforms/Utils/LoopUtils.h +++ b/include/llvm/Transforms/Utils/LoopUtils.h @@ -385,9 +385,13 @@ void computeLICMSafetyInfo(LICMSafetyInfo *, Loop *); /// \brief Returns the instructions that use values defined in the loop. SmallVector findDefsUsedOutsideOfLoop(Loop *L); -/// \brief Find string metadata for loop, if it exists return true, else return -/// false. -bool findStringMetadataForLoop(Loop *TheLoop, StringRef Name); +/// \brief Find string metadata for loop +/// +/// If it has a value (e.g. {"llvm.distribute", 1} return the value as an +/// operand or null otherwise. If the string metadata is not found return +/// Optional's not-a-value. +Optional findStringMetadataForLoop(Loop *TheLoop, + StringRef Name); /// \brief Set input string into loop metadata by keeping other values intact. void addStringMetadataToLoop(Loop *TheLoop, const char *MDString, diff --git a/lib/Transforms/Utils/LoopUtils.cpp b/lib/Transforms/Utils/LoopUtils.cpp index 2f74b115493..2d1f10f0591 100644 --- a/lib/Transforms/Utils/LoopUtils.cpp +++ b/lib/Transforms/Utils/LoopUtils.cpp @@ -823,13 +823,17 @@ void llvm::initializeLoopPassPass(PassRegistry &Registry) { INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass) } -/// \brief Find string metadata for loop, if it exists return true, else return -/// false. -bool llvm::findStringMetadataForLoop(Loop *TheLoop, StringRef Name) { +/// \brief Find string metadata for loop +/// +/// If it has a value (e.g. {"llvm.distribute", 1} return the value as an +/// operand or null otherwise. If the string metadata is not found return +/// Optional's not-a-value. +Optional llvm::findStringMetadataForLoop(Loop *TheLoop, + StringRef Name) { MDNode *LoopID = TheLoop->getLoopID(); - // Return false if LoopID is false. + // Return none if LoopID is false. if (!LoopID) - return false; + return None; // First operand should refer to the loop id itself. assert(LoopID->getNumOperands() > 0 && "requires at least one operand"); @@ -845,7 +849,14 @@ bool llvm::findStringMetadataForLoop(Loop *TheLoop, StringRef Name) { continue; // Return true if MDString holds expected MetaData. if (Name.equals(S->getString())) - return true; + switch (MD->getNumOperands()) { + case 1: + return nullptr; + case 2: + return &MD->getOperand(1); + default: + llvm_unreachable("loop metadata has 0 or 1 operand"); + } } - return false; + return None; }