@@ -362,3 +362,45 @@ bb9(%0 : @owned $Klass):
362
362
destroy_value %0 : $Klass
363
363
return %v : $Builtin.Int64
364
364
}
365
+
366
+ struct Outer {
367
+ var middle: Middle
368
+ }
369
+
370
+ struct Middle {
371
+ var inner: Inner
372
+ }
373
+
374
+ struct Inner {
375
+ var guts: Builtin.AnyObject
376
+ }
377
+
378
+ sil @getOuter : $@convention(thin) () -> @owned Outer
379
+ sil @takeInner : $@convention(thin) (@owned Inner) -> ()
380
+
381
+ // CHECK-LABEL: sil [ossa] @narrowLoadThroughProjectionSequence : {{.*}} {
382
+ // CHECK: [[OUTER_ADDR:%[^,]+]] = project_box
383
+ // CHECK: [[MIDDLE_ADDR:%[^,]+]] = struct_element_addr [[OUTER_ADDR]]
384
+ // CHECK: [[INNER_ADDR:%[^,]+]] = struct_element_addr [[MIDDLE_ADDR]]
385
+ // CHECK: [[INNER_BORROW:%[^,]+]] = load_borrow [[INNER_ADDR]]
386
+ // CHECK: copy_value [[INNER_BORROW]]
387
+ // CHECK-LABEL: } // end sil function 'narrowLoadThroughProjectionSequence'
388
+ sil [ossa] @narrowLoadThroughProjectionSequence : $@convention(thin) () -> () {
389
+ %box = alloc_box ${ let Outer }
390
+ %box_borrow = begin_borrow [lexical] [var_decl] %box : ${ let Outer }
391
+ %outer_addr = project_box %box_borrow : ${ let Outer }, 0
392
+ %getOuter = function_ref @getOuter : $@convention(thin) () -> @owned Outer
393
+ %outer = apply %getOuter() : $@convention(thin) () -> @owned Outer
394
+ store %outer to [init] %outer_addr : $*Outer
395
+ %outer_borrow = load_borrow %outer_addr : $*Outer
396
+ %middle = struct_extract %outer_borrow : $Outer, #Outer.middle
397
+ %inner = struct_extract %middle : $Middle, #Middle.inner
398
+ %inner_copy = copy_value %inner : $Inner
399
+ %takeInner = function_ref @takeInner : $@convention(thin) (@owned Inner) -> ()
400
+ apply %takeInner(%inner_copy) : $@convention(thin) (@owned Inner) -> ()
401
+ end_borrow %outer_borrow : $Outer
402
+ end_borrow %box_borrow : ${ let Outer }
403
+ dealloc_box %box : ${ let Outer }
404
+ %retval = tuple ()
405
+ return %retval : $()
406
+ }
0 commit comments