// RUN: %target-sil-opt -enable-sil-verify-all %s -allocbox-to-stack -enable-lexical-lifetimes | %FileCheck %s sil_stage raw import Builtin struct Int { var _value: Builtin.Int64 } struct Bool { var _value: Builtin.Int1 } protocol Error {} // CHECK-LABEL: sil [ossa] @promote_nonlexical // CHECK: alloc_stack $ // CHECK-NOT: alloc_box // CHECK-NOT: destroy_value // CHECK: return // CHECK-LABEL: } // end sil function 'promote_nonlexical' sil [ossa] @promote_nonlexical : $@convention(thin) (Int) -> Int { bb0(%0 : $Int): %1 = alloc_box ${ var Int } %1a = project_box %1 : ${ var Int }, 0 store %0 to [trivial] %1a : $*Int %3 = load [trivial] %1a : $*Int destroy_value %1 : ${ var Int } return %3 : $Int } // CHECK-LABEL: sil [ossa] @promote_lexical // CHECK: alloc_stack [lexical] // CHECK-NOT: alloc_box // CHECK-NOT: destroy_value // CHECK: return // CHECK-LABEL: } // end sil function 'promote_lexical' sil [ossa] @promote_lexical : $@convention(thin) (Int) -> Int { bb0(%0 : $Int): %1 = alloc_box ${ var Int } %b = begin_borrow [lexical] %1 : ${ var Int } %1a = project_box %b : ${ var Int }, 0 store %0 to [trivial] %1a : $*Int %3 = load [trivial] %1a : $*Int end_borrow %b : ${ var Int } destroy_value %1 : ${ var Int } return %3 : $Int } // CHECK-LABEL: sil [ossa] @keep_dead_end : {{.*}} { // CHECK: [[STACK:%[^,]+]] = alloc_stack // CHECK: cond_br undef, [[DIE:bb[0-9]+]] // CHECK: [[DIE]]: // CHECK-NEXT: unreachable // CHECK-LABEL: } // end sil function 'keep_dead_end' sil [ossa] @keep_dead_end : $@convention(thin) () -> () { bb0: %b = alloc_box ${ var Int } cond_br undef, die, exit die: dealloc_box [dead_end] %b : ${ var Int } unreachable exit: dealloc_box %b : ${ var Int } %retval = tuple () return %retval : $() }