Skip to content

Commit 8b9df70

Browse files
committed
[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.
1 parent 4cc94b7 commit 8b9df70

File tree

6 files changed

+53
-67
lines changed

6 files changed

+53
-67
lines changed

llvm/include/llvm/IR/IntrinsicInst.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,6 +1005,11 @@ class NoAliasScopeDeclInst : public IntrinsicInst {
10051005
cast<MetadataAsValue>(getOperand(Intrinsic::NoAliasScopeDeclScopeArg));
10061006
return cast<MDNode>(MV->getMetadata());
10071007
}
1008+
1009+
void setScopeList(MDNode *ScopeList) {
1010+
setOperand(Intrinsic::NoAliasScopeDeclScopeArg,
1011+
MetadataAsValue::get(getContext(), ScopeList));
1012+
}
10081013
};
10091014

10101015
} // end namespace llvm

llvm/include/llvm/Transforms/Utils/Cloning.h

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -272,41 +272,36 @@ void updateProfileCallee(
272272
/// basic blocks and extract their scope. These are candidates for duplication
273273
/// when cloning.
274274
void identifyNoAliasScopesToClone(
275-
ArrayRef<BasicBlock *> BBs,
276-
SmallVectorImpl<MetadataAsValue *> &NoAliasDeclScopes);
275+
ArrayRef<BasicBlock *> BBs, SmallVectorImpl<MDNode *> &NoAliasDeclScopes);
277276

278277
/// Duplicate the specified list of noalias decl scopes.
279278
/// The 'Ext' string is added as an extension to the name.
280-
/// Afterwards, the ClonedMVScopes contains a mapping of the original MV onto
281-
/// the cloned version.
282-
/// The ClonedScopes contains the mapping of the original scope MDNode onto the
283-
/// cloned scope.
279+
/// Afterwards, the ClonedScopes contains the mapping of the original scope
280+
/// MDNode onto the cloned scope.
284281
/// Be aware that the cloned scopes are still part of the original scope domain.
285282
void cloneNoAliasScopes(
286-
ArrayRef<MetadataAsValue *> NoAliasDeclScopes,
283+
ArrayRef<MDNode *> NoAliasDeclScopes,
287284
DenseMap<MDNode *, MDNode *> &ClonedScopes,
288-
DenseMap<MetadataAsValue *, MetadataAsValue *> &ClonedMVScopes,
289285
StringRef Ext, LLVMContext &Context);
290286

291287
/// Adapt the metadata for the specified instruction according to the
292288
/// provided mapping. This is normally used after cloning an instruction, when
293289
/// some noalias scopes needed to be cloned.
294290
void adaptNoAliasScopes(
295291
llvm::Instruction *I, const DenseMap<MDNode *, MDNode *> &ClonedScopes,
296-
const DenseMap<MetadataAsValue *, MetadataAsValue *> &ClonedMVScopes,
297292
LLVMContext &Context);
298293

