Skip to content

Commit 68c1e54

Browse files
authored
Merge pull request #78247 from atrick/unsafeaddress_markdep
SILGen: emit mark_dependence for unsafeAddress
2 parents 4666a41 + 30d81c9 commit 68c1e54

File tree

10 files changed

+258
-30
lines changed

10 files changed

+258
-30
lines changed

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/LifetimeDependenceDiagnostics.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ let lifetimeDependenceDiagnosticsPass = FunctionPass(
6161
if let markDep = instruction as? MarkDependenceInst, markDep.isUnresolved {
6262
if let lifetimeDep = LifetimeDependence(markDep, context) {
6363
if analyze(dependence: lifetimeDep, context) {
64-
// Note: This promotes the mark_dependence flag but does not invalidate SIL; preserving analyses is good,
65-
// but the change won't appear in -sil-print-function. Ideally, we could notify context of a flag change
64+
// Note: This promotes the mark_dependence flag but does not invalidate analyses; preserving analyses is good,
65+
// although the change won't appear in -sil-print-function. Ideally, we could notify context of a flag change
6666
// without invalidating analyses.
6767
lifetimeDep.resolve(context)
6868
continue

lib/SILGen/SILGenApply.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7304,22 +7304,32 @@ ManagedValue SILGenFunction::emitAddressorAccessor(
73047304
emission.apply().getAll(results);
73057305

73067306
assert(results.size() == 1);
7307-
auto pointer = results[0].getUnmanagedValue();
7307+
auto result = results[0].getUnmanagedValue();
73087308

73097309
// Drill down to the raw pointer using intrinsic knowledge of those types.
73107310
auto pointerType =
7311-
pointer->getType().castTo<BoundGenericStructType>()->getDecl();
7311+
result->getType().castTo<BoundGenericStructType>()->getDecl();
73127312
auto props = pointerType->getStoredProperties();
73137313
assert(props.size() == 1);
73147314
VarDecl *rawPointerField = props[0];
7315-
pointer = B.createStructExtract(loc, pointer, rawPointerField,
7316-
SILType::getRawPointerType(getASTContext()));
7315+
auto rawPointer =
7316+
B.createStructExtract(loc, result, rawPointerField,
7317+
SILType::getRawPointerType(getASTContext()));
73177318

73187319
// Convert to the appropriate address type and return.
7319-
SILValue address = B.createPointerToAddress(loc, pointer, addressType,
7320+
SILValue address = B.createPointerToAddress(loc, rawPointer, addressType,
73207321
/*isStrict*/ true,
73217322
/*isInvariant*/ false);
7322-
7323+
// Create a dependency on self: the pointer is only valid as long as self is
7324+
// alive.
7325+
auto apply = cast<ApplyInst>(result);
7326+
// global addressors don't have a source value. Presumably, the addressor
7327+
// is the only way to get at them.
7328+
if (apply->hasSelfArgument()) {
7329+
auto selfSILValue = apply->getSelfArgument();
7330+
address = B.createMarkDependence(loc, address, selfSILValue,
7331+
MarkDependenceKind::Unresolved);
7332+
}
73237333
return ManagedValue::forLValue(address);
73247334
}
73257335

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// RUN: %target-swift-emit-silgen %s | %FileCheck %s
2+
3+
public class C {}
4+
5+
public struct BoxC {
6+
let storage: AnyObject?
7+
let pointer: UnsafePointer<C>
8+
9+
subscript() -> C {
10+
unsafeAddress {
11+
pointer
12+
}
13+
}
14+
}
15+
16+
// The addressor result must explicitly dependend on the apply's 'self' arg.
17+
//
18+
// CHECK-LABEL: sil [ossa] @$s20addressor_dependence21testAddressorLifetime3boxAA1CCAA4BoxCVn_tF : $@convention(thin) (@owned BoxC) -> @owned C {
19+
// CHECK: bb0(%0 : @noImplicitCopy @_eagerMove @owned $BoxC):
20+
// CHECK: [[MV:%.*]] = moveonlywrapper_to_copyable [guaranteed]
21+
// CHECK: [[APPLY:%.*]] = apply %{{.*}}([[MV]]) : $@convention(method) (@guaranteed BoxC) -> UnsafePointer<C>
22+
// CHECK: [[P:%.*]] = struct_extract [[APPLY]], #UnsafePointer._rawValue
23+
// CHECK: [[A:%.*]] = pointer_to_address [[P]] to [strict] $*C
24+
// CHECK: [[MD:%.*]] = mark_dependence [unresolved] [[A]] on [[MV]]
25+
// CHECK: begin_access [read] [unsafe] [[MD]]
26+
// CHECK-LABEL: } // end sil function '$s20addressor_dependence21testAddressorLifetime3boxAA1CCAA4BoxCVn_tF'
27+
public func testAddressorLifetime(box: consuming BoxC) -> C {
28+
box[]
29+
}

test/SILGen/addressors.swift

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,13 @@ func test0() {
5555
// CHECK: store [[AVAL]] to [[A]]
5656
var a = A()
5757

58+
// CHECK: [[ACCESS:%.*]] = begin_access [read] [static] [[A]] : $*A
5859
// CHECK: [[T0:%.*]] = function_ref @$s10addressors1AVys5Int32VAEcilu :
5960
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[AVAL]])
6061
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafePointer<Int32>, #UnsafePointer._rawValue
6162
// CHECK: [[T3:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*Int32
62-
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unsafe] [[T3]] : $*Int32
63+
// CHECK: [[MD:%.*]] = mark_dependence [nonescaping] [[T3]] : $*Int32 on [[ACCESS]] : $*A
64+
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unsafe] [[MD]] : $*Int32
6365
// CHECK: [[Z:%.*]] = load [[ACCESS]] : $*Int32
6466
let z = a[10]
6567

@@ -68,7 +70,8 @@ func test0() {
6870
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[WRITE]])
6971
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafeMutablePointer<Int32>, #UnsafeMutablePointer._rawValue
7072
// CHECK: [[T3:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*Int32
71-
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[T3]] : $*Int32
73+
// CHECK: [[MD:%.*]] = mark_dependence [nonescaping] [[T3]] : $*Int32 on [[WRITE]] : $*A
74+
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[MD]] : $*Int32
7275
// CHECK: load
7376
// CHECK: sadd_with_overflow_Int{{32|64}}
7477
// CHECK: store {{%.*}} to [[ACCESS]]
@@ -79,7 +82,8 @@ func test0() {
7982
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[WRITE]])
8083
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafeMutablePointer<Int32>, #UnsafeMutablePointer._rawValue
8184
// CHECK: [[T3:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*Int32
82-
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[T3]] : $*Int32
85+
// CHECK: [[MD:%.*]] = mark_dependence [nonescaping] [[T3]] : $*Int32 on [[WRITE]] : $*A
86+
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[MD]] : $*Int32
8387
// CHECK: store {{%.*}} to [[ACCESS]]
8488
a[3] = 6
8589
}
@@ -93,7 +97,8 @@ func test1() -> Int32 {
9397
// CHECK: [[PTR:%.*]] = apply [[ACCESSOR]]({{%.*}}, [[A]]) : $@convention(method) (Int32, A) -> UnsafePointer<Int32>
9498
// CHECK: [[T0:%.*]] = struct_extract [[PTR]] : $UnsafePointer<Int32>, #UnsafePointer._rawValue
9599
// CHECK: [[T1:%.*]] = pointer_to_address [[T0]] : $Builtin.RawPointer to [strict] $*Int32
96-
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unsafe] [[T1]] : $*Int32
100+
// CHECK: [[MD:%.*]] = mark_dependence [nonescaping] [[T1]] : $*Int32 on [[A]] : $A
101+
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unsafe] [[MD]] : $*Int32
97102
// CHECK: [[T2:%.*]] = load [[ACCESS]] : $*Int32
98103
// CHECK: return [[T2]] : $Int32
99104
return A()[0]
@@ -147,7 +152,8 @@ struct B : Subscriptable {
147152
// CHECK: [[PTR:%.*]] = apply [[T0]]([[INDEX]], [[WRITE]])
148153
// CHECK: [[T0:%.*]] = struct_extract [[PTR]] : $UnsafeMutablePointer<Int32>,
149154
// CHECK: [[ADDR:%.*]] = pointer_to_address [[T0]] : $Builtin.RawPointer to [strict] $*Int32
150-
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[ADDR]] : $*Int32
155+
// CHECK: [[MD:%.*]] = mark_dependence [nonescaping] [[ADDR]] : $*Int32 on [[WRITE]] : $*B
156+
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[MD]] : $*Int32
151157
// Accept either of struct_extract+load or load+struct_element_addr.
152158
// CHECK: load
153159
// CHECK: [[T1:%.*]] = builtin "or_Int32"
@@ -176,7 +182,8 @@ func test_carray(_ array: inout CArray<(Int32) -> Int32>) -> Int32 {
176182
// CHECK: [[T1:%.*]] = apply [[T0]]<(Int32) -> Int32>({{%.*}}, [[WRITE]])
177183
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafeMutablePointer<(Int32) -> Int32>, #UnsafeMutablePointer._rawValue
178184
// CHECK: [[T3:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*@callee_guaranteed @substituted <τ_0_0, τ_0_1> (@in_guaranteed τ_0_0) -> @out τ_0_1 for <Int32, Int32>
179-
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[T3]]
185+
// CHECK: [[MD:%.*]] = mark_dependence [nonescaping] [[T3]] : $*@callee_guaranteed @substituted <τ_0_0, τ_0_1> (@in_guaranteed τ_0_0) -> @out τ_0_1 for <Int32, Int32> on [[WRITE]] : $*CArray<(Int32) -> Int32>
186+
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[MD]]
180187
// CHECK: store {{%.*}} to [[ACCESS]] :
181188
array[0] = id_int
182189

