diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2021-01-24 16:22:09 +0100 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2021-01-24 16:24:11 +0100 |
commit | 8b9df70bf7e7b812715a3dc9772719188e0df06c (patch) | |
tree | 99ea2f8160153b9211bb68401bc69b1d4ffb137e /llvm/lib/Transforms/Utils/CloneFunction.cpp | |
parent | 4cc94b731345aa494e0e364846ba9550f5dd5105 (diff) | |
download | llvm-8b9df70bf7e7b812715a3dc9772719188e0df06c.zip llvm-8b9df70bf7e7b812715a3dc9772719188e0df06c.tar.gz llvm-8b9df70bf7e7b812715a3dc9772719188e0df06c.tar.bz2 |
[Utils] Use NoAliasScopeDeclInst in a few more places (NFC)
In the cloning infrastructure, only track an MDNode mapping,
without explicitly storing the Metadata mapping, same as is done
during inlining. This makes things slightly simpler.
Diffstat (limited to 'llvm/lib/Transforms/Utils/CloneFunction.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/CloneFunction.cpp | 78 |
1 files changed, 34 insertions, 44 deletions
diff --git a/llvm/lib/Transforms/Utils/CloneFunction.cpp b/llvm/lib/Transforms/Utils/CloneFunction.cpp index ac474fb..51a4957 100644 --- a/llvm/lib/Transforms/Utils/CloneFunction.cpp +++ b/llvm/lib/Transforms/Utils/CloneFunction.cpp @@ -886,15 +886,13 @@ BasicBlock *llvm::DuplicateInstructionsInSplitBetween( } void llvm::cloneNoAliasScopes( - ArrayRef<MetadataAsValue *> NoAliasDeclScopes, + ArrayRef<MDNode *> NoAliasDeclScopes, DenseMap<MDNode *, MDNode *> &ClonedScopes, - DenseMap<MetadataAsValue *, MetadataAsValue *> &ClonedMVScopes, StringRef Ext, LLVMContext &Context) { MDBuilder MDB(Context); - for (auto *MV : NoAliasDeclScopes) { - SmallVector<Metadata *, 4> ScopeList; - for (auto &MDOperand : cast<MDNode>(MV->getMetadata())->operands()) { + for (auto *ScopeList : NoAliasDeclScopes) { + for (auto &MDOperand : ScopeList->operands()) { if (MDNode *MD = dyn_cast<MDNode>(MDOperand)) { AliasScopeNode SNANode(MD); @@ -908,94 +906,86 @@ void llvm::cloneNoAliasScopes( MDNode *NewScope = MDB.createAnonymousAliasScope( const_cast<MDNode *>(SNANode.getDomain()), Name); ClonedScopes.insert(std::make_pair(MD, NewScope)); - ScopeList.push_back(NewScope); } } - MDNode *NewScopeList = MDNode::get(Context, ScopeList); - ClonedMVScopes.insert( - std::make_pair(MV, MetadataAsValue::get(Context, NewScopeList))); } } void llvm::adaptNoAliasScopes( Instruction *I, const DenseMap<MDNode *, MDNode *> &ClonedScopes, - const DenseMap<MetadataAsValue *, MetadataAsValue *> &ClonedMVScopes, LLVMContext &Context) { - // MetadataAsValue will always be replaced ! - for (Use &U : I->operands()) - if (MetadataAsValue *MV = dyn_cast<MetadataAsValue>(U)) - if (auto *NewMV = ClonedMVScopes.lookup(MV)) - U.set(NewMV); - - auto replaceWhenNeeded = [&](unsigned MD_ID) { - if (const MDNode *CSNoAlias = I->getMetadata(MD_ID)) { - bool NeedsReplacement = false; - SmallVector<Metadata *, 8> NewScopeList; - for (auto &MDOp : CSNoAlias->operands()) { - if (MDNode *MD = dyn_cast<MDNode>(MDOp)) { - if (auto *NewMD = ClonedScopes.lookup(MD)) { - NewScopeList.push_back(NewMD); - NeedsReplacement = true; - continue; - } - NewScopeList.push_back(MD); + auto CloneScopeList = [&](const MDNode *ScopeList) -> MDNode * { + bool NeedsReplacement = false; + SmallVector<Metadata *, 8> NewScopeList; + for (auto &MDOp : ScopeList->operands()) { + if (MDNode *MD = dyn_cast<MDNode>(MDOp)) { + if (auto *NewMD = ClonedScopes.lookup(MD)) { + NewScopeList.push_back(NewMD); + NeedsReplacement = true; + continue; } + NewScopeList.push_back(MD); } - if (NeedsReplacement) - I->setMetadata(MD_ID, MDNode::get(Context, NewScopeList)); } + if (NeedsReplacement) + return MDNode::get(Context, NewScopeList); + return nullptr; + }; + + if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(I)) + if (auto *NewScopeList = CloneScopeList(Decl->getScopeList())) + Decl->setScopeList(NewScopeList); + + auto replaceWhenNeeded = [&](unsigned MD_ID) { + if (const MDNode *CSNoAlias = I->getMetadata(MD_ID)) + if (auto *NewScopeList = CloneScopeList(CSNoAlias)) + I->setMetadata(MD_ID, NewScopeList); }; replaceWhenNeeded(LLVMContext::MD_noalias); replaceWhenNeeded(LLVMContext::MD_alias_scope); } void llvm::cloneAndAdaptNoAliasScopes( - ArrayRef<MetadataAsValue *> NoAliasDeclScopes, + ArrayRef<MDNode *> NoAliasDeclScopes, ArrayRef<BasicBlock *> NewBlocks, LLVMContext &Context, StringRef Ext) { if (NoAliasDeclScopes.empty()) return; DenseMap<MDNode *, MDNode *> ClonedScopes; - DenseMap<MetadataAsValue *, MetadataAsValue *> ClonedMVScopes; LLVM_DEBUG(dbgs() << "cloneAndAdaptNoAliasScopes: cloning " << NoAliasDeclScopes.size() << " node(s)\n"); - cloneNoAliasScopes(NoAliasDeclScopes, ClonedScopes, ClonedMVScopes, Ext, - Context); + cloneNoAliasScopes(NoAliasDeclScopes, ClonedScopes, Ext, Context); // Identify instructions using metadata that needs adaptation for (BasicBlock *NewBlock : NewBlocks) for (Instruction &I : *NewBlock) - adaptNoAliasScopes(&I, ClonedScopes, ClonedMVScopes, Context); + adaptNoAliasScopes(&I, ClonedScopes, Context); } void llvm::cloneAndAdaptNoAliasScopes( - ArrayRef<MetadataAsValue *> NoAliasDeclScopes, Instruction *IStart, + ArrayRef<MDNode *> NoAliasDeclScopes, Instruction *IStart, Instruction *IEnd, LLVMContext &Context, StringRef Ext) { if (NoAliasDeclScopes.empty()) return; DenseMap<MDNode *, MDNode *> ClonedScopes; - DenseMap<MetadataAsValue *, MetadataAsValue *> ClonedMVScopes; LLVM_DEBUG(dbgs() << "cloneAndAdaptNoAliasScopes: cloning " << NoAliasDeclScopes.size() << " node(s)\n"); - cloneNoAliasScopes(NoAliasDeclScopes, ClonedScopes, ClonedMVScopes, Ext, - Context); + cloneNoAliasScopes(NoAliasDeclScopes, ClonedScopes, Ext, Context); // Identify instructions using metadata that needs adaptation assert(IStart->getParent() == IEnd->getParent() && "different basic block ?"); auto ItStart = IStart->getIterator(); auto ItEnd = IEnd->getIterator(); ++ItEnd; // IEnd is included, increment ItEnd to get the end of the range for (auto &I : llvm::make_range(ItStart, ItEnd)) - adaptNoAliasScopes(&I, ClonedScopes, ClonedMVScopes, Context); + adaptNoAliasScopes(&I, ClonedScopes, Context); } void llvm::identifyNoAliasScopesToClone( - ArrayRef<BasicBlock *> BBs, - SmallVectorImpl<MetadataAsValue *> &NoAliasDeclScopes) { + ArrayRef<BasicBlock *> BBs, SmallVectorImpl<MDNode *> &NoAliasDeclScopes) { for (BasicBlock *BB : BBs) for (Instruction &I : *BB) if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I)) - NoAliasDeclScopes.push_back(cast<MetadataAsValue>( - Decl->getOperand(Intrinsic::NoAliasScopeDeclScopeArg))); + NoAliasDeclScopes.push_back(Decl->getScopeList()); } |