| // RUN: %target-sil-opt -assume-parsing-unqualified-ownership-sil -enable-sil-verify-all -dead-arg-signature-opt %s | %FileCheck %s |
| |
| import Builtin |
| import Swift |
| |
| // Specialize to a function with removed dead argument. |
| |
| // CHECK-LABEL: sil [thunk] [always_inline] @one_arg_dead |
| // CHECK: [[F:%[0-9]+]] = function_ref @$S12one_arg_deadTf4nnd_n |
| // CHECK: [[A:%[0-9]+]] = apply [[F]](%0, %1) |
| // CHECK: return [[A]] |
| sil @one_arg_dead : $@convention(method) (Int32, Int32, @thin Int32.Type) -> Bool { |
| bb0(%0 : $Int32, %1 : $Int32, %2 : $@thin Int32.Type): |
| %5 = struct_extract %0 : $Int32, #Int32._value |
| %6 = struct_extract %1 : $Int32, #Int32._value |
| %7 = builtin "cmp_slt_Int32"(%5 : $Builtin.Int32, %6 : $Builtin.Int32) : $Builtin.Int1 |
| %8 = struct $Bool (%7 : $Builtin.Int1) |
| return %8 : $Bool |
| } |
| |
| // CHECK-LABEL: sil [thunk] [always_inline] @always_inline_one_arg_dead |
| // CHECK: [[F:%[0-9]+]] = function_ref @$S26always_inline_one_arg_deadTf4nnd_n |
| // CHECK: [[A:%[0-9]+]] = apply [[F]](%0, %1) |
| // CHECK: return [[A]] |
| sil [always_inline] @always_inline_one_arg_dead : $@convention(witness_method: Comparable) (Int32, Int32, @thin Int32.Type) -> Bool { |
| bb0(%0 : $Int32, %1 : $Int32, %2 : $@thin Int32.Type): |
| %5 = struct_extract %0 : $Int32, #Int32._value |
| %6 = struct_extract %1 : $Int32, #Int32._value |
| %7 = builtin "cmp_slt_Int32"(%5 : $Builtin.Int32, %6 : $Builtin.Int32) : $Builtin.Int1 |
| %8 = struct $Bool (%7 : $Builtin.Int1) |
| return %8 : $Bool |
| } |
| |
| // Still delete only one dead arg as only one arg is partially applied. |
| |
| // CHECK-LABEL: sil [thunk] [always_inline] @two_args_dead |
| // CHECK: [[F:%[0-9]+]] = function_ref @$S13two_args_deadTf4nnd_n |
| // CHECK: [[A:%[0-9]+]] = apply [[F]](%0, %1) |
| // CHECK: return [[A]] |
| sil @two_args_dead : $@convention(method) (Int32, Int32, @thin Int32.Type) -> Bool { |
| bb0(%0 : $Int32, %1 : $Int32, %2 : $@thin Int32.Type): |
| %5 = struct_extract %0 : $Int32, #Int32._value |
| %7 = builtin "cmp_slt_Int32"(%5 : $Builtin.Int32, %5 : $Builtin.Int32) : $Builtin.Int1 |
| %8 = struct $Bool (%7 : $Builtin.Int1) |
| return %8 : $Bool |
| } |
| |
| // Don't specialize at this function is not partially applied. |
| |
| // CHECK-LABEL: sil @not_used |
| // CHECK-NOT: apply |
| // CHECK: return |
| sil @not_used : $@convention(method) (Int32, Int32, @thin Int32.Type) -> Bool { |
| bb0(%0 : $Int32, %1 : $Int32, %2 : $@thin Int32.Type): |
| %5 = struct_extract %0 : $Int32, #Int32._value |
| %6 = struct_extract %1 : $Int32, #Int32._value |
| %7 = builtin "cmp_slt_Int32"(%5 : $Builtin.Int32, %6 : $Builtin.Int32) : $Builtin.Int1 |
| %8 = struct $Bool (%7 : $Builtin.Int1) |
| return %8 : $Bool |
| } |
| |
| sil @partial_apply_one_arg_dead : $@convention(thin) () -> @owned @callee_owned (Int32, Int32) -> Bool { |
| bb0: |
| %0 = metatype $@thin Int32.Type |
| %1 = function_ref @one_arg_dead : $@convention(method) (Int32, Int32, @thin Int32.Type) -> Bool |
| %2 = partial_apply %1(%0) : $@convention(method) (Int32, Int32, @thin Int32.Type) -> Bool |
| return %2 : $@callee_owned (Int32, Int32) -> Bool |
| } |
| |
| sil @partial_apply_always_inline_one_arg_dead : $@convention(thin) () -> @owned @callee_owned (Int32, Int32) -> Bool { |
| bb0: |
| %0 = metatype $@thin Int32.Type |
| %1 = function_ref @always_inline_one_arg_dead : $@convention(witness_method: Comparable) (Int32, Int32, @thin Int32.Type) -> Bool |
| %2 = partial_apply %1(%0) : $@convention(witness_method: Comparable) (Int32, Int32, @thin Int32.Type) -> Bool |
| return %2 : $@callee_owned (Int32, Int32) -> Bool |
| } |
| |
| sil @partial_apply_two_args_dead : $@convention(thin) () -> @owned @callee_owned (Int32, Int32) -> Bool { |
| bb0: |
| %0 = metatype $@thin Int32.Type |
| %1 = function_ref @two_args_dead : $@convention(method) (Int32, Int32, @thin Int32.Type) -> Bool |
| %2 = partial_apply %1(%0) : $@convention(method) (Int32, Int32, @thin Int32.Type) -> Bool |
| return %2 : $@callee_owned (Int32, Int32) -> Bool |
| } |
| |
| // CHECK-LABEL: sil shared @$S12one_arg_deadTf4nnd_n |
| // CHECK: builtin |
| // CHECK: return |
| |
| // CHECK-LABEL: sil shared @$S13two_args_deadTf4nnd_n |
| // CHECK: builtin |
| // CHECK: return |