@@ -362,3 +362,45 @@ bb9(%0 : @owned $Klass):
362362 destroy_value %0 : $Klass
363363 return %v : $Builtin.Int64
364364}
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