blob: b24855dc33697395604d7fae19fbe1ebe20ae061 [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all %s -high-level-licm | %FileCheck %s
sil_stage canonical
import Builtin
import Swift
sil [_semantics "array.get_count"] @getCount : $@convention(method) (@guaranteed Array<Int>) -> Int
sil [_semantics "array.get_capacity"] @getCapacity : $@convention(method) (@guaranteed Array<Int>) -> Int
sil @user : $@convention(thin) (Int) -> ()
// CHECK-LABEL: sil @licm_get_count
// CHECK: [[F1:%[0-9]+]] = function_ref @getCount
// CHECK: [[F2:%[0-9]+]] = function_ref @user
// CHECK: [[C:%[0-9]+]] = apply [[F1]](%0)
// CHECK: {{^}}bb1:
// CHECK-NEXT: apply [[F2]]([[C]])
// CHECK-NEXT: cond_br
// CHECK: {{^}}bb2:
// CHECK: return
sil @licm_get_count : $@convention(thin) (@guaranteed Array<Int>) -> () {
bb0(%0 : $Array<Int>):
br bb1
bb1:
%f1 = function_ref @getCount : $@convention(method) (@guaranteed Array<Int>) -> Int
%f2 = function_ref @user : $@convention(thin) (Int) -> ()
%c1 = apply %f1(%0) : $@convention(method) (@guaranteed Array<Int>) -> Int
%c2 = apply %f2(%c1) : $@convention(thin) (Int) -> ()
cond_br undef, bb1, bb2
bb2:
%r1 = tuple ()
return %r1 : $()
}
// CHECK-LABEL: sil @licm_get_capacity
// CHECK-DAG: [[A:%[0-9]+]] = load
// CHECK-DAG: [[F1:%[0-9]+]] = function_ref @getCapacity
// CHECK-DAG: [[F2:%[0-9]+]] = function_ref @user
// CHECK: [[C:%[0-9]+]] = apply [[F1]]([[A]])
// CHECK: {{^}}bb1:
// CHECK-NEXT: apply [[F2]]([[C]])
// CHECK-NEXT: cond_br
// CHECK: {{^}}bb2:
// CHECK: return
sil @licm_get_capacity : $@convention(thin) (@inout Array<Int>) -> () {
bb0(%0 : $*Array<Int>):
// Check if it also works if the array is not a function argument.
%a1 = load %0 : $*Array<Int>
br bb1
bb1:
%f1 = function_ref @getCapacity : $@convention(method) (@guaranteed Array<Int>) -> Int
%f2 = function_ref @user : $@convention(thin) (Int) -> ()
%c1 = apply %f1(%a1) : $@convention(method) (@guaranteed Array<Int>) -> Int
%c2 = apply %f2(%c1) : $@convention(thin) (Int) -> ()
cond_br undef, bb1, bb2
bb2:
%r1 = tuple ()
return %r1 : $()
}