Skip to content

Commit 05c501a

Browse files
committed
Add AddressOwnershipLiveRangeTest
1 parent 7cfe4a5 commit 05c501a

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

SwiftCompilerSources/Sources/Optimizer/Utilities/AddressUtils.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,3 +564,22 @@ extension AddressOwnershipLiveRange {
564564
return .local(allocation, range)
565565
}
566566
}
567+
568+
let addressOwnershipLiveRangeTest = FunctionTest("address_ownership_live_range") {
569+
function, arguments, context in
570+
let address = arguments.takeValue()
571+
print("Address: \(address)")
572+
print("Base: \(address.accessBase)")
573+
let begin = address.definingInstructionOrTerminator ?? {
574+
assert(address is FunctionArgument)
575+
return function.instructions.first!
576+
}()
577+
let localReachabilityCache = LocalVariableReachabilityCache()
578+
guard var ownershipRange = AddressOwnershipLiveRange.compute(for: address, at: begin,
579+
localReachabilityCache, context) else {
580+
print("Error: indeterminate live range")
581+
return
582+
}
583+
defer { ownershipRange.deinitialize() }
584+
print(ownershipRange)
585+
}

SwiftCompilerSources/Sources/Optimizer/Utilities/Test.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ public func registerOptimizerTests() {
154154
// Register each test.
155155
registerFunctionTests(
156156
getAccessBaseTest,
157+
addressOwnershipLiveRangeTest,
157158
argumentConventionsTest,
158159
borrowIntroducersTest,
159160
enclosingValuesTest,
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// RUN: %target-sil-opt -test-runner %s -o /dev/null 2>&1 | %FileCheck %s
2+
3+
sil_stage canonical
4+
5+
import Builtin
6+
7+
class C {}
8+
class D {
9+
var object: C
10+
}
11+
12+
// An address live range can be extended by a dependent value.
13+
//
14+
// CHECK-LABEL: testMarkDepAddressBase: address_ownership_live_range with: %f0
15+
// CHECK-NEXT: Address: [[F0:%.*]] = ref_element_addr %0 : $D, #D.object
16+
// CHECK-NEXT: Base: class - [[F0]] = ref_element_addr %0 : $D, #D.object
17+
// CHECK-NEXT: borrow: functionArgument(%0 = argument of bb0 : $D
18+
// CHECK-NEXT: begin: [[F0]] = ref_element_addr %0 : $D, #D.object
19+
// CHECK-NEXT: ends: end_borrow %{{.*}} : $C
20+
// CHECK-NEXT: exits:
21+
// CHECK-NEXT: interiors: %{{.*}} = load_borrow %{{.*}} : $*C
22+
// CHECK-NEXT: %{{.*}} = mark_dependence %{{.*}} : $*C on [[F0]] : $*C
23+
// CHECK-NEXT: [[F0]] = ref_element_addr %0 : $D, #D.object
24+
// CHECK-LABEL: end running test 1 of 1 on testMarkDepAddressBase: address_ownership_live_range with: %f0
25+
sil [ossa] @testMarkDepAddressBase : $@convention(thin) (@guaranteed D, @guaranteed D) -> () {
26+
bb0(%0 : @guaranteed $D, %1 : @guaranteed $D):
27+
%f0 = ref_element_addr %0 : $D, #D.object
28+
%f1 = ref_element_addr %1 : $D, #D.object
29+
specify_test "address_ownership_live_range %f0"
30+
%dependence = mark_dependence %f1 on %f0
31+
%load = load_borrow %dependence
32+
end_borrow %load
33+
%99 = tuple()
34+
return %99 : $()
35+
}

0 commit comments

Comments
 (0)