@@ -128,6 +128,22 @@ bb0(%0 : $*B, %1 : $*GS<B>):
128128 return %9999 : $()
129129}
130130
131+ // CHECK-LABEL: sil [ossa] @store_before_load_take
132+ // CHECK: [[STK:%[0-9]+]] = alloc_stack
133+ // CHECK: copy_addr [take] %0 to [initialization] [[STK]]
134+ // CHECK: store
135+ // CHECK: load [take] [[STK]]
136+ // CHECK: return
137+ // CHECK: } // end sil function 'store_before_load_take'
138+ sil [ossa] @store_before_load_take : $@convention(thin) (@inout Builtin.NativeObject, @owned Builtin.NativeObject) -> @owned Builtin.NativeObject {
139+ bb0(%0 : $*Builtin.NativeObject, %1 : @owned $Builtin.NativeObject):
140+ %stk = alloc_stack $Builtin.NativeObject
141+ copy_addr [take] %0 to [initialization] %stk : $*Builtin.NativeObject
142+ store %1 to [init] %0 : $*Builtin.NativeObject
143+ %obj = load [take] %stk : $*Builtin.NativeObject
144+ dealloc_stack %stk : $*Builtin.NativeObject
145+ return %obj : $Builtin.NativeObject
146+ }
131147// CHECK-LABEL: sil [ossa] @load_in_wrong_block
132148// CHECK: bb0(%0 : $*GS<B>):
133149// CHECK-NEXT: alloc_stack
@@ -693,38 +709,28 @@ bb0(%0 : @owned $GS<Builtin.NativeObject>):
693709 return %obj : $GS<Builtin.NativeObject>
694710}
695711
696- // CHECK-LABEL: sil [ossa] @hoist_load_copy_to_src_copy_addr_site_two_takes : $@convention(thin) (@in GS<Builtin.NativeObject>) -> @owned GS<Builtin.NativeObject> {
697- // CHECK: bb0([[ARG:%.*]] :
698- // CHECK: [[COPY_1:%.*]] = load [copy] [[ARG]]
699- // CHECK: [[COPY_2:%.*]] = load [copy] [[ARG]]
700- // CHECK: destroy_addr [[ARG]]
701- // CHECK: cond_br undef, bb1, bb2
702- //
712+ // CHECK-LABEL: sil [ossa] @dont_optimize_with_load_in_different_block
713+ // CHECK: [[STK:%[0-9]+]] = alloc_stack
714+ // CHECK: copy_addr %0 to [initialization] [[STK]]
703715// CHECK: bb1:
704- // CHECK: destroy_value [[COPY_1]]
705- // CHECK: br bb3([[COPY_2]] :
706- //
716+ // CHECK: load [take] [[STK]]
707717// CHECK: bb2:
708- // CHECK: destroy_value [[COPY_2]]
709- // CHECK: br bb3([[COPY_1]] :
710- //
711- // CHECK: bb3([[RESULT:%.*]] : @owned
712- // CHECK: apply {{%.*}}([[RESULT]])
713- // CHECK: return [[RESULT]]
714- // CHECK: } // end sil function 'hoist_load_copy_to_src_copy_addr_site_two_takes'
715- sil [ossa] @hoist_load_copy_to_src_copy_addr_site_two_takes : $@convention(thin) (@in GS<Builtin.NativeObject>) -> @owned GS<Builtin.NativeObject> {
716- bb0(%0 : $*GS<Builtin.NativeObject>):
718+ // CHECK: copy_addr %1 to %0
719+ // CHECK: load [take] [[STK]]
720+ // CHECK: } // end sil function 'dont_optimize_with_load_in_different_block'
721+ sil [ossa] @dont_optimize_with_load_in_different_block : $@convention(thin) (@inout GS<Builtin.NativeObject>, @in_guaranteed GS<Builtin.NativeObject>) -> @owned GS<Builtin.NativeObject> {
722+ bb0(%0 : $*GS<Builtin.NativeObject>, %1 : $*GS<Builtin.NativeObject>):
717723 %f = function_ref @use_gsbase_builtinnativeobject : $@convention(thin) (@guaranteed GS<Builtin.NativeObject>) -> ()
718724 %stk = alloc_stack $GS<Builtin.NativeObject>
719725 copy_addr %0 to [initialization] %stk : $*GS<Builtin.NativeObject>
720- destroy_addr %0 : $*GS<Builtin.NativeObject>
721726 cond_br undef, bb1, bb2
722727
723728bb1:
724729 %obj = load [take] %stk : $*GS<Builtin.NativeObject>
725730 br bb3(%obj : $GS<Builtin.NativeObject>)
726731
727732bb2:
733+ copy_addr %1 to %0 : $*GS<Builtin.NativeObject>
728734 %obj2 = load [take] %stk : $*GS<Builtin.NativeObject>
729735 br bb3(%obj2 : $GS<Builtin.NativeObject>)
730736
0 commit comments