diff --git a/lib/IRGen/IRGenSIL.cpp b/lib/IRGen/IRGenSIL.cpp index 69a99d3408b..d38dd96e815 100644 --- a/lib/IRGen/IRGenSIL.cpp +++ b/lib/IRGen/IRGenSIL.cpp @@ -4260,8 +4260,8 @@ static SILAccessEnforcement getEffectiveEnforcement(IRGenFunction &IGF, return enforcement; } -template -static ExclusivityFlags getExclusivityFlags(Inst *i) { +template +static ExclusivityFlags getExclusivityFlags(BeginAccessInst *i) { return getExclusivityFlags(i->getModule(), i->getAccessKind(), i->hasNoNestedConflict()); } @@ -4363,6 +4363,9 @@ void IRGenSILFunction::visitEndAccessInst(EndAccessInst *i) { return; case SILAccessEnforcement::Dynamic: { + if (access->hasNoNestedConflict()) + return; + auto scratch = getLoweredDynamicEnforcementScratchBuffer(access); auto call = Builder.CreateCall(IGM.getEndAccessFn(), { scratch }); diff --git a/test/IRGen/access_markers.sil b/test/IRGen/access_markers.sil index 74a5b8c9565..765bbbd27fa 100644 --- a/test/IRGen/access_markers.sil +++ b/test/IRGen/access_markers.sil @@ -155,6 +155,7 @@ bb0(%0 : $A): // CHECK: call void @swift_beginAccess(i8* %{{.*}}, [[BUFFER]]* %{{.*}}, [[SIZE]] 0, i8* null) %3 = begin_access [read] [dynamic] [no_nested_conflict] %2 : $*Int copy_addr %3 to [initialization] %1 : $*Int + // CHECK-NOT: end_access end_access %3 : $*Int %9 = alloc_stack $Builtin.UnsafeValueBuffer // CHECK: call void @swift_beginAccess(i8* %{{.*}}, [[BUFFER]]* %{{.*}}, [[SIZE]] 0, i8* null)