aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/CloneFunction.cpp
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2021-01-24 16:22:09 +0100
committerNikita Popov <nikita.ppv@gmail.com>2021-01-24 16:24:11 +0100
commit8b9df70bf7e7b812715a3dc9772719188e0df06c (patch)
tree99ea2f8160153b9211bb68401bc69b1d4ffb137e /llvm/lib/Transforms/Utils/CloneFunction.cpp
parent4cc94b731345aa494e0e364846ba9550f5dd5105 (diff)
downloadllvm-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.cpp78
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());
}