Skip to content

Commit 6952f76

Browse files
authored
Merge pull request #29106 from gottesmm/pr-65a234f04383513e6934cbcb05f48283275b325d
[silgen] When SILGenLValue accesses ref_elt_addr, emit unsafe access for immutable or non accessing uses instead of not emitting any begin_access.
2 parents 4194c16 + a3b68e6 commit 6952f76

8 files changed

+47
-23
lines changed

lib/SILGen/SILGenLValue.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -739,13 +739,16 @@ namespace {
739739
SGF.B.createRefElementAddr(loc, base.getUnmanagedValue(),
740740
Field, SubstFieldType);
741741

742-
// Avoid emitting access markers completely for non-accesses or immutable
743-
// declarations. Access marker verification is aware of these cases.
744-
if (!IsNonAccessing && !Field->isLet()) {
745-
if (auto enforcement = SGF.getDynamicEnforcement(Field)) {
746-
result = enterAccessScope(SGF, loc, result, getTypeData(),
747-
getAccessKind(), *enforcement);
748-
}
742+
// Avoid emitting non-trivial access markers for non-accesses and
743+
// immutable values.
744+
auto enforcement = SGF.getDynamicEnforcement(Field);
745+
if (enforcement && !IsNonAccessing && !Field->isLet()) {
746+
result = enterAccessScope(SGF, loc, result, getTypeData(),
747+
getAccessKind(), *enforcement);
748+
} else {
749+
result =
750+
enterAccessScope(SGF, loc, result, getTypeData(), getAccessKind(),
751+
SILAccessEnforcement::Unsafe);
749752
}
750753

751754
return ManagedValue::forLValue(result);

test/SILGen/access_marker_gen.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,9 @@ func testClassLetProperty(c: C) -> Int {
124124
// CHECK-LABEL: sil hidden [ossa] @$s17access_marker_gen20testClassLetProperty1cSiAA1CC_tF : $@convention(thin) (@guaranteed C) -> Int {
125125
// CHECK: bb0(%0 : @guaranteed $C):
126126
// CHECK: [[ADR:%.*]] = ref_element_addr %{{.*}} : $C, #C.z
127-
// CHECK-NOT: begin_access
128-
// CHECK: %{{.*}} = load [trivial] [[ADR]] : $*Int
129-
// CHECK-NOT: end_access
127+
// CHECK: [[ADR_ACCESS:%.*]] = begin_access [read] [unsafe] [[ADR]]
128+
// CHECK: %{{.*}} = load [trivial] [[ADR_ACCESS]] : $*Int
129+
// CHECK: end_access [[ADR_ACCESS]]
130130
// CHECK-NOT: destroy_value %0 : $C
131131
// CHECK: return %{{.*}} : $Int
132132
// CHECK-LABEL: } // end sil function '$s17access_marker_gen20testClassLetProperty1cSiAA1CC_tF'

test/SILGen/guaranteed_self.swift

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -451,11 +451,14 @@ class LetFieldClass {
451451
// CHECK-LABEL: sil hidden [ossa] @$s15guaranteed_self13LetFieldClassC10letkMethod{{[_0-9a-zA-Z]*}}F : $@convention(method) (@guaranteed LetFieldClass) -> () {
452452
// CHECK: bb0([[CLS:%.*]] : @guaranteed $LetFieldClass):
453453
// CHECK: [[KRAKEN_ADDR:%.*]] = ref_element_addr [[CLS]] : $LetFieldClass, #LetFieldClass.letk
454-
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR]]
454+
// CHECK-NEXT: [[KRAKEN_ADDR_ACCESS:%.*]] = begin_access [read] [unsafe] [[KRAKEN_ADDR]]
455+
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR_ACCESS]]
456+
// CHECK-NEXT: end_access [[KRAKEN_ADDR_ACCESS]]
455457
// CHECK-NEXT: [[KRAKEN_METH:%.*]] = class_method [[KRAKEN]]
456458
// CHECK-NEXT: apply [[KRAKEN_METH]]([[KRAKEN]])
457459
// CHECK: [[KRAKEN_ADDR:%.*]] = ref_element_addr [[CLS]] : $LetFieldClass, #LetFieldClass.letk
458-
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR]]
460+
// CHECK-NEXT: [[KRAKEN_ADDR_ACCESS:%.*]] = begin_access [read] [unsafe] [[KRAKEN_ADDR]]
461+
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR_ACCESS]]
459462
// CHECK: [[REBORROWED_KRAKEN:%.*]] = begin_borrow [[KRAKEN]]
460463
// CHECK: [[DESTROY_SHIP_FUN:%.*]] = function_ref @$s15guaranteed_self11destroyShipyyAA6KrakenCF : $@convention(thin) (@guaranteed Kraken) -> ()
461464
// CHECK-NEXT: apply [[DESTROY_SHIP_FUN]]([[REBORROWED_KRAKEN]])
@@ -464,7 +467,9 @@ class LetFieldClass {
464467
// CHECK-NEXT: [[KRAKEN_BOX:%.*]] = alloc_box ${ var Kraken }
465468
// CHECK-NEXT: [[PB:%.*]] = project_box [[KRAKEN_BOX]]
466469
// CHECK-NEXT: [[KRAKEN_ADDR:%.*]] = ref_element_addr [[CLS]] : $LetFieldClass, #LetFieldClass.letk
467-
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR]]
470+
// CHECK-NEXT: [[KRAKEN_ADDR_ACCESS:%.*]] = begin_access [read] [unsafe] [[KRAKEN_ADDR]]
471+
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR_ACCESS]]
472+
// CHECK-NEXT: end_access [[KRAKEN_ADDR_ACCESS]]
468473
// CHECK-NEXT: store [[KRAKEN]] to [init] [[PB]]
469474
// CHECK-NEXT: [[READ:%.*]] = begin_access [read] [unknown] [[PB]] : $*Kraken
470475
// CHECK-NEXT: [[KRAKEN_COPY:%.*]] = load [copy] [[READ]]

