@@ -872,7 +872,7 @@ bool SILGlobalOpt::tryRemoveGlobalAlloc(SILGlobalVariable *global,
872
872
std::any_of (GlobalAddrMap[global].begin (), GlobalAddrMap[global].end (),
873
873
[=](GlobalAddrInst *addr) {
874
874
return std::find (InstToRemove.begin (), InstToRemove.end (),
875
- addr) ! = InstToRemove.end ();
875
+ addr) = = InstToRemove.end ();
876
876
})))
877
877
return false ;
878
878
@@ -890,12 +890,18 @@ bool SILGlobalOpt::tryRemoveGlobalAddr(SILGlobalVariable *global) {
890
890
GlobalAccessMap[global].size ())
891
891
return false ;
892
892
893
+ // Check if the address is used in anything but a store. If any global_addr
894
+ // instruction associated with a global is used in anything but a store, we
895
+ // can't remove ANY global_addr instruction associated with that global.
893
896
for (auto *addr : GlobalAddrMap[global]) {
894
897
for (auto *use : addr->getUses ()) {
895
898
if (!isa<StoreInst>(use->getUser ()))
896
899
return false ;
897
900
}
898
-
901
+ }
902
+
903
+ // Now that it's safe, remove all global addresses associated with this global
904
+ for (auto *addr : GlobalAddrMap[global]) {
899
905
InstToRemove.push_back (addr);
900
906
}
901
907
@@ -931,15 +937,15 @@ bool SILGlobalOpt::tryRemoveUnusedGlobal(SILGlobalVariable *global) {
931
937
std::any_of (GlobalAddrMap[global].begin (), GlobalAddrMap[global].end (),
932
938
[=](GlobalAddrInst *addr) {
933
939
return std::find (InstToRemove.begin (), InstToRemove.end (),
934
- addr) ! = InstToRemove.end ();
940
+ addr) = = InstToRemove.end ();
935
941
}))
936
942
return false ;
937
943
938
944
if (GlobalAccessMap[global].size () &&
939
945
std::any_of (GlobalAccessMap[global].begin (),
940
946
GlobalAccessMap[global].end (), [=](BeginAccessInst *access) {
941
947
return std::find (InstToRemove.begin (), InstToRemove.end (),
942
- access) ! = InstToRemove.end ();
948
+ access) = = InstToRemove.end ();
943
949
}))
944
950
return false ;
945
951
0 commit comments