Skip to content

Commit 32263bb

Browse files
committed
ManualOwnership: add workaround for vars
For a proof-of-concept quality feature, we can just skip the pass causing problems until a proper solution is implemented.
1 parent 58a4a21 commit 32263bb

File tree

2 files changed

+49
-21
lines changed

2 files changed

+49
-21
lines changed

SwiftCompilerSources/Sources/Optimizer/FunctionPasses/RedundantLoadElimination.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ func eliminateRedundantLoads(in function: Function,
8989
variant: RedundantLoadEliminationVariant,
9090
_ context: FunctionPassContext) -> Bool
9191
{
92+
// FIXME: this skip is a hack for ManualOwnership prototyping, to workaround rdar://161359163
93+
if function.performanceConstraints == .manualOwnership && variant == .mandatory {
94+
return false
95+
}
96+
9297
// Avoid quadratic complexity by limiting the number of visited instructions.
9398
// This limit is sufficient for most "real-world" functions, by far.
9499
var complexityBudget = 50_000

test/SIL/manual_ownership.swift

Lines changed: 44 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,14 @@ func return_borrowed_fixed(_ t: borrowing Triangle) -> Triangle {
7272
return copy t
7373
}
7474

75-
// FIXME: copy propagation isn't able to simplify this. No copy should be required. (rdar://161359163)
75+
// FIXME: there's no workaround to this; it acts like a var so it's the same class of problem (rdar://161359163)
7676
@_manualOwnership
77-
func return_consumingParam(_ t: consuming Triangle) -> Triangle { // expected-error {{ownership of 't' is demanded and cannot not be consumed}}
78-
return t
77+
func return_consumingParam(_ t: consuming Triangle) -> Triangle {
78+
return t // expected-error {{ownership of 't' is demanded and cannot not be consumed}}
79+
}
80+
@_manualOwnership
81+
func return_consumingParam_no_workaround(_ t: consuming Triangle) -> Triangle {
82+
return copy t
7983
}
8084

8185
@_manualOwnership
@@ -172,24 +176,43 @@ func check_vars_fixed(_ t: Triangle, _ b: Bool) -> Triangle {
172176
// FIXME: var's still have some issues
173177
// (1) MandatoryRedundantLoadElimination introduces a 'copy_value' in place of a 'load [copy]' (rdar://161359163)
174178

175-
// @_manualOwnership
176-
// func reassignments_0() -> Triangle {
177-
// var t3 = Triangle()
178-
// t3 = Triangle()
179-
// return t3
180-
// }
181-
// @_manualOwnership
182-
// func reassignments_1() {
183-
// var t3 = Triangle()
184-
// t3 = Triangle()
185-
// t3.borrowing()
186-
// }
187-
// @_manualOwnership
188-
// func ressignments_2() {
189-
// var t3 = Triangle()
190-
// t3 = Triangle()
191-
// t3.consuming()
192-
// }
179+
@_manualOwnership
180+
func reassignments_0() -> Triangle {
181+
var t3 = Triangle()
182+
t3 = Triangle()
183+
return t3 // expected-error {{ownership of 't3' is demanded}}
184+
}
185+
@_manualOwnership
186+
func reassignments_0_fixed_1() -> Triangle {
187+
var t3 = Triangle()
188+
t3 = Triangle()
189+
return copy t3
190+
}
191+
@_manualOwnership
192+
func reassignments_0_fixed_2() -> Triangle {
193+
var t3 = Triangle()
194+
t3 = Triangle()
195+
return consume t3
196+
}
197+
198+
@_manualOwnership
199+
func reassignments_1() {
200+
var t3 = Triangle()
201+
t3 = Triangle()
202+
t3.borrowing() // expected-error {{accessing 't3' produces a copy of it}}
203+
}
204+
@_manualOwnership
205+
func reassignments_1_fixed_1() {
206+
var t3 = Triangle()
207+
t3 = Triangle()
208+
(copy t3).borrowing()
209+
}
210+
@_manualOwnership
211+
func reassignments_1_fixed_2() {
212+
var t3 = Triangle()
213+
t3 = Triangle()
214+
(consume t3).borrowing()
215+
}
193216

194217
@_manualOwnership
195218
public func basic_loop_trivial_values(_ t: Triangle, _ xs: [Triangle]) {

0 commit comments

Comments
 (0)