299294
/// Clone the specified noalias decl scopes. Then adapt all instructions in the
300295
/// NewBlocks basicblocks to the cloned versions.
301296
/// 'Ext' will be added to the duplicate scope names.
302-
void cloneAndAdaptNoAliasScopes(ArrayRef<MetadataAsValue *> NoAliasDeclScopes,
297+
void cloneAndAdaptNoAliasScopes(ArrayRef<MDNode *> NoAliasDeclScopes,
303298
ArrayRef<BasicBlock *> NewBlocks,
304299
LLVMContext &Context, StringRef Ext);
305300

306301
/// Clone the specified noalias decl scopes. Then adapt all instructions in the
307302
/// [IStart, IEnd] (IEnd included !) range to the cloned versions. 'Ext' will be
308303
/// added to the duplicate scope names.
309-
void cloneAndAdaptNoAliasScopes(ArrayRef<MetadataAsValue *> NoAliasDeclScopes,
304+
void cloneAndAdaptNoAliasScopes(ArrayRef<MDNode *> NoAliasDeclScopes,
310305
Instruction *IStart, Instruction *IEnd,
311306
LLVMContext &Context, StringRef Ext);
312307
} // end namespace llvm

llvm/lib/Transforms/Utils/CloneFunction.cpp

Lines changed: 34 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -886,15 +886,13 @@ BasicBlock *llvm::DuplicateInstructionsInSplitBetween(
886886
}
887887

888888
void llvm::cloneNoAliasScopes(
889-
ArrayRef<MetadataAsValue *> NoAliasDeclScopes,
889+
ArrayRef<MDNode *> NoAliasDeclScopes,
890890
DenseMap<MDNode *, MDNode *> &ClonedScopes,
891-
DenseMap<MetadataAsValue *, MetadataAsValue *> &ClonedMVScopes,
892891
StringRef Ext, LLVMContext &Context) {
893892
MDBuilder MDB(Context);
894893

895-
for (auto *MV : NoAliasDeclScopes) {
896-
SmallVector<Metadata *, 4> ScopeList;
897-
for (auto &MDOperand : cast<MDNode>(MV->getMetadata())->operands()) {
894+
for (auto *ScopeList : NoAliasDeclScopes) {
895+
for (auto &MDOperand : ScopeList->operands()) {
898896
if (MDNode *MD = dyn_cast<MDNode>(MDOperand)) {
899897
AliasScopeNode SNANode(MD);
900898

@@ -908,94 +906,86 @@ void llvm::cloneNoAliasScopes(
908906
MDNode *NewScope = MDB.createAnonymousAliasScope(
909907
const_cast<MDNode *>(SNANode.getDomain()), Name);
910908
ClonedScopes.insert(std::make_pair(MD, NewScope));
911-
ScopeList.push_back(NewScope);
912909
}
913910
}
914-
MDNode *NewScopeList = MDNode::get(Context, ScopeList);
915-
ClonedMVScopes.insert(
916-
std::make_pair(MV, MetadataAsValue::get(Context, NewScopeList)));
917911
}
918912
}
919913

920914
void llvm::adaptNoAliasScopes(
921915
Instruction *I, const DenseMap<MDNode *, MDNode *> &ClonedScopes,
922-
const DenseMap<MetadataAsValue *, MetadataAsValue *> &ClonedMVScopes,
923916
LLVMContext &Context) {
924-
// MetadataAsValue will always be replaced !
925-
for (Use &U : I->operands())
926-
if (MetadataAsValue *MV = dyn_cast<MetadataAsValue>(U))
927-
if (auto *NewMV = ClonedMVScopes.lookup(MV))
928-
U.set(NewMV);
929-
930-
auto replaceWhenNeeded = [&](unsigned MD_ID) {
931-
if (const MDNode *CSNoAlias = I->getMetadata(MD_ID)) {
932-
bool NeedsReplacement = false;
933-
SmallVector<Metadata *, 8> NewScopeList;
934-
for (auto &MDOp : CSNoAlias->operands()) {
935-
if (MDNode *MD = dyn_cast<MDNode>(MDOp)) {
936-
if (auto *NewMD = ClonedScopes.lookup(MD)) {
937-
NewScopeList.push_back(NewMD);
938-
NeedsReplacement = true;
939-
continue;
940-
}
941-
NewScopeList.push_back(MD);
917+
auto CloneScopeList = [&](const MDNode *ScopeList) -> MDNode * {
918+
bool NeedsReplacement = false;
919+
SmallVector<Metadata *, 8> NewScopeList;
920+
for (auto &MDOp : ScopeList->operands()) {
921+
if (MDNode *MD = dyn_cast<MDNode>(MDOp)) {
922+
if (auto *NewMD = ClonedScopes.lookup(MD)) {
923+
NewScopeList.push_back(NewMD);
924+
NeedsReplacement = true;
925+
continue;
942926
}
927+
NewScopeList.push_back(MD);
943928
}
944-
if (NeedsReplacement)
945-
I->setMetadata(MD_ID, MDNode::get(Context, NewScopeList));
946929
}
930+
if (NeedsReplacement)
931+
return MDNode::get(Context, NewScopeList);
932+
return nullptr;
933+
};
934+
935+
if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(I))
936+
if (auto *NewScopeList = CloneScopeList(Decl->getScopeList()))
937+
Decl->setScopeList(NewScopeList);
938+
939+
auto replaceWhenNeeded = [&](unsigned MD_ID) {
940+
if (const MDNode *CSNoAlias = I->getMetadata(MD_ID))
941+
if (auto *NewScopeList = CloneScopeList(CSNoAlias))
942+
I->setMetadata(MD_ID, NewScopeList);
947943
};
948944
replaceWhenNeeded(LLVMContext::MD_noalias);
949945
replaceWhenNeeded(LLVMContext::MD_alias_scope);
950946
}
951947

952948
void llvm::cloneAndAdaptNoAliasScopes(
953-
ArrayRef<MetadataAsValue *> NoAliasDeclScopes,
949+
ArrayRef<MDNode *> NoAliasDeclScopes,
954950
ArrayRef<BasicBlock *> NewBlocks, LLVMContext &Context, StringRef Ext) {
955951
if (NoAliasDeclScopes.empty())
956952
return;
957953

958954
DenseMap<MDNode *, MDNode *> ClonedScopes;
959-
DenseMap<MetadataAsValue *, MetadataAsValue *> ClonedMVScopes;
960955
LLVM_DEBUG(dbgs() << "cloneAndAdaptNoAliasScopes: cloning "
961956
<< NoAliasDeclScopes.size() << " node(s)\n");
962957

963-
cloneNoAliasScopes(NoAliasDeclScopes, ClonedScopes, ClonedMVScopes, Ext,
964-
Context);
958+
cloneNoAliasScopes(NoAliasDeclScopes, ClonedScopes, Ext, Context);
965959
// Identify instructions using metadata that needs adaptation
966960
for (BasicBlock *NewBlock : NewBlocks)
967961
for (Instruction &I : *NewBlock)
968-
adaptNoAliasScopes(&I, ClonedScopes, ClonedMVScopes, Context);
962+
adaptNoAliasScopes(&I, ClonedScopes, Context);
969963
}
970964

971965
void llvm::cloneAndAdaptNoAliasScopes(
972-
ArrayRef<MetadataAsValue *> NoAliasDeclScopes, Instruction *IStart,
966+
ArrayRef<MDNode *> NoAliasDeclScopes, Instruction *IStart,
973967
Instruction *IEnd, LLVMContext &Context, StringRef Ext) {
974968
if (NoAliasDeclScopes.empty())
975969
return;
976970

977971
DenseMap<MDNode *, MDNode *> ClonedScopes;
978-
DenseMap<MetadataAsValue *, MetadataAsValue *> ClonedMVScopes;
979972
LLVM_DEBUG(dbgs() << "cloneAndAdaptNoAliasScopes: cloning "
980973
<< NoAliasDeclScopes.size() << " node(s)\n");
981974

982-
cloneNoAliasScopes(NoAliasDeclScopes, ClonedScopes, ClonedMVScopes, Ext,
983-
Context);
975+
cloneNoAliasScopes(NoAliasDeclScopes, ClonedScopes, Ext, Context);
984976
// Identify instructions using metadata that needs adaptation
985977
assert(IStart->getParent() == IEnd->getParent() && "different basic block ?");
986978
auto ItStart = IStart->getIterator();
987979
auto ItEnd = IEnd->getIterator();
988980
++ItEnd; // IEnd is included, increment ItEnd to get the end of the range
989981
for (auto &I : llvm::make_range(ItStart, ItEnd))
990-
adaptNoAliasScopes(&I, ClonedScopes, ClonedMVScopes, Context);
982+
adaptNoAliasScopes(&I, ClonedScopes, Context);
991983
}
992984

993985
void llvm::identifyNoAliasScopesToClone(
994-
ArrayRef<BasicBlock *> BBs,
995-
SmallVectorImpl<MetadataAsValue *> &NoAliasDeclScopes) {
986+
ArrayRef<BasicBlock *> BBs, SmallVectorImpl<MDNode *> &NoAliasDeclScopes) {
996987
for (BasicBlock *BB : BBs)
997988
for (Instruction &I : *BB)
998989
if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I))
999-
NoAliasDeclScopes.push_back(cast<MetadataAsValue>(
1000-
Decl->getOperand(Intrinsic::NoAliasScopeDeclScopeArg)));
990+
NoAliasDeclScopes.push_back(Decl->getScopeList());
1001991
}

llvm/lib/Transforms/Utils/InlineFunction.cpp

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -927,11 +927,8 @@ void ScopedAliasMetadataDeepCloner::remap(ValueToValueMapTy &VMap) {
927927
if (MDNode *M = I->getMetadata(LLVMContext::MD_noalias))
928928
I->setMetadata(LLVMContext::MD_noalias, MDMap[M]);
929929

930-
if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(I)) {
931-
auto *NewMV =
932-
MetadataAsValue::get(Decl->getContext(), MDMap[Decl->getScopeList()]);
933-
Decl->setOperand(Intrinsic::NoAliasScopeDeclScopeArg, NewMV);
934-
}
930+
if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(I))
931+
Decl->setScopeList(MDMap[Decl->getScopeList()]);
935932
}
936933
}
937934

llvm/lib/Transforms/Utils/LoopRotationUtils.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -404,7 +404,7 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
404404
// Remember the local noalias scope declarations in the header. After the
405405
// rotation, they must be duplicated and the scope must be cloned. This
406406
// avoids unwanted interaction across iterations.
407-
SmallVector<Instruction *, 6> NoAliasDeclInstructions;
407+
SmallVector<NoAliasScopeDeclInst *, 6> NoAliasDeclInstructions;
408408
for (Instruction &I : *OrigHeader)
409409
if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I))
410410
NoAliasDeclInstructions.push_back(Decl);
@@ -493,7 +493,7 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
493493