test/SILGen/properties.swift

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -616,7 +616,9 @@ func genericProps(_ x: GenericClass<String>) {
616616
// CHECK: apply {{.*}}<String>([[ARG]]) : $@convention(method) <τ_0_0> (@guaranteed GenericClass<τ_0_0>) -> Int
617617
let _ = x.y
618618
// CHECK: [[Z:%.*]] = ref_element_addr [[ARG]] : $GenericClass<String>, #GenericClass.z
619-
// CHECK: [[LOADED_Z:%.*]] = load [copy] [[Z]] : $*String
619+
// CHECK: [[Z_ACCESS:%.*]] = begin_access [read] [unsafe] [[Z]]
620+
// CHECK: [[LOADED_Z:%.*]] = load [copy] [[Z_ACCESS]] : $*String
621+
// CHECK: end_access [[Z_ACCESS]]
620622
// CHECK: destroy_value [[LOADED_Z]]
621623
// CHECK-NOT: destroy_value [[ARG]]
622624
let _ = x.z
@@ -626,7 +628,8 @@ func genericProps(_ x: GenericClass<String>) {
626628
func genericPropsInGenericContext<U>(_ x: GenericClass<U>) {
627629
// CHECK: bb0([[ARG:%.*]] : @guaranteed $GenericClass<U>):
628630
// CHECK: [[Z:%.*]] = ref_element_addr [[ARG]] : $GenericClass<U>, #GenericClass.z
629-
// CHECK: copy_addr [[Z]] {{.*}} : $*U
631+
// CHECK: [[Z_ACCESS:%.*]] = begin_access [read] [unsafe] [[Z]]
632+
// CHECK: copy_addr [[Z_ACCESS]] {{.*}} : $*U
630633
let _ = x.z
631634
}
632635

@@ -642,7 +645,9 @@ class ClassWithLetProperty {
642645
// CHECK: bb0([[ARG:%.*]] : @guaranteed $ClassWithLetProperty):
643646
// CHECK-NEXT: debug_value
644647
// CHECK-NEXT: [[PTR:%[0-9]+]] = ref_element_addr [[ARG]] : $ClassWithLetProperty, #ClassWithLetProperty.p
645-
// CHECK-NEXT: [[VAL:%[0-9]+]] = load [trivial] [[PTR]] : $*Int
648+
// CHECK-NEXT: [[PTR_ACCESS:%.*]] = begin_access [read] [unsafe] [[PTR]]
649+
// CHECK-NEXT: [[VAL:%[0-9]+]] = load [trivial] [[PTR_ACCESS]] : $*Int
650+
// CHECK-NEXT: end_access [[PTR_ACCESS]]
646651
// CHECK-NEXT: return [[VAL]] : $Int
647652

648653

@@ -670,15 +675,17 @@ class r19254812Derived: r19254812Base{
670675
// Initialization of the pi field: no copy_values/releases.
671676
// CHECK: [[SELF:%[0-9]+]] = load_borrow [[PB_BOX]] : $*r19254812Derived
672677
// CHECK-NEXT: [[PIPTR:%[0-9]+]] = ref_element_addr [[SELF]] : $r19254812Derived, #r19254812Derived.pi
673-
// CHECK-NEXT: assign {{.*}} to [[PIPTR]] : $*Double
678+
// CHECK-NEXT: [[PIPTR_ACCESS:%.*]] = begin_access [modify] [unsafe] [[PIPTR]]
679+
// CHECK-NEXT: assign {{.*}} to [[PIPTR_ACCESS]] : $*Double
674680

675681
// CHECK-NOT: destroy_value
676682
// CHECK-NOT: copy_value
677683

678684
// Load of the pi field: no copy_values/releases.
679685
// CHECK: [[SELF:%[0-9]+]] = load_borrow [[PB_BOX]] : $*r19254812Derived
680686
// CHECK-NEXT: [[PIPTR:%[0-9]+]] = ref_element_addr [[SELF]] : $r19254812Derived, #r19254812Derived.pi
681-
// CHECK-NEXT: {{.*}} = load [trivial] [[PIPTR]] : $*Double
687+
// CHECK-NEXT: [[PIPTR_ACCESS:%.*]] = begin_access [read] [unsafe] [[PIPTR]]
688+
// CHECK-NEXT: {{.*}} = load [trivial] [[PIPTR_ACCESS]] : $*Double
682689
// CHECK: return
683690
}
684691

test/SILGen/reabstract-tuple.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ class Box<T> {
2727
// CHECK: [[CALL:%.*]] = apply [[INIT_F]]<(Int, () -> ())>(%{{.*}}, %{{.*}}) : $@convention(method) <τ_0_0> (@in τ_0_0, @thick Box<τ_0_0>.Type) -> @owned Box<τ_0_0>
2828
// CHECK: [[BORROW_CALL:%.*]] = begin_borrow [[CALL]] : $Box<(Int, () -> ())>
2929
// CHECK: [[REF:%.*]] = ref_element_addr [[BORROW_CALL]] : $Box<(Int, () -> ())>, #Box.value
30-
// CHECK: [[TUPLEC:%.*]] = load [copy] [[REF]] : $*(Int, @callee_guaranteed () -> @out ())
30+
// CHECK: [[REF_ACCESS:%.*]] = begin_access [read] [unsafe] [[REF]]
31+
// CHECK: [[TUPLEC:%.*]] = load [copy] [[REF_ACCESS]] : $*(Int, @callee_guaranteed () -> @out ())
3132
// CHECK: ([[TUPLEC_0:%.*]], [[TUPLEC_1:%.*]]) = destructure_tuple [[TUPLEC]]
3233
// CHECK: [[THUNK2:%.*]] = function_ref @$sytIegr_Ieg_TR : $@convention(thin) (@guaranteed @callee_guaranteed () -> @out ()) -> ()
3334
// CHECK: [[PA2:%.*]] = partial_apply [callee_guaranteed] [[THUNK2]]([[TUPLEC_1]]) : $@convention(thin) (@guaranteed @callee_guaranteed () -> @out ()) -> ()
35+
// CHECK: end_access [[REF_ACCESS]]
3436
// CHECK: destroy_value [[PA2]] : $@callee_guaranteed () -> ()
3537
// CHECK: end_borrow [[BORROW_CALL]] : $Box<(Int, () -> ())>
3638
// CHECK-LABEL: } // end sil function '$s4main7testBoxyyF'

test/SILGen/super_init_refcounting.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,17 @@ class Good: Foo {
7878
// CHECK: store %0 to [init] [[PB_SELF_BOX]]
7979
// CHECK: [[SELF_OBJ:%.*]] = load_borrow [[PB_SELF_BOX]]
8080
// CHECK: [[X_ADDR:%.*]] = ref_element_addr [[SELF_OBJ]] : $Good, #Good.x
81-
// CHECK: assign {{.*}} to [[X_ADDR]] : $*Int
81+
// CHECK: [[X_ADDR_ACCESS:%.*]] = begin_access [modify] [unsafe] [[X_ADDR]]
82+
// CHECK: assign {{.*}} to [[X_ADDR_ACCESS]] : $*Int
83+
// CHECK: end_access [[X_ADDR_ACCESS]]
8284
// CHECK: [[SELF_OBJ:%.*]] = load [take] [[PB_SELF_BOX]] : $*Good
8385
// CHECK: [[SUPER_OBJ:%.*]] = upcast [[SELF_OBJ]] : $Good to $Foo
8486
// CHECK: [[BORROWED_SUPER:%.*]] = begin_borrow [[SUPER_OBJ]]
8587
// CHECK: [[DOWNCAST_BORROWED_SUPER:%.*]] = unchecked_ref_cast [[BORROWED_SUPER]] : $Foo to $Good
8688
// CHECK: [[X_ADDR:%.*]] = ref_element_addr [[DOWNCAST_BORROWED_SUPER]] : $Good, #Good.x
87-
// CHECK: [[X:%.*]] = load [trivial] [[X_ADDR]] : $*Int
89+
// CHECK: [[X_ADDR_ACCESS:%.*]] = begin_access [read] [unsafe] [[X_ADDR]]
90+
// CHECK: [[X:%.*]] = load [trivial] [[X_ADDR_ACCESS]] : $*Int
91+
// CHECK: end_access [[X_ADDR_ACCESS]]
8892
// CHECK: end_borrow [[BORROWED_SUPER]]
8993
// CHECK: [[SUPER_INIT:%.*]] = function_ref @$s22super_init_refcounting3FooCyACSicfc : $@convention(method) (Int, @owned Foo) -> @owned Foo
9094
// CHECK: apply [[SUPER_INIT]]([[X]], [[SUPER_OBJ]])

test/SILGen/unowned.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,9 +138,10 @@ class TestUnownedMember {
138138
// CHECK: [[BORROWED_ARG1:%.*]] = begin_borrow [[ARG1]]
139139
// CHECK: [[ARG1_COPY:%.*]] = copy_value [[BORROWED_ARG1]]
140140
// CHECK: [[FIELDPTR:%.*]] = ref_element_addr [[BORROWED_SELF]] : $TestUnownedMember, #TestUnownedMember.member
141+
// CHECK: [[FIELDPTR_ACCESS:%.*]] = begin_access [modify] [unsafe] [[FIELDPTR]]
141142
// CHECK: [[INVAL:%.*]] = ref_to_unowned [[ARG1_COPY]] : $C to $@sil_unowned C
142143
// CHECK: [[INVAL_COPY:%.*]] = copy_value [[INVAL]] : $@sil_unowned C
143-
// CHECK: assign [[INVAL_COPY]] to [[FIELDPTR]] : $*@sil_unowned C
144+
// CHECK: assign [[INVAL_COPY]] to [[FIELDPTR_ACCESS]] : $*@sil_unowned C
144145
// CHECK: destroy_value [[ARG1_COPY]] : $C
145146
// CHECK: end_borrow [[BORROWED_ARG1]]
146147
// CHECK: end_borrow [[BORROWED_SELF]]

test/SILOptimizer/definite_init_failable_initializers_objc.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,9 @@ class Cat : FakeNSObject {
4242
// CHECK-NEXT: [[SELF_BOX:%.*]] = alloc_stack $Cat
4343
// CHECK: store [[ARG2]] to [[SELF_BOX]] : $*Cat
4444
// CHECK: [[FIELD_ADDR:%.*]] = ref_element_addr [[ARG2]] : $Cat, #Cat.x
45-
// CHECK-NEXT: store {{%.*}} to [[FIELD_ADDR]] : $*LifetimeTracked
45+
// CHECK-NEXT: [[FIELD_ADDR_ACCESS:%.*]] = begin_access [modify] [unsafe] [[FIELD_ADDR]]
46+
// CHECK-NEXT: store {{%.*}} to [[FIELD_ADDR_ACCESS]] : $*LifetimeTracked
47+
// CHECK-NEXT: end_access [[FIELD_ADDR_ACCESS]]
4648
// CHECK-NEXT: strong_release [[ARG2]]
4749
// CHECK-NEXT: [[COND:%.*]] = struct_extract %1 : $Bool, #Bool._value
4850
// CHECK-NEXT: cond_br [[COND]], bb1, bb2

0 commit comments

Comments
 (0)