@@ -186,7 +193,9 @@ func test_carray(_ array: inout CArray<(Int32) -> Int32>) -> Int32 {
186193
// CHECK: [[T2:%.*]] = apply [[T1]]<(Int32) -> Int32>({{%.*}}, [[T0]])
187194
// CHECK: [[T3:%.*]] = struct_extract [[T2]] : $UnsafePointer<(Int32) -> Int32>, #UnsafePointer._rawValue
188195
// CHECK: [[T4:%.*]] = pointer_to_address [[T3]] : $Builtin.RawPointer to [strict] $*@callee_guaranteed @substituted <τ_0_0, τ_0_1> (@in_guaranteed τ_0_0) -> @out τ_0_1 for <Int32, Int32>
189-
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unsafe] [[T4]]
196+
// CHECK: [[MD:%.*]] = mark_dependence [nonescaping] [[T4]] : $*@callee_guaranteed @substituted <τ_0_0, τ_0_1>
197+
// (@in_guaranteed τ_0_0) -> @out τ_0_1 for <Int32, Int32> on [[T0]] : $CArray<(Int32) -> Int32>
198+
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unsafe] [[MD]]
190199
// CHECK: [[T5:%.*]] = load [[ACCESS]]
191200
return array[1](5)
192201
}
@@ -209,7 +218,8 @@ struct D : Subscriptable {
209218
// SILGEN: [[PTR:%.*]] = apply [[T0]]([[I]], [[ACCESS]])
210219
// SILGEN: [[T0:%.*]] = struct_extract [[PTR]] : $UnsafeMutablePointer<Int32>,
211220
// SILGEN: [[ADDR:%.*]] = pointer_to_address [[T0]] : $Builtin.RawPointer to [strict] $*Int32
212-
// SILGEN: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[ADDR]] : $*Int32
221+
// SILGEN: [[MD:%.*]] = mark_dependence [unresolved] [[ADDR]] : $*Int32 on %6 : $*D
222+
// SILGEN: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[MD]] : $*Int32
213223
// SILGEN: assign [[VALUE]] to [[ACCESS]] : $*Int32
214224

215225
// SILGEN-LABEL: sil hidden [transparent] [ossa] @$s10addressors1DVys5Int32VAEciM
@@ -219,7 +229,8 @@ struct D : Subscriptable {
219229
// SILGEN: [[PTR:%.*]] = apply [[T0]]([[I]], [[SELF_ACCESS]])
220230
// SILGEN: [[ADDR_TMP:%.*]] = struct_extract [[PTR]] : $UnsafeMutablePointer<Int32>,
221231
// SILGEN: [[ADDR:%.*]] = pointer_to_address [[ADDR_TMP]]
222-
// SILGEN: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[ADDR]]
232+
// SILGEN: [[MD:%.*]] = mark_dependence [unresolved] [[ADDR]] : $*Int32 on [[SELF_ACCESS]] : $*D
233+
// SILGEN: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[MD]]
223234
// SILGEN: yield [[ACCESS]]
224235
// SILGEN: end_access [[ACCESS]]
225236

@@ -236,7 +247,8 @@ func test_d(_ array: inout D) -> Int32 {
236247
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[WRITE]])
237248
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafeMutablePointer<Int32>,
238249
// CHECK: [[ADDR:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*Int32
239-
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[ADDR]] : $*Int32
250+
// CHECK: [[MD:%.*]] = mark_dependence [nonescaping] [[ADDR]] : $*Int32 on [[WRITE]] : $*D
251+
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[MD]] : $*Int32
240252
// CHECK: store [[V]] to [[ACCESS]] : $*Int32
241253
array[0] = make_int()
242254

