Skip to content

Commit 38d89f1

Browse files
authored
Merge pull request #81837 from atrick/builtin-addressof
LifetimeDependenceInsertion: allow dependency on Builtin.addressof()
2 parents 74e207b + 51090b6 commit 38d89f1

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/LifetimeDependenceInsertion.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,11 @@ struct VariableIntroducerUseDefWalker : LifetimeDependenceUseDefValueWalker, Lif
413413
}
414414

415415
mutating func introducer(_ value: Value, _ owner: Value?) -> WalkResult {
416+
if let addrToPtr = value as? AddressToPointerInst {
417+
// AddressToPointer introduces the value dependence. To handle Builtin.addressOfBorrow, follow the address that
418+
// the pointer is derived from.
419+
return walkUp(address: addrToPtr.address)
420+
}
416421
return visitorClosure(value)
417422
}
418423

test/SILOptimizer/lifetime_dependence/dependence_insertion.swift

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,39 @@ func bv_pointer_convert(p: UnsafePointer<Int>) -> BV {
8181
BV(p, 0)
8282
}
8383

84+
// =============================================================================
85+
// Builtin.addressOfBorrow
86+
// =============================================================================
87+
88+
// swift-frontend -emit-sil -enable-builtin-module -enable-experimental-feature LifetimeDependence -enable-experimental-feature AddressableParameters -Xllvm -sil-print-function=test ./dependsOnAddress.swift
89+
90+
import Builtin
91+
92+
struct IntHolder {
93+
var field: Int
94+
}
95+
96+
struct NERawPointer: ~Escapable {
97+
var p: Builtin.RawPointer
98+
}
99+
100+
@lifetime(borrow x)
101+
func pointerDepends(on x: Builtin.RawPointer) -> NERawPointer {
102+
NERawPointer(p: x)
103+
}
104+
105+
// CHECK-LABEL: sil hidden [ossa] @$s4test0A22BuiltinAddressOfBorrow6holderAA12NERawPointerVAA9IntHolderVz_tF : $@convention(thin) (@inout IntHolder) -> @lifetime(borrow 0) @owned NERawPointer {
106+
// CHECK: bb0(%0 : $*IntHolder):
107+
// CHECK: [[ACCESS:%[0-9]+]] = begin_access [read] [static] %0
108+
// CHECK: [[PTR:%[0-9]+]] = address_to_pointer [stack_protection] %2 to $Builtin.RawPointer
109+
// CHECK: [[NE:%[0-9]+]] = apply %{{.*}}([[PTR]]) : $@convention(thin) (Builtin.RawPointer) -> @lifetime(borrow 0) @owned NERawPointer
110+
// CHECK: mark_dependence [unresolved] [[NE]] on %0
111+
// CHECK-LABEL: } // end sil function '$s4test0A22BuiltinAddressOfBorrow6holderAA12NERawPointerVAA9IntHolderVz_tF'
112+
@lifetime(borrow holder)
113+
func testBuiltinAddressOfBorrow(holder: inout IntHolder) -> NERawPointer {
114+
pointerDepends(on: Builtin.addressOfBorrow(holder))
115+
}
116+
84117
// =============================================================================
85118
// @_addressableForDependencies
86119
// =============================================================================

0 commit comments

Comments
 (0)