Skip to content

Commit 1c74c7f

Browse files
Merge pull request #29226 from aschwaighofer/revert_silgen_ref_elt_addr
Revert "[silgen] When SILGenLValue accesses ref_elt_addr, emit unsafe…
2 parents 4cf5c2e + 8ed908f commit 1c74c7f

8 files changed

+23
-47
lines changed

lib/SILGen/SILGenLValue.cpp

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

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);
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+
}
752749
}
753750

754751
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: [[ADR_ACCESS:%.*]] = begin_access [read] [unsafe] [[ADR]]
128-
// CHECK: %{{.*}} = load [trivial] [[ADR_ACCESS]] : $*Int
129-
// CHECK: end_access [[ADR_ACCESS]]
127+
// CHECK-NOT: begin_access
128+
// CHECK: %{{.*}} = load [trivial] [[ADR]] : $*Int
129+
// CHECK-NOT: end_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: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -451,14 +451,11 @@ 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_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]]
454+
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR]]
457455
// CHECK-NEXT: [[KRAKEN_METH:%.*]] = class_method [[KRAKEN]]
458456
// CHECK-NEXT: apply [[KRAKEN_METH]]([[KRAKEN]])
459457
// CHECK: [[KRAKEN_ADDR:%.*]] = ref_element_addr [[CLS]] : $LetFieldClass, #LetFieldClass.letk
460-
// CHECK-NEXT: [[KRAKEN_ADDR_ACCESS:%.*]] = begin_access [read] [unsafe] [[KRAKEN_ADDR]]
461-
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR_ACCESS]]
458+
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR]]
462459
// CHECK: [[REBORROWED_KRAKEN:%.*]] = begin_borrow [[KRAKEN]]
463460
// CHECK: [[DESTROY_SHIP_FUN:%.*]] = function_ref @$s15guaranteed_self11destroyShipyyAA6KrakenCF : $@convention(thin) (@guaranteed Kraken) -> ()
464461
// CHECK-NEXT: apply [[DESTROY_SHIP_FUN]]([[REBORROWED_KRAKEN]])
@@ -467,9 +464,7 @@ class LetFieldClass {
467464
// CHECK-NEXT: [[KRAKEN_BOX:%.*]] = alloc_box ${ var Kraken }
468465
// CHECK-NEXT: [[PB:%.*]] = project_box [[KRAKEN_BOX]]
469466
// CHECK-NEXT: [[KRAKEN_ADDR:%.*]] = ref_element_addr [[CLS]] : $LetFieldClass, #LetFieldClass.letk
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]]
467+
// CHECK-NEXT: [[KRAKEN:%.*]] = load [copy] [[KRAKEN_ADDR]]
473468
// CHECK-NEXT: store [[KRAKEN]] to [init] [[PB]]
474469
// CHECK-NEXT: [[READ:%.*]] = begin_access [read] [unknown] [[PB]] : $*Kraken
475470
// CHECK-NEXT: [[KRAKEN_COPY:%.*]] = load [copy] [[READ]]

test/SILGen/properties.swift

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -616,9 +616,7 @@ 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: [[Z_ACCESS:%.*]] = begin_access [read] [unsafe] [[Z]]
620-
// CHECK: [[LOADED_Z:%.*]] = load [copy] [[Z_ACCESS]] : $*String
621-
// CHECK: end_access [[Z_ACCESS]]
619+
// CHECK: [[LOADED_Z:%.*]] = load [copy] [[Z]] : $*String
622620
// CHECK: destroy_value [[LOADED_Z]]
623621
// CHECK-NOT: destroy_value [[ARG]]
624622
let _ = x.z
@@ -628,8 +626,7 @@ func genericProps(_ x: GenericClass<String>) {
628626
func genericPropsInGenericContext<U>(_ x: GenericClass<U>) {
629627
// CHECK: bb0([[ARG:%.*]] : @guaranteed $GenericClass<U>):
630628
// CHECK: [[Z:%.*]] = ref_element_addr [[ARG]] : $GenericClass<U>, #GenericClass.z
631-
// CHECK: [[Z_ACCESS:%.*]] = begin_access [read] [unsafe] [[Z]]
632-
// CHECK: copy_addr [[Z_ACCESS]] {{.*}} : $*U
629+
// CHECK: copy_addr [[Z]] {{.*}} : $*U
633630
let _ = x.z
634631
}
635632

@@ -645,9 +642,7 @@ class ClassWithLetProperty {
645642
// CHECK: bb0([[ARG:%.*]] : @guaranteed $ClassWithLetProperty):
646643
// CHECK-NEXT: debug_value
647644
// CHECK-NEXT: [[PTR:%[0-9]+]] = ref_element_addr [[ARG]] : $ClassWithLetProperty, #ClassWithLetProperty.p
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]]
645+
// CHECK-NEXT: [[VAL:%[0-9]+]] = load [trivial] [[PTR]] : $*Int
651646
// CHECK-NEXT: return [[VAL]] : $Int
652647

653648

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

681675
// CHECK-NOT: destroy_value
682676
// CHECK-NOT: copy_value
683677

