Skip to content

Commit 0f359ff

Browse files
committed
SideEffects: fix effects of indirect-in apply arguments
Indirect-in arguments are consumed by the caller and that not only counts as read but also as a write.
1 parent 4c49e00 commit 0f359ff

File tree

3 files changed

+44
-43
lines changed

3 files changed

+44
-43
lines changed

SwiftCompilerSources/Sources/SIL/Effects.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,7 +539,8 @@ public struct SideEffects : CustomStringConvertible, NoReflectionChildren {
539539
}
540540
switch convention {
541541
case .indirectIn, .packOwned:
542-
result.memory.write = false
542+
// indirect-in arguments are consumed by the caller and that not only counts as read but also as a write.
543+
break
543544
case .indirectInGuaranteed, .packGuaranteed:
544545
result.memory.write = false
545546
result.ownership.destroy = false

test/SILOptimizer/mem-behavior.sil

Lines changed: 39 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ class Parent {
2323
@_hasStorage var child: C { get set }
2424
}
2525

26-
sil @unknown_func : $@convention(thin) (Int32, @in Int32) -> ()
27-
sil @single_indirect_arg : $@convention(thin) (@in Int32) -> Int32
26+
sil @unknown_func : $@convention(thin) (Int32, @in_guaranteed Int32) -> ()
27+
sil @single_indirect_arg : $@convention(thin) (@in_guaranteed Int32) -> Int32
2828
sil @single_indirect_arg_and_error : $@convention(thin) (@in Int32) -> (Int32, @error Error)
2929
sil @single_indirect_arg_coroutine : $@yield_once @convention(thin) (@in Int32) -> @yields Int32
30-
sil @indirect_arg_and_ptr : $@convention(thin) (@in Int32, Builtin.RawPointer) -> Int32
30+
sil @indirect_arg_and_ptr : $@convention(thin) (@in_guaranteed Int32, Builtin.RawPointer) -> Int32
3131
sil @single_reference : $@convention(thin) (@guaranteed X) -> Int32
3232
sil @nouser_func : $@convention(thin) () -> ()
3333
sil @in_ptr : $@convention(thin) (@in Builtin.RawPointer) -> ()
@@ -70,17 +70,17 @@ bb0(%0 : $Builtin.RawPointer):
7070

7171
// CHECK-LABEL: @call_unknown_func
7272
// CHECK: PAIR #0.
73-
// CHECK-NEXT: %4 = apply %3(%0, %1) : $@convention(thin) (Int32, @in Int32) -> ()
74-
// CHECK-NEXT: %1 = argument of bb0 : $*Int32{{.*}} // user: %4
73+
// CHECK-NEXT: %4 = apply %3(%0, %1) : $@convention(thin) (Int32, @in_guaranteed Int32) -> ()
74+
// CHECK-NEXT: %1 = argument of bb0 : $*Int32{{.*}}
7575
// CHECK-NEXT: r=1,w=0
7676
// CHECK: PAIR #1.
77-
// CHECK-NEXT: %4 = apply %3(%0, %1) : $@convention(thin) (Int32, @in Int32) -> ()
77+
// CHECK-NEXT: %4 = apply %3(%0, %1) : $@convention(thin) (Int32, @in_guaranteed Int32) -> ()
7878
// CHECK-NEXT: %2 = argument of bb0 : $*Int32
7979
// CHECK-NEXT: r=0,w=0
8080
sil @call_unknown_func : $@convention(thin) (Int32, @in Int32, @in Int32) -> () {
8181
bb0(%0 : $Int32, %1 : $*Int32, %2 : $*Int32):
82-
%3 = function_ref @unknown_func : $@convention(thin) (Int32, @in Int32) -> ()
83-
%4 = apply %3(%0, %1) : $@convention(thin) (Int32, @in Int32) -> ()
82+
%3 = function_ref @unknown_func : $@convention(thin) (Int32, @in_guaranteed Int32) -> ()
83+
%4 = apply %3(%0, %1) : $@convention(thin) (Int32, @in_guaranteed Int32) -> ()
8484

8585
%r = tuple ()
8686
return %r : $()
@@ -231,72 +231,72 @@ bb0(%0 : $Int32):
231231

232232
// CHECK-LABEL: @allocstack_apply_read_only
233233
// CHECK: PAIR #1.
234-
// CHECK-NEXT: %4 = apply %3(%1) : $@convention(thin) (@in X) -> ()
235-
// CHECK-NEXT: %1 = alloc_stack $X{{.*}} // users: %5, %4, %2
234+
// CHECK-NEXT: %4 = apply %3(%1) : $@convention(thin) (@in_guaranteed X) -> ()
235+
// CHECK-NEXT: %1 = alloc_stack $X{{.*}}
236236
// CHECK-NEXT: r=1,w=0
237237
sil @allocstack_apply_read_only : $@convention(thin) (X) -> () {
238238
bb0(%0 : $X):
239239
%1 = alloc_stack $X
240240
store %0 to %1 : $*X
241-
%3 = function_ref @load_from_in : $@convention(thin) (@in X) -> ()
242-
%4 = apply %3(%1) : $@convention(thin) (@in X) -> ()
241+
%3 = function_ref @load_from_in : $@convention(thin) (@in_guaranteed X) -> ()
242+
%4 = apply %3(%1) : $@convention(thin) (@in_guaranteed X) -> ()
243243
dealloc_stack %1 : $*X
244244
%6 = tuple ()
245245
return %6 : $()
246246
}
247247

248248
// CHECK-LABEL: @allocstack_and_copyaddr
249249
// CHECK: PAIR #2.
250-
// CHECK-NEXT: %4 = apply %3(%0) : $@convention(thin) (@in Int32) -> Int32
250+
// CHECK-NEXT: %4 = apply %3(%0) : $@convention(thin) (@in_guaranteed Int32) -> Int32
251251
// CHECK-NEXT: %0 = argument of bb0 : $*Int32
252252
// CHECK-NEXT: r=1,w=0
253253
// CHECK: PAIR #3.
254-
// CHECK-NEXT: %4 = apply %3(%0) : $@convention(thin) (@in Int32) -> Int32
254+
// CHECK-NEXT: %4 = apply %3(%0) : $@convention(thin) (@in_guaranteed Int32) -> Int32
255255
// CHECK-NEXT: %1 = alloc_stack $Int32
256256
// CHECK-NEXT: r=0,w=0
257257
sil @allocstack_and_copyaddr : $@convention(thin) (@in Int32) -> Int32 {
258258
bb0(%0 : $*Int32):
259259
%1 = alloc_stack $Int32
260260
copy_addr %0 to %1 : $*Int32
261-
%3 = function_ref @single_indirect_arg : $@convention(thin) (@in Int32) -> Int32
262-
%4 = apply %3(%0) : $@convention(thin) (@in Int32) -> Int32
261+
%3 = function_ref @single_indirect_arg : $@convention(thin) (@in_guaranteed Int32) -> Int32
262+
%4 = apply %3(%0) : $@convention(thin) (@in_guaranteed Int32) -> Int32
263263
dealloc_stack %1 : $*Int32
264264
return %4 : $Int32
265265
}
266266

267267
// CHECK-LABEL: @inout_and_copyaddr
268268
// CHECK: PAIR #2.
269-
// CHECK-NEXT: %4 = apply %3(%0) : $@convention(thin) (@in Int32) -> Int32
269+
// CHECK-NEXT: %4 = apply %3(%0) : $@convention(thin) (@in_guaranteed Int32) -> Int32
270270
// CHECK-NEXT: %0 = argument of bb0 : $*Int32
271271
// CHECK-NEXT: r=1,w=0
272272
// CHECK: PAIR #3.
273-
// CHECK-NEXT: %4 = apply %3(%0) : $@convention(thin) (@in Int32) -> Int32
273+
// CHECK-NEXT: %4 = apply %3(%0) : $@convention(thin) (@in_guaranteed Int32) -> Int32
274274
// CHECK-NEXT: %1 = argument of bb0 : $*Int32
275275
// CHECK-NEXT: r=0,w=0
276276
sil @inout_and_copyaddr : $@convention(thin) (@in Int32, @inout Int32) -> Int32 {
277277
bb0(%0 : $*Int32, %1 : $*Int32):
278278
copy_addr %0 to %1 : $*Int32
279-
%3 = function_ref @single_indirect_arg : $@convention(thin) (@in Int32) -> Int32
280-
%4 = apply %3(%0) : $@convention(thin) (@in Int32) -> Int32
279+
%3 = function_ref @single_indirect_arg : $@convention(thin) (@in_guaranteed Int32) -> Int32
280+
%4 = apply %3(%0) : $@convention(thin) (@in_guaranteed Int32) -> Int32
281281
return %4 : $Int32
282282
}
283283

284284
// CHECK-LABEL: @escaping_allocstack_and_copyaddr
285-
// CHECK: PAIR #3.
286-
// CHECK-NEXT: %5 = apply %4(%0, %3) : $@convention(thin) (@in Int32, Builtin.RawPointer) -> Int32
285+
// CHECK: PAIR #2.
286+
// CHECK-NEXT: %5 = apply %4(%0, %3) : $@convention(thin) (@in_guaranteed Int32, Builtin.RawPointer) -> Int32
287287
// CHECK-NEXT: %0 = argument of bb0 : $*Int32
288288
// CHECK-NEXT: r=1,w=0
289-
// CHECK: PAIR #4.
290-
// CHECK-NEXT: %5 = apply %4(%0, %3) : $@convention(thin) (@in Int32, Builtin.RawPointer) -> Int32
289+
// CHECK: PAIR #3.
290+
// CHECK-NEXT: %5 = apply %4(%0, %3) : $@convention(thin) (@in_guaranteed Int32, Builtin.RawPointer) -> Int32
291291
// CHECK-NEXT: %1 = alloc_stack $Int32
292292
// CHECK-NEXT: r=1,w=1
293293
sil @escaping_allocstack_and_copyaddr : $@convention(thin) (@in Int32) -> Int32 {
294294
bb0(%0 : $*Int32):
295295
%1 = alloc_stack $Int32
296296
copy_addr %0 to %1 : $*Int32
297297
%3 = address_to_pointer %1 : $*Int32 to $Builtin.RawPointer
298-
%4 = function_ref @indirect_arg_and_ptr : $@convention(thin) (@in Int32, Builtin.RawPointer) -> Int32
299-
%5 = apply %4(%0, %3) : $@convention(thin) (@in Int32, Builtin.RawPointer) -> Int32
298+
%4 = function_ref @indirect_arg_and_ptr : $@convention(thin) (@in_guaranteed Int32, Builtin.RawPointer) -> Int32
299+
%5 = apply %4(%0, %3) : $@convention(thin) (@in_guaranteed Int32, Builtin.RawPointer) -> Int32
300300
dealloc_stack %1 : $*Int32
301301
return %5 : $Int32
302302
}
@@ -321,7 +321,7 @@ bb0(%0 : $UInt8):
321321
// CHECK: PAIR #2.
322322
// CHECK-NEXT: try_apply %3(%0) : $@convention(thin) (@in Int32) -> (Int32, @error any Error), normal bb1, error bb2
323323
// CHECK-NEXT: %0 = argument of bb0 : $*Int32
324-
// CHECK-NEXT: r=1,w=0
324+
// CHECK-NEXT: r=1,w=1
325325
// CHECK: PAIR #3.
326326
// CHECK-NEXT: try_apply %3(%0) : $@convention(thin) (@in Int32) -> (Int32, @error any Error), normal bb1, error bb2
327327
// CHECK-NEXT: %1 = alloc_stack $Int32
@@ -343,23 +343,23 @@ bb2(%8 : $Error):
343343
// CHECK: PAIR #2.
344344
// CHECK-NEXT: (%4, %5) = begin_apply %3(%0) : $@yield_once @convention(thin) (@in Int32) -> @yields Int32
345345
// CHECK-NEXT: %0 = argument of bb0 : $*Int32
346-
// CHECK-NEXT: r=1,w=0
346+
// CHECK-NEXT: r=1,w=1
347347
// CHECK: PAIR #3.
348348
// CHECK-NEXT: (%4, %5) = begin_apply %3(%0) : $@yield_once @convention(thin) (@in Int32) -> @yields Int32
349349
// CHECK-NEXT: %1 = alloc_stack $Int32
350350
// CHECK-NEXT: r=0,w=0
351351
// CHECK: PAIR #4.
352352
// CHECK-NEXT: end_apply %5
353353
// CHECK-NEXT: %0 = argument of bb0 : $*Int32
354-
// CHECK-NEXT: r=1,w=0
354+
// CHECK-NEXT: r=1,w=1
355355
// CHECK: PAIR #5.
356356
// CHECK-NEXT: end_apply %5
357357
// CHECK-NEXT: %1 = alloc_stack $Int32
358358
// CHECK-NEXT: r=0,w=0
359359
// CHECK: PAIR #6.
360360
// CHECK-NEXT: abort_apply %5
361361
// CHECK-NEXT: %0 = argument of bb0 : $*Int32
362-
// CHECK-NEXT: r=1,w=0
362+
// CHECK-NEXT: r=1,w=1
363363
// CHECK: PAIR #7.
364364
// CHECK-NEXT: abort_apply %5
365365
// CHECK-NEXT: %1 = alloc_stack $Int32
@@ -395,7 +395,7 @@ bb0(%0 : $X):
395395

396396
// CHECK-LABEL: @apply_and_begin_access
397397
// CHECK: PAIR #8.
398-
// CHECK-NEXT: %6 = apply %5(%1) : $@convention(thin) (@in Int32) -> Int32
398+
// CHECK-NEXT: %6 = apply %5(%1) : $@convention(thin) (@in_guaranteed Int32) -> Int32
399399
// CHECK-NEXT: %0 = argument of bb0 : $*Int32
400400
// CHECK-NEXT: r=0,w=0
401401
sil @apply_and_begin_access : $@convention(thin) (@in Int32) -> Int32 {
@@ -404,13 +404,13 @@ bb0(%0 : $*Int32):
404404
%2 = begin_access [read] [static] %0 : $*Int32
405405
copy_addr %2 to %1 : $*Int32
406406
end_access %2 : $*Int32
407-
%5 = function_ref @single_indirect_arg : $@convention(thin) (@in Int32) -> Int32
408-
%6 = apply %5(%1) : $@convention(thin) (@in Int32) -> Int32
407+
%5 = function_ref @single_indirect_arg : $@convention(thin) (@in_guaranteed Int32) -> Int32
408+
%6 = apply %5(%1) : $@convention(thin) (@in_guaranteed Int32) -> Int32
409409
dealloc_stack %1 : $*Int32
410410
return %6 : $Int32
411411
}
412412

413-
sil @load_from_in : $@convention(thin) (@in X) -> () {
413+
sil @load_from_in : $@convention(thin) (@in_guaranteed X) -> () {
414414
bb0(%0 : $*X):
415415
%1 = load %0 : $*X
416416
%2 = tuple ()
@@ -449,23 +449,23 @@ bb0:
449449

450450
// CHECK-LABEL: @non_overlapping_struct_fields
451451
// CHECK: PAIR #0.
452-
// CHECK-NEXT: %4 = apply %3(%1) : $@convention(thin) (@in Int32) -> Int32
452+
// CHECK-NEXT: %4 = apply %3(%1) : $@convention(thin) (@in_guaranteed Int32) -> Int32
453453
// CHECK-NEXT: %0 = argument of bb0 : $*TwoInts
454454
// CHECK-NEXT: r=1,w=0
455455
// CHECK: PAIR #1.
456-
// CHECK-NEXT: %4 = apply %3(%1) : $@convention(thin) (@in Int32) -> Int32
456+
// CHECK-NEXT: %4 = apply %3(%1) : $@convention(thin) (@in_guaranteed Int32) -> Int32
457457
// CHECK-NEXT: %1 = struct_element_addr %0 : $*TwoInts, #TwoInts.i1
458458
// CHECK-NEXT: r=1,w=0
459459
// CHECK: PAIR #2.
460-
// CHECK-NEXT: %4 = apply %3(%1) : $@convention(thin) (@in Int32) -> Int32
460+
// CHECK-NEXT: %4 = apply %3(%1) : $@convention(thin) (@in_guaranteed Int32) -> Int32
461461
// CHECK-NEXT: %2 = struct_element_addr %0 : $*TwoInts, #TwoInts.i2
462462
// CHECK-NEXT: r=0,w=0
463463
sil @non_overlapping_struct_fields : $@convention(thin) (@in TwoInts) -> Int32 {
464464
bb0(%0 : $*TwoInts):
465465
%1 = struct_element_addr %0 : $*TwoInts, #TwoInts.i1
466466
%2 = struct_element_addr %0 : $*TwoInts, #TwoInts.i2
467-
%3 = function_ref @single_indirect_arg : $@convention(thin) (@in Int32) -> Int32
468-
%4 = apply %3(%1) : $@convention(thin) (@in Int32) -> Int32
467+
%3 = function_ref @single_indirect_arg : $@convention(thin) (@in_guaranteed Int32) -> Int32
468+
%4 = apply %3(%1) : $@convention(thin) (@in_guaranteed Int32) -> Int32
469469
return %4 : $Int32
470470
}
471471

test/SILOptimizer/side_effects.sil

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ sil @unknown_func : $@convention(thin) () -> ()
7373
sil @unknown_func_with_in_arg : $@convention(thin) (@in X) -> ()
7474
sil @unknown_func_with_in_guaranteed_arg : $@convention(thin) (@in_guaranteed X) -> ()
7575
sil @unknown_func_with_inout_arg : $@convention(thin) (@inout SP) -> ()
76-
sil @unknown_func_with_trivial_args : $@convention(thin) (@in Int32, Int32) -> ()
76+
sil @unknown_func_with_trivial_args : $@convention(thin) (@in_guaranteed Int32, Int32) -> ()
7777

7878

7979
sil @$s4test1XCfD : $@convention(method) (@owned X) -> () {
@@ -249,8 +249,8 @@ bb0:
249249
// CHECK-NEXT: {{^[^[]}}
250250
sil @call_unknown_func_with_trivial_args : $@convention(thin) (@in Int32, Int32) -> () {
251251
bb0(%0 : $*Int32, %1 : $Int32):
252-
%2 = function_ref @unknown_func_with_trivial_args : $@convention(thin) (@in Int32, Int32) -> ()
253-
%3 = apply %2(%0, %1) : $@convention(thin) (@in Int32, Int32) -> ()
252+
%2 = function_ref @unknown_func_with_trivial_args : $@convention(thin) (@in_guaranteed Int32, Int32) -> ()
253+
%3 = apply %2(%0, %1) : $@convention(thin) (@in_guaranteed Int32, Int32) -> ()
254254

255255
%r = tuple ()
256256
return %r : $()

0 commit comments

Comments
 (0)