mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
If there is no read from an indirect argument, this argument has to be dropped. At the call site the store to the argument's memory location could have been removed (based on the callee's memory effects). Therefore, converting such an unused indirect argument to a direct argument, would load an uninitialized value at the call site. This would lead to verifier errors and in worst case to a miscompile because IRGen can implicitly use dead arguments, e.g. for getting the type of a class reference.
41 lines
1.8 KiB
Plaintext
41 lines
1.8 KiB
Plaintext
// RUN: %empty-directory(%t)
|
|
// RUN: %target-swift-frontend %S/Inputs/shared_function_serialization_input.swift -o %t/Swift.swiftmodule -emit-module -parse-as-library -parse-stdlib -module-link-name swiftCore -module-name Swift -O -enable-ossa-modules
|
|
// RUN: %target-sil-opt -enable-sil-verify-all -I %t -performance-linker -enable-ossa-modules -inline %s -o - | %FileCheck %s
|
|
|
|
// CHECK: sil private @top_level_code
|
|
// CHECK: sil public_external [serialized] [ossa] @$ss1XVABycfC{{.*}}
|
|
// CHECK: sil public_external [serialized] [ossa] @$ss17the_thing_it_does1xys1XV_tF{{.*}}
|
|
// CHECK: sil shared [serialized] [noinline] [ossa] @$ss9the_thing1tyx_tlFs1XV_Ttgq5{{.*}}
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
sil_global @x : $X
|
|
|
|
// top_level_code
|
|
sil private @top_level_code : $@convention(thin) () -> () {
|
|
bb0:
|
|
%0 = global_addr @x : $*X // users: %4, %6
|
|
// function_ref Swift.X.init (Swift.X.Type)() -> Swift.X
|
|
%1 = function_ref @$ss1XVABycfC : $@convention(method) (@thin X.Type) -> X // user: %3
|
|
%2 = metatype $@thin X.Type // user: %3
|
|
%3 = apply %1(%2) : $@convention(method) (@thin X.Type) -> X // user: %4
|
|
store %3 to %0 : $*X // id: %4
|
|
// function_ref Swift.the_thing_it_does (x : Swift.X) -> ()
|
|
%5 = function_ref @$ss17the_thing_it_does1xys1XV_tF : $@convention(thin) (X) -> () // user: %7
|
|
%6 = load %0 : $*X // user: %7
|
|
%7 = apply %5(%6) : $@convention(thin) (X) -> ()
|
|
%8 = tuple () // user: %9
|
|
return %8 : $() // id: %9
|
|
}
|
|
|
|
// Swift.X.init (Swift.X.Type)() -> Swift.X
|
|
sil @$ss1XVABycfC : $@convention(method) (@thin X.Type) -> X
|
|
|
|
// Swift.the_thing_it_does (x : Swift.X) -> ()
|
|
sil @$ss17the_thing_it_does1xys1XV_tF : $@convention(thin) (X) -> ()
|
|
|
|
|