1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
|
// RUN: %target-sil-opt %s -sil-consume-operator-copyable-values-checker | %FileCheck %s
// REQUIRES: optimized_stdlib
sil_stage raw
import Builtin
// Make sure that when we process a move_addr on an alloc_stack/debug_value that
// we properly put the [moveable_value_debuginfo] marker on them.
// CHECK-LABEL: sil [ossa] @singleBlock : $@convention(thin) (@owned Builtin.NativeObject) -> () {
// CHECK: bb0([[ARG:%.*]] :
// CHECK: debug_value [moveable_value_debuginfo] [[ARG]] : $Builtin.NativeObject, let, name "myName"
// CHECK: [[MOVED_VAL:%.*]] = move_value [[ARG]]
// CHECK: debug_value [moveable_value_debuginfo] undef : $Builtin.NativeObject, let, name "myName"
// CHECK: } // end sil function 'singleBlock'
sil [ossa] @singleBlock : $@convention(thin) (@owned Builtin.NativeObject) -> () {
bb0(%0 : @owned $Builtin.NativeObject):
debug_value %0 : $Builtin.NativeObject, let, name "myName"
%1 = move_value [allows_diagnostics] %0 : $Builtin.NativeObject
destroy_value %1 : $Builtin.NativeObject
%9999 = tuple()
return %9999 : $()
}
// CHECK-LABEL: sil [ossa] @multipleBlock : $@convention(thin) (@owned Builtin.NativeObject) -> () {
// CHECK: bb0([[ARG:%.*]] :
//
// Make sure we break right after the debug_value here. This ensures that when
// we llvm.dbg.addr the shadow copy, we avoid bad LLVM behavior in SelectionDAG
// that sinks llvm.dbg.addr to end of block.
// CHECK: debug_value [moveable_value_debuginfo] [[ARG]]
// CHECK: cond_br undef, bb1, bb2
//
// CHECK: bb1:
// CHECK: [[MV:%.*]] = move_value [[ARG]]
//
// We don't break the block after the undefs since they become llvm.dbg.value
// which do not have the problem that llvm.dbg.addr shadow values have.
// CHECK: debug_value [moveable_value_debuginfo] undef : $Builtin.NativeObject, let, name "myName"
// CHECK-NEXT: destroy_value
// CHECK: } // end sil function 'multipleBlock'
sil [ossa] @multipleBlock : $@convention(thin) (@owned Builtin.NativeObject) -> () {
bb0(%0 : @owned $Builtin.NativeObject):
debug_value %0 : $Builtin.NativeObject, let, name "myName"
cond_br undef, bb1, bb2
bb1:
%1 = move_value [allows_diagnostics] %0 : $Builtin.NativeObject
destroy_value %1 : $Builtin.NativeObject
br bb3
bb2:
destroy_value %0 : $Builtin.NativeObject
br bb3
bb3:
%9999 = tuple()
return %9999 : $()
}
|