5555
5656#define DEBUG_TYPE " access-enforcement-wmo"
5757
58+ #include " swift/Basic/SmallPtrSetVector.h"
5859#include " swift/SIL/DebugUtils.h"
5960#include " swift/SIL/MemAccessUtils.h"
6061#include " swift/SIL/SILFunction.h"
@@ -143,6 +144,7 @@ namespace {
143144// checks).
144145class GlobalAccessRemoval {
145146 SILModule &module ;
147+ SmallPtrSetVector<SILFunction *, 8 > changedFunctions;
146148
147149 using BeginAccessSet = SmallDenseSet<BeginAccessInst *, 8 >;
148150
@@ -162,6 +164,8 @@ class GlobalAccessRemoval {
162164 GlobalAccessRemoval (SILModule &module ) : module (module ) {}
163165
164166 void perform ();
167+
168+ void invalidateAnalysis (SILModuleTransform *pass);
165169
166170protected:
167171 bool visitInstruction (SILInstruction *I);
@@ -189,6 +193,13 @@ void GlobalAccessRemoval::perform() {
189193 removeNonreentrantAccess ();
190194}
191195
196+ void GlobalAccessRemoval::invalidateAnalysis (SILModuleTransform *pass) {
197+ for (SILFunction *changedFunction : changedFunctions) {
198+ pass->invalidateAnalysis (changedFunction,
199+ SILAnalysis::InvalidationKind::Instructions);
200+ }
201+ }
202+
192203bool GlobalAccessRemoval::visitInstruction (SILInstruction *I) {
193204 if (auto *BAI = dyn_cast<BeginAccessInst>(I)) {
194205 auto storageAndBase = AccessStorageWithBase::compute (BAI->getSource ());
@@ -292,6 +303,7 @@ void GlobalAccessRemoval::removeNonreentrantAccess() {
292303 for (BeginAccessInst *beginAccess : info.beginAccessSet ) {
293304 LLVM_DEBUG (llvm::dbgs () << " Disabling access marker " << *beginAccess);
294305 beginAccess->setEnforcement (SILAccessEnforcement::Static);
306+ changedFunctions.insert (beginAccess->getFunction ());
295307 }
296308 }
297309}
@@ -301,6 +313,7 @@ struct AccessEnforcementWMO : public SILModuleTransform {
301313 void run () override {
302314 GlobalAccessRemoval eliminationPass (*getModule ());
303315 eliminationPass.perform ();
316+ eliminationPass.invalidateAnalysis (this );
304317 }
305318};
306319}
0 commit comments