684678
// Load of the pi field: no copy_values/releases.
685679
// CHECK: [[SELF:%[0-9]+]] = load_borrow [[PB_BOX]] : $*r19254812Derived
686680
// CHECK-NEXT: [[PIPTR:%[0-9]+]] = ref_element_addr [[SELF]] : $r19254812Derived, #r19254812Derived.pi
687-
// CHECK-NEXT: [[PIPTR_ACCESS:%.*]] = begin_access [read] [unsafe] [[PIPTR]]
688-
// CHECK-NEXT: {{.*}} = load [trivial] [[PIPTR_ACCESS]] : $*Double
681+
// CHECK-NEXT: {{.*}} = load [trivial] [[PIPTR]] : $*Double
689682
// CHECK: return
690683
}
691684

test/SILGen/reabstract-tuple.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,10 @@ 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: [[REF_ACCESS:%.*]] = begin_access [read] [unsafe] [[REF]]
31-
// CHECK: [[TUPLEC:%.*]] = load [copy] [[REF_ACCESS]] : $*(Int, @callee_guaranteed () -> @out ())
30+
// CHECK: [[TUPLEC:%.*]] = load [copy] [[REF]] : $*(Int, @callee_guaranteed () -> @out ())
3231
// CHECK: ([[TUPLEC_0:%.*]], [[TUPLEC_1:%.*]]) = destructure_tuple [[TUPLEC]]
3332
// CHECK: [[THUNK2:%.*]] = function_ref @$sytIegr_Ieg_TR : $@convention(thin) (@guaranteed @callee_guaranteed () -> @out ()) -> ()
3433
// CHECK: [[PA2:%.*]] = partial_apply [callee_guaranteed] [[THUNK2]]([[TUPLEC_1]]) : $@convention(thin) (@guaranteed @callee_guaranteed () -> @out ()) -> ()
35-
// CHECK: end_access [[REF_ACCESS]]
3634
// CHECK: destroy_value [[PA2]] : $@callee_guaranteed () -> ()
3735
// CHECK: end_borrow [[BORROW_CALL]] : $Box<(Int, () -> ())>
3836
// CHECK-LABEL: } // end sil function '$s4main7testBoxyyF'

test/SILGen/super_init_refcounting.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,13 @@ 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: [[X_ADDR_ACCESS:%.*]] = begin_access [modify] [unsafe] [[X_ADDR]]
82-
// CHECK: assign {{.*}} to [[X_ADDR_ACCESS]] : $*Int
83-
// CHECK: end_access [[X_ADDR_ACCESS]]
81+
// CHECK: assign {{.*}} to [[X_ADDR]] : $*Int
8482
// CHECK: [[SELF_OBJ:%.*]] = load [take] [[PB_SELF_BOX]] : $*Good
8583
// CHECK: [[SUPER_OBJ:%.*]] = upcast [[SELF_OBJ]] : $Good to $Foo
8684
// CHECK: [[BORROWED_SUPER:%.*]] = begin_borrow [[SUPER_OBJ]]
8785
// CHECK: [[DOWNCAST_BORROWED_SUPER:%.*]] = unchecked_ref_cast [[BORROWED_SUPER]] : $Foo to $Good
8886
// CHECK: [[X_ADDR:%.*]] = ref_element_addr [[DOWNCAST_BORROWED_SUPER]] : $Good, #Good.x
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]]
87+
// CHECK: [[X:%.*]] = load [trivial] [[X_ADDR]] : $*Int
9288
// CHECK: end_borrow [[BORROWED_SUPER]]
9389
// CHECK: [[SUPER_INIT:%.*]] = function_ref @$s22super_init_refcounting3FooCyACSicfc : $@convention(method) (Int, @owned Foo) -> @owned Foo
9490
// CHECK: apply [[SUPER_INIT]]([[X]], [[SUPER_OBJ]])

test/SILGen/unowned.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,9 @@ 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]]
142141
// CHECK: [[INVAL:%.*]] = ref_to_unowned [[ARG1_COPY]] : $C to $@sil_unowned C
143142
// CHECK: [[INVAL_COPY:%.*]] = copy_value [[INVAL]] : $@sil_unowned C
144-
// CHECK: assign [[INVAL_COPY]] to [[FIELDPTR_ACCESS]] : $*@sil_unowned C
143+
// CHECK: assign [[INVAL_COPY]] to [[FIELDPTR]] : $*@sil_unowned C
145144
// CHECK: destroy_value [[ARG1_COPY]] : $C
146145
// CHECK: end_borrow [[BORROWED_ARG1]]
147146
// CHECK: end_borrow [[BORROWED_SELF]]

test/SILOptimizer/definite_init_failable_initializers_objc.swift

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,7 @@ 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: [[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]]
45+
// CHECK-NEXT: store {{%.*}} to [[FIELD_ADDR]] : $*LifetimeTracked
4846
// CHECK-NEXT: strong_release [[ARG2]]
4947
// CHECK-NEXT: [[COND:%.*]] = struct_extract %1 : $Bool, #Bool._value
5048
// CHECK-NEXT: cond_br [[COND]], bb1, bb2

0 commit comments

Comments
 (0)