diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopVersioning.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopVersioning.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopVersioning.cpp b/llvm/lib/Transforms/Utils/LoopVersioning.cpp index 5ee551e..1711163 100644 --- a/llvm/lib/Transforms/Utils/LoopVersioning.cpp +++ b/llvm/lib/Transforms/Utils/LoopVersioning.cpp @@ -225,34 +225,43 @@ void LoopVersioning::annotateLoopWithNoAlias() { } } -void LoopVersioning::annotateInstWithNoAlias(Instruction *VersionedInst, - const Instruction *OrigInst) { +std::pair<MDNode *, MDNode *> +LoopVersioning::getNoAliasMetadataFor(const Instruction *OrigInst) const { if (!AnnotateNoAlias) - return; + return {nullptr, nullptr}; LLVMContext &Context = VersionedLoop->getHeader()->getContext(); const Value *Ptr = isa<LoadInst>(OrigInst) ? cast<LoadInst>(OrigInst)->getPointerOperand() : cast<StoreInst>(OrigInst)->getPointerOperand(); + MDNode *AliasScope = nullptr; + MDNode *NoAlias = nullptr; // Find the group for the pointer and then add the scope metadata. auto Group = PtrToGroup.find(Ptr); if (Group != PtrToGroup.end()) { - VersionedInst->setMetadata( - LLVMContext::MD_alias_scope, - MDNode::concatenate( - VersionedInst->getMetadata(LLVMContext::MD_alias_scope), - MDNode::get(Context, GroupToScope[Group->second]))); + AliasScope = MDNode::concatenate( + OrigInst->getMetadata(LLVMContext::MD_alias_scope), + MDNode::get(Context, GroupToScope.lookup(Group->second))); // Add the no-alias metadata. auto NonAliasingScopeList = GroupToNonAliasingScopeList.find(Group->second); if (NonAliasingScopeList != GroupToNonAliasingScopeList.end()) - VersionedInst->setMetadata( - LLVMContext::MD_noalias, - MDNode::concatenate( - VersionedInst->getMetadata(LLVMContext::MD_noalias), - NonAliasingScopeList->second)); + NoAlias = + MDNode::concatenate(OrigInst->getMetadata(LLVMContext::MD_noalias), + NonAliasingScopeList->second); } + return {AliasScope, NoAlias}; +} + +void LoopVersioning::annotateInstWithNoAlias(Instruction *VersionedInst, + const Instruction *OrigInst) { + const auto &[AliasScopeMD, NoAliasMD] = getNoAliasMetadataFor(OrigInst); + if (AliasScopeMD) + VersionedInst->setMetadata(LLVMContext::MD_alias_scope, AliasScopeMD); + + if (NoAliasMD) + VersionedInst->setMetadata(LLVMContext::MD_noalias, NoAliasMD); } namespace { |