@@ -245,7 +257,8 @@ func test_d(_ array: inout D) -> Int32 {
245257
// CHECK: [[T1:%.*]] = apply [[T0]]({{%.*}}, [[WRITE]])
246258
// CHECK: [[T2:%.*]] = struct_extract [[T1]] : $UnsafeMutablePointer<Int32>,
247259
// CHECK: [[ADDR:%.*]] = pointer_to_address [[T2]] : $Builtin.RawPointer to [strict] $*Int32
248-
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[ADDR]] : $*Int32
260+
// CHECK: [[MD:%.*]] = mark_dependence [nonescaping] [[ADDR]] : $*Int32 on [[WRITE]] : $*D
261+
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[MD]] : $*Int32
249262
// CHECK: [[FN:%.*]] = function_ref @$s10addressors14take_int_inoutyys5Int32VzF
250263
// CHECK: apply [[FN]]([[ACCESS]])
251264
take_int_inout(&array[1])
@@ -271,7 +284,8 @@ struct E {
271284
// CHECK: [[T1:%.*]] = apply [[T0]]([[E]])
272285
// CHECK: [[T2:%.*]] = struct_extract [[T1]]
273286
// CHECK: [[T3:%.*]] = pointer_to_address [[T2]]
274-
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[T3]] : $*Int32
287+
// CHECK: [[MD:%.*]] = mark_dependence [nonescaping] [[T3]] : $*Int32 on %0 : $E
288+
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[MD]] : $*Int32
275289
// CHECK: store {{%.*}} to [[ACCESS]] : $*Int32
276290
func test_e(_ e: E) {
277291
e.value = 0

test/SILGen/borrow_from_load_expr.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ public struct FA<T> {
1616
// CHECK: [[POINTER:%[^,]+]] = apply [[ADDRESSOR]]
1717
// CHECK: [[RAW_POINTER:%[^,]+]] = struct_extract [[POINTER]]
1818
// CHECK: [[ADDR:%[^,]+]] = pointer_to_address [[RAW_POINTER]]
19-
// CHECK: [[ACCESS:%[^,]+]] = begin_access [read] [unsafe] [[ADDR]]
19+
// CHECK: [[MD:%.*]] = mark_dependence [unresolved] [[ADDR]] : $*T
20+
// CHECK: [[ACCESS:%[^,]+]] = begin_access [read] [unsafe] [[MD]]
2021
// Verify that no spurious temporary is emitted.
2122
// CHECK-NOT: alloc_stack
2223
// CHECK: yield [[ACCESS]] : $*T, resume [[SUCCESS:bb[0-9]+]], unwind [[FAILURE:bb[0-9]+]]

test/SILGen/moveonly_subscript_addressor.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ func load(b: UnsafeMutableBufferPointer<Foo>) -> Int {
1212
// Ensure the borrowing invocation of `load` happens within the access to
1313
// the pointed-at memory.
1414
// CHECK: [[PTR:%.*]] = pointer_to_address
15-
// CHECK: [[BEGIN:%.*]] = begin_access [read] [unsafe] [[PTR]]
15+
// CHECK: [[MD:%.*]] = mark_dependence [unresolved] [[PTR]] on %0
16+
// CHECK: [[BEGIN:%.*]] = begin_access [read] [unsafe] [[MD]]
1617
// CHECK: [[FN:%.*]] = function_ref @load
1718
// CHECK: apply [[FN]]
1819
// CHECK: end_access [[BEGIN]]

test/SILGen/read_requirements.swift

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,8 @@ public struct ImplAUnsafeAddressors : P1 {
11901190
// CHECK: [[UNSAFE_POINTER:%[^,]+]] = apply [[UNSAFE_ADDRESSOR]]([[SELF]])
11911191
// CHECK: [[RAW_POINTER:%[^,]+]] = struct_extract [[UNSAFE_POINTER]] : $UnsafePointer<U>, #UnsafePointer._rawValue
11921192
// CHECK: [[ADDR:%[^,]+]] = pointer_to_address [[RAW_POINTER]]
1193-
// CHECK: [[ACCESS_UNCHECKED:%[^,]+]] = begin_access [read] [unsafe] [[ADDR]]
1193+
// CHECK: [[MD:%.*]] = mark_dependence [unresolved] [[ADDR]] : $*U on [[SELF]]
1194+
// CHECK: [[ACCESS_UNCHECKED:%[^,]+]] = begin_access [read] [unsafe] [[MD]]
11941195
// CHECK: [[ACCESS:%[^,]+]] = mark_unresolved_non_copyable_value [no_consume_or_assign] [[ACCESS_UNCHECKED]]
11951196
// CHECK: [[VALUE:%[^,]+]] = load [copy] [[ACCESS]]
11961197
// CHECK: yield [[VALUE]]
@@ -1213,7 +1214,8 @@ public struct ImplAUnsafeAddressors : P1 {
12131214
// CHECK: [[UNSAFE_POINTER:%[^,]+]] = apply [[UNSAFE_ADDRESSOR]]([[SELF]])
12141215
// CHECK: [[RAW_POINTER:%[^,]+]] = struct_extract [[UNSAFE_POINTER]] : $UnsafePointer<U>, #UnsafePointer._rawValue
12151216
// CHECK: [[ADDR:%[^,]+]] = pointer_to_address [[RAW_POINTER]]
1216-
// CHECK: [[ACCESS_UNCHECKED:%[^,]+]] = begin_access [read] [unsafe] [[ADDR]]
1217+
// CHECK: [[MD:%.*]] = mark_dependence [unresolved] [[ADDR]] : $*U on [[SELF]]
1218+
// CHECK: [[ACCESS_UNCHECKED:%[^,]+]] = begin_access [read] [unsafe] [[MD]]
12171219
// CHECK: [[ACCESS:%[^,]+]] = mark_unresolved_non_copyable_value [no_consume_or_assign] [[ACCESS_UNCHECKED]]
12181220
// CHECK: [[VALUE:%[^,]+]] = load [copy] [[ACCESS]]
12191221
// CHECK: yield [[VALUE]]
@@ -1299,7 +1301,8 @@ public struct ImplBUnsafeAddressors : P2 {
12991301
// CHECK: [[RAW_POINTER:%[^,]+]] = struct_extract [[UNSAFE_POINTER]]
13001302
// CHECK: #UnsafePointer._rawValue
13011303
// CHECK: [[ADDR:%[^,]+]] = pointer_to_address [[RAW_POINTER]]
1302-
// CHECK: [[ACCESS_UNCHECKED:%[^,]+]] = begin_access [read] [unsafe] [[ADDR]]
1304+
// CHECK: [[MD:%.*]] = mark_dependence [unresolved] [[ADDR]] : $*U on [[SELF]]
1305+
// CHECK: [[ACCESS_UNCHECKED:%[^,]+]] = begin_access [read] [unsafe] [[MD]]
13031306
// CHECK: [[ACCESS:%[^,]+]] = mark_unresolved_non_copyable_value [no_consume_or_assign] [[ACCESS_UNCHECKED]]
13041307
// CHECK: [[VALUE:%[^,]+]] = load [copy] [[ACCESS]]
13051308
// CHECK: yield [[VALUE]]
@@ -1368,7 +1371,8 @@ public struct ImplCUnsafeAddressors : P3 {
13681371
// CHECK: [[RAW_POINTER:%[^,]+]] = struct_extract [[UNSAFE_POINTER]]
13691372
// CHECK: #UnsafePointer._rawValue
13701373
// CHECK: [[ADDR:%[^,]+]] = pointer_to_address [[RAW_POINTER]]
1371-
// CHECK: [[ACCESS_UNCHECKED:%[^,]+]] = begin_access [read] [unsafe] [[ADDR]]
1374+
// CHECK: [[MD:%.*]] = mark_dependence [unresolved] [[ADDR]] : $*U on [[SELF]]
1375+
// CHECK: [[ACCESS_UNCHECKED:%[^,]+]] = begin_access [read] [unsafe] [[MD]]
13721376
// CHECK: [[ACCESS:%[^,]+]] = mark_unresolved_non_copyable_value [no_consume_or_assign] [[ACCESS_UNCHECKED]]
13731377
// CHECK: [[VALUE:%[^,]+]] = load [copy] [[ACCESS]]
13741378
// CHECK: yield [[VALUE]]
@@ -1392,7 +1396,8 @@ public struct ImplCUnsafeAddressors : P3 {
13921396
// CHECK: [[RAW_POINTER:%[^,]+]] = struct_extract [[UNSAFE_POINTER]]
13931397
// CHECK: #UnsafePointer._rawValue
13941398
// CHECK: [[ADDR:%[^,]+]] = pointer_to_address [[RAW_POINTER]]
1395-
// CHECK: [[ACCESS_UNCHECKED:%[^,]+]] = begin_access [read] [unsafe] [[ADDR]]
1399+
// CHECK: [[MD:%.*]] = mark_dependence [unresolved] [[ADDR]] : $*U on [[SELF]]
1400+
// CHECK: [[ACCESS_UNCHECKED:%[^,]+]] = begin_access [read] [unsafe] [[MD]]
13961401
// CHECK: [[ACCESS:%[^,]+]] = mark_unresolved_non_copyable_value [no_consume_or_assign] [[ACCESS_UNCHECKED]]
13971402
// CHECK: [[VALUE:%[^,]+]] = load [copy] [[ACCESS]]
13981403
// CHECK: yield [[VALUE]]

test/SILOptimizer/access_marker_verify.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,8 @@ func testAddressor(p: UnsafePointer<Int>) -> Int {
606606
// CHECK: apply
607607
// CHECK: struct_extract
608608
// CHECK: [[ADR:%.*]] = pointer_to_address
609-
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unsafe] [[ADR]] : $*Int
609+
// CHECK: [[MD:%.*]] = mark_dependence [unresolved] [[ADR]] : $*Int on %0 : $UnsafePointer<Int>
610+
// CHECK: [[ACCESS:%.*]] = begin_access [read] [unsafe] [[MD]] : $*Int
610611
// CHECK: load [trivial] [[ACCESS]] : $*Int
611612
// CHECK: return
612613
// CHECK-LABEL: } // end sil function '$s20access_marker_verify13testAddressor1pSiSPySiG_tF'
@@ -1021,7 +1022,8 @@ func testPointerInit(x: Int, y: UnsafeMutablePointer<Int>) {
10211022
// CHECK: [[POINTEE:%.*]] = apply %{{.*}}<Int>(%1) : $@convention(method) <τ_0_0 where τ_0_0 : ~Copyable> (UnsafeMutablePointer<τ_0_0>) -> UnsafeMutablePointer<τ_0_0>
10221023
// CHECK: [[RAWPTR:%.*]] = struct_extract [[POINTEE]] : $UnsafeMutablePointer<Int>, #UnsafeMutablePointer._rawValue
10231024
// CHECK: [[ADR:%.*]] = pointer_to_address [[RAWPTR]] : $Builtin.RawPointer to [strict] $*Int
1024-
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[ADR]] : $*Int
1025+
// CHECK: [[MD:%.*]] = mark_dependence [unresolved] [[ADR]] : $*Int on %1 : $UnsafeMutablePointer<Int> // user: %9
1026+
// CHECK: [[ACCESS:%.*]] = begin_access [modify] [unsafe] [[MD]] : $*Int
10251027
// CHECK: assign %0 to [[ACCESS]] : $*Int
10261028
// CHECK-LABEL: } // end sil function '$s20access_marker_verify15testPointerInit1x1yySi_SpySiGtF'
10271029

test/SILOptimizer/moveonly_unsafeAddress.sil

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ bb0(%0 : $*SNC):
4343
%6 = apply %5(%4) : $@convention(method) (@guaranteed SNC) -> UnsafePointer<NC>
4444
%7 = struct_extract %6 : $UnsafePointer<NC>, #UnsafePointer._rawValue
4545
%8 = pointer_to_address %7 : $Builtin.RawPointer to [strict] $*NC
46-
%9 = mark_dependence [unresolved] %8 : $*NC on %3 : $*SNC
46+
%9 = mark_dependence [nonescaping] %8 : $*NC on %3 : $*SNC
4747
%10 = begin_access [read] [unsafe] %9 : $*NC
4848
%11 = mark_unresolved_non_copyable_value [no_consume_or_assign] %10 : $*NC // expected-error {{'unknown' is borrowed and cannot be consumed}}
4949
%12 = load [copy] %11 : $*NC

0 commit comments

Comments
 (0)