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 62 63 64 65 66 67 68
|
// RUN: %target-sil-opt -copy-propagation -enable-sil-verify-all -module-name Swift %s | %FileCheck %s --check-prefixes=CHECK,CHECK-OPT
// RUN: %target-sil-opt -mandatory-copy-propagation -enable-sil-verify-all -module-name Swift %s | %FileCheck %s --check-prefixes=CHECK,CHECK-ONONE
// Runs CopyPropagation without borrow scope canonicalization.
sil_stage canonical
import Builtin
typealias AnyObject = Builtin.AnyObject
protocol Error {}
class B { }
class C {
var a: Builtin.Int64
}
struct NonTrivialStruct {
@_hasStorage var val: C { get set }
}
class CompileError : Error {}
// This test case used to have an invalid boundary extension.
// CHECK-LABEL: sil [ossa] @canonicalize_borrow_of_copy_with_interesting_boundary : $@convention(thin) (@owned C) -> (@owned NonTrivialStruct, @error any Error) {
// CHECK: {{bb[0-9]+}}([[INSTANCE:%[^,]+]] :
// CHECK: cond_br undef, [[SUCCESS:bb[0-9]+]], [[FAILURE:bb[0-9]+]]
// CHECK: [[SUCCESS]]:
// CHECK: [[BORROW:%[^,]+]] = begin_borrow [[INSTANCE]]
// CHECK: [[STRUCT:%[^,]+]] = struct $NonTrivialStruct ([[BORROW]] : $C)
// CHECK: [[STRUCT_OUT:%[^,]+]] = copy_value [[STRUCT]]
// CHECK: end_borrow [[BORROW]]
// CHECK: destroy_value [[INSTANCE]]
// CHECK: return [[STRUCT_OUT]]
// CHECK: [[FAILURE]]:
// CHECK: destroy_value [[INSTANCE]]
// CHECK: [[BOX:%[^,]+]] = alloc_existential_box
// CHECK: throw [[BOX]]
// CHECK-LABEL: } // end sil function 'canonicalize_borrow_of_copy_with_interesting_boundary'
sil [ossa] @canonicalize_borrow_of_copy_with_interesting_boundary : $@convention(thin) (@owned C) -> (@owned NonTrivialStruct, @error any Error) {
bb0(%0 : @owned $C):
%1 = copy_value %0 : $C
%2 = copy_value %1 : $C
cond_br undef, bb1, bb2
bb1:
destroy_value %0 : $C
destroy_value %1 : $C
%6 = begin_borrow %2 : $C
%7 = struct $NonTrivialStruct (%6 : $C)
%8 = copy_value %7 : $NonTrivialStruct
end_borrow %6 : $C
destroy_value %2 : $C
return %8 : $NonTrivialStruct
bb2:
destroy_value %2 : $C
%13 = begin_borrow %1 : $C
%14 = struct $NonTrivialStruct (%13 : $C)
%15 = copy_value %14 : $NonTrivialStruct
end_borrow %13 : $C
destroy_value %1 : $C
destroy_value %15 : $NonTrivialStruct
%19 = alloc_existential_box $any Error, $CompileError
destroy_value %0 : $C
%22 = builtin "willThrow"(%19 : $any Error) : $()
throw %19 : $any Error
}
|