Merge pull request #15659 from atrick/irgen-endaccess
Full IRGen support for begin_access [no_nested_conflict].
diff --git a/lib/IRGen/IRGenSIL.cpp b/lib/IRGen/IRGenSIL.cpp
index 69a99d3..d38dd96 100644
--- a/lib/IRGen/IRGenSIL.cpp
+++ b/lib/IRGen/IRGenSIL.cpp
@@ -4260,8 +4260,8 @@
return enforcement;
}
-template <class Inst>
-static ExclusivityFlags getExclusivityFlags(Inst *i) {
+template <class BeginAccessInst>
+static ExclusivityFlags getExclusivityFlags(BeginAccessInst *i) {
return getExclusivityFlags(i->getModule(), i->getAccessKind(),
i->hasNoNestedConflict());
}
@@ -4363,6 +4363,9 @@
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 74a5b8c..765bbbd 100644
--- a/test/IRGen/access_markers.sil
+++ b/test/IRGen/access_markers.sil
@@ -155,6 +155,7 @@
// 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)