@@ -886,15 +886,13 @@ BasicBlock *llvm::DuplicateInstructionsInSplitBetween(
886
886
}
887
887
888
888
void llvm::cloneNoAliasScopes (
889
- ArrayRef<MetadataAsValue *> NoAliasDeclScopes,
889
+ ArrayRef<MDNode *> NoAliasDeclScopes,
890
890
DenseMap<MDNode *, MDNode *> &ClonedScopes,
891
- DenseMap<MetadataAsValue *, MetadataAsValue *> &ClonedMVScopes,
892
891
StringRef Ext, LLVMContext &Context) {
893
892
MDBuilder MDB (Context);
894
893
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 ()) {
898
896
if (MDNode *MD = dyn_cast<MDNode>(MDOperand)) {
899
897
AliasScopeNode SNANode (MD);
900
898
@@ -908,94 +906,86 @@ void llvm::cloneNoAliasScopes(
908
906
MDNode *NewScope = MDB.createAnonymousAliasScope (
909
907
const_cast <MDNode *>(SNANode.getDomain ()), Name);
910
908
ClonedScopes.insert (std::make_pair (MD, NewScope));
911
- ScopeList.push_back (NewScope);
912
909
}
913
910
}
914
- MDNode *NewScopeList = MDNode::get (Context, ScopeList);
915
- ClonedMVScopes.insert (
916
- std::make_pair (MV, MetadataAsValue::get (Context, NewScopeList)));
917
911
}
918
912
}
919
913
920
914
void llvm::adaptNoAliasScopes (
921
915
Instruction *I, const DenseMap<MDNode *, MDNode *> &ClonedScopes,
922
- const DenseMap<MetadataAsValue *, MetadataAsValue *> &ClonedMVScopes,
923
916
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 ;
942
926
}
927
+ NewScopeList.push_back (MD);
943
928
}
944
- if (NeedsReplacement)
945
- I->setMetadata (MD_ID, MDNode::get (Context, NewScopeList));
946
929
}
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);
947
943
};
948
944
replaceWhenNeeded (LLVMContext::MD_noalias);
949
945
replaceWhenNeeded (LLVMContext::MD_alias_scope);
950
946
}
951
947
952
948
void llvm::cloneAndAdaptNoAliasScopes (
953
- ArrayRef<MetadataAsValue *> NoAliasDeclScopes,
949
+ ArrayRef<MDNode *> NoAliasDeclScopes,
954
950
ArrayRef<BasicBlock *> NewBlocks, LLVMContext &Context, StringRef Ext) {
955
951
if (NoAliasDeclScopes.empty ())
956
952
return ;
957
953
958
954
DenseMap<MDNode *, MDNode *> ClonedScopes;
959
- DenseMap<MetadataAsValue *, MetadataAsValue *> ClonedMVScopes;
960
955
LLVM_DEBUG (dbgs () << " cloneAndAdaptNoAliasScopes: cloning "
961
956
<< NoAliasDeclScopes.size () << " node(s)\n " );
962
957
963
- cloneNoAliasScopes (NoAliasDeclScopes, ClonedScopes, ClonedMVScopes, Ext,
964
- Context);
958
+ cloneNoAliasScopes (NoAliasDeclScopes, ClonedScopes, Ext, Context);
965
959
// Identify instructions using metadata that needs adaptation
966
960
for (BasicBlock *NewBlock : NewBlocks)
967
961
for (Instruction &I : *NewBlock)
968
- adaptNoAliasScopes (&I, ClonedScopes, ClonedMVScopes, Context);
962
+ adaptNoAliasScopes (&I, ClonedScopes, Context);
969
963
}
970
964
971
965
void llvm::cloneAndAdaptNoAliasScopes (
972
- ArrayRef<MetadataAsValue *> NoAliasDeclScopes, Instruction *IStart,
966
+ ArrayRef<MDNode *> NoAliasDeclScopes, Instruction *IStart,
973
967
Instruction *IEnd, LLVMContext &Context, StringRef Ext) {
974
968
if (NoAliasDeclScopes.empty ())
975
969
return ;
976
970
977
971
DenseMap<MDNode *, MDNode *> ClonedScopes;
978
- DenseMap<MetadataAsValue *, MetadataAsValue *> ClonedMVScopes;
979
972
LLVM_DEBUG (dbgs () << " cloneAndAdaptNoAliasScopes: cloning "
980
973
<< NoAliasDeclScopes.size () << " node(s)\n " );
981
974
982
- cloneNoAliasScopes (NoAliasDeclScopes, ClonedScopes, ClonedMVScopes, Ext,
983
- Context);
975
+ cloneNoAliasScopes (NoAliasDeclScopes, ClonedScopes, Ext, Context);
984
976
// Identify instructions using metadata that needs adaptation
985
977
assert (IStart->getParent () == IEnd->getParent () && " different basic block ?" );
986
978
auto ItStart = IStart->getIterator ();
987
979
auto ItEnd = IEnd->getIterator ();
988
980
++ItEnd; // IEnd is included, increment ItEnd to get the end of the range
989
981
for (auto &I : llvm::make_range (ItStart, ItEnd))
990
- adaptNoAliasScopes (&I, ClonedScopes, ClonedMVScopes, Context);
982
+ adaptNoAliasScopes (&I, ClonedScopes, Context);
991
983
}
992
984
993
985
void llvm::identifyNoAliasScopesToClone (
994
- ArrayRef<BasicBlock *> BBs,
995
- SmallVectorImpl<MetadataAsValue *> &NoAliasDeclScopes) {
986
+ ArrayRef<BasicBlock *> BBs, SmallVectorImpl<MDNode *> &NoAliasDeclScopes) {
996
987
for (BasicBlock *BB : BBs)
997
988
for (Instruction &I : *BB)
998
989
if (auto *Decl = dyn_cast<NoAliasScopeDeclInst>(&I))
999
- NoAliasDeclScopes.push_back (cast<MetadataAsValue>(
1000
- Decl->getOperand (Intrinsic::NoAliasScopeDeclScopeArg)));
990
+ NoAliasDeclScopes.push_back (Decl->getScopeList ());
1001
991
}
0 commit comments