494494
// Clone the llvm.experimental.noalias.decl again for the NewHeader.
495495
Instruction *NewHeaderInsertionPoint = &(*NewHeader->getFirstNonPHI());
496-
for (Instruction *NAD : NoAliasDeclInstructions) {
496+
for (NoAliasScopeDeclInst *NAD : NoAliasDeclInstructions) {
497497
LLVM_DEBUG(dbgs() << " Cloning llvm.experimental.noalias.scope.decl:"
498498
<< *NAD << "\n");
499499
Instruction *NewNAD = NAD->clone();
@@ -505,10 +505,9 @@ bool LoopRotate::rotateLoop(Loop *L, bool SimplifiedLatch) {
505505
{
506506
auto &Context = NewHeader->getContext();
507507

508-
SmallVector<MetadataAsValue *, 8> NoAliasDeclScopes;
509-
for (Instruction *NAD : NoAliasDeclInstructions)
510-
NoAliasDeclScopes.push_back(cast<MetadataAsValue>(
511-
NAD->getOperand(Intrinsic::NoAliasScopeDeclScopeArg)));
508+
SmallVector<MDNode *, 8> NoAliasDeclScopes;
509+
for (NoAliasScopeDeclInst *NAD : NoAliasDeclInstructions)
510+
NoAliasDeclScopes.push_back(NAD->getScopeList());
512511

513512
LLVM_DEBUG(dbgs() << " Updating OrigHeader scopes\n");
514513
cloneAndAdaptNoAliasScopes(NoAliasDeclScopes, {OrigHeader}, Context,

llvm/lib/Transforms/Utils/LoopUnroll.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI,
592592

593593
// Identify what noalias metadata is inside the loop: if it is inside the
594594
// loop, the associated metadata must be cloned for each iteration.
595-
SmallVector<MetadataAsValue *, 6> LoopLocalNoAliasDeclScopes;
595+
SmallVector<MDNode *, 6> LoopLocalNoAliasDeclScopes;
596596
identifyNoAliasScopesToClone(L->getBlocks(), LoopLocalNoAliasDeclScopes);
597597

598598
for (unsigned It = 1; It != ULO.Count; ++It) {

0 commit comments

Comments
 (0)