blob: 376e695e3e0175d94b81344b62034c604d893734 [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all %s -licm | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
sil @read_from_param : $@convention(thin) (@inout Int64, Int64) -> Int64 {
bb0(%0 : $*Int64, %1 : $Int64):
debug_value %1 : $Int64
%3 = struct_element_addr %0 : $*Int64, #Int64._value
%4 = load %3 : $*Builtin.Int64
return %1 : $Int64
}
//CHECK-LABEL: sil @licm_readonly_apply
//CHECK: %{{[0-9]+}} = apply
//CHECK: bb1:
//CHECK-NOT: {{ apply}}
//CHECK: return
sil @licm_readonly_apply : $@convention(thin) (Int64, @inout Int64) -> () {
bb0(%0 : $Int64, %1 : $*Int64):
%2 = alloc_stack $Int64
store %0 to %2 : $*Int64
%9 = function_ref @read_from_param : $@convention(thin) (@inout Int64, Int64) -> Int64
%10 = integer_literal $Builtin.Int64, 3
%11 = struct $Int64 (%10 : $Builtin.Int64)
%12 = struct_element_addr %1 : $*Int64, #Int64._value
%13 = integer_literal $Builtin.Int1, -1
br bb1
bb1:
%21 = apply %9(%2, %11) : $@convention(thin) (@inout Int64, Int64) -> Int64
%22 = load %12 : $*Builtin.Int64
%23 = struct_extract %21 : $Int64, #Int64._value
%24 = builtin "sadd_with_overflow_Int64"(%22 : $Builtin.Int64, %23 : $Builtin.Int64, %13 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
%25 = tuple_extract %24 : $(Builtin.Int64, Builtin.Int1), 0
%28 = struct $Int64 (%25 : $Builtin.Int64)
// This store does _not_ alias with the read in @read_from_param
store %28 to %1 : $*Int64
cond_br undef, bb1, bb2
bb2:
%15 = tuple ()
dealloc_stack %2 : $*Int64
return %15 : $()
}
//CHECK-LABEL: sil @dont_licm_readonly_apply
//CHECK: bb1:
//CHECK: %{{[0-9]+}} = apply
//CHECK: return
sil @dont_licm_readonly_apply : $@convention(thin) (Int64, @inout Int64) -> () {
bb0(%0 : $Int64, %1 : $*Int64):
%2 = alloc_stack $Int64
store %0 to %2 : $*Int64
%9 = function_ref @read_from_param : $@convention(thin) (@inout Int64, Int64) -> Int64
%10 = integer_literal $Builtin.Int64, 3
%11 = struct $Int64 (%10 : $Builtin.Int64)
%12 = struct_element_addr %1 : $*Int64, #Int64._value
%13 = integer_literal $Builtin.Int1, -1
br bb1
bb1:
%21 = apply %9(%2, %11) : $@convention(thin) (@inout Int64, Int64) -> Int64
%22 = load %12 : $*Builtin.Int64
%23 = struct_extract %21 : $Int64, #Int64._value
%24 = builtin "sadd_with_overflow_Int64"(%22 : $Builtin.Int64, %23 : $Builtin.Int64, %13 : $Builtin.Int1) : $(Builtin.Int64, Builtin.Int1)
%25 = tuple_extract %24 : $(Builtin.Int64, Builtin.Int1), 0
%28 = struct $Int64 (%25 : $Builtin.Int64)
// This store does alias with the read in @read_from_param
store %28 to %2 : $*Int64
cond_br undef, bb1, bb2
bb2:
%15 = tuple ()
dealloc_stack %2 : $*Int64
return %15 : $()
}
class X {
}
sil_global @_static_object : $X
sil @retain_only : $@convention(thin) () -> @owned X {
bb0:
%1 = global_addr @_static_object : $*X
%2 = address_to_pointer %1 : $*X to $Builtin.RawPointer
%3 = raw_pointer_to_ref %2 : $Builtin.RawPointer to $X
strong_retain %3 : $X
return %3 : $X
}
//CHECK-LABEL: sil @dont_licm_retainonly_apply
//CHECK: bb1:
//CHECK: %{{[0-9]+}} = apply
//CHECK: return
sil @dont_licm_retainonly_apply : $@convention(thin) (Int64, @inout Int64) -> () {
bb0(%0 : $Int64, %1 : $*Int64):
%9 = function_ref @retain_only : $@convention(thin) () -> @owned X
br bb1
bb1:
%21 = apply %9() : $@convention(thin) () -> @owned X
strong_release %21 : $X
cond_br undef, bb1, bb2
bb2:
%15 = tuple ()
return %15 : $()
}