blob: f9e5fa58b172fcdb031f44ca97aabd38612480ad [file] [log] [blame]
// RUN: %target-sil-opt -enable-sil-verify-all -simplify-cfg -debug-only=sil-simplify-cfg %s -o /dev/null 2>&1 | %FileCheck %s
// REQUIRES: asserts
import Builtin
import Swift
import Builtin
import Swift
protocol OtherKlass : class {}
class Klass {}
sil @getKlass : $@convention(thin) () -> @owned Klass
// Verify that checked-cast jump-threading kicks in and generates verifiable SIL.
//
// CHECK: Condition is the same if reached over {{.*}} parent @$testCheckCastJumpThread : $@convention(thin) (@guaranteed Klass) -> @owned OtherKlass }
// CHECK-NEXT: bb3(%{{.*}} : $OtherKlass):
// CHECK-NEXT: br bb5(%{{.*}} : $Klass)
sil shared @$testCheckCastJumpThread : $@convention(thin) (@guaranteed Klass) -> @owned OtherKlass {
bb0(%0 : $Klass):
%1 = function_ref @getKlass : $@convention(thin) () -> @owned Klass
%2 = integer_literal $Builtin.Int64, 1
%3 = apply %1() : $@convention(thin) () -> @owned Klass
checked_cast_br %3 : $Klass to OtherKlass, bb1, bb2
bb1(%5 : $OtherKlass):
%6 = integer_literal $Builtin.Int1, -1
br bb3(%6 : $Builtin.Int1)
bb2:
%8 = integer_literal $Builtin.Int1, 0
br bb3(%8 : $Builtin.Int1)
bb3(%10 : $Builtin.Int1):
cond_br %10, bb5, bb6
bb4:
unreachable
bb5:
br bb7(%3 : $Klass)
bb6:
strong_release %3 : $Klass
br bb10(%2 : $Builtin.Int64)
bb7(%16 : $Klass):
checked_cast_br %16 : $Klass to OtherKlass, bb9, bb8
bb8:
strong_release %16 : $Klass
br bb4
bb9(%20 : $OtherKlass):
return %20 : $OtherKlass
bb10(%22 : $Builtin.Int64):
%23 = apply %1() : $@convention(thin) () -> @owned Klass
checked_cast_br %23 : $Klass to OtherKlass, bb11, bb12
bb11(%25 : $OtherKlass):
%26 = integer_literal $Builtin.Int1, -1
br bb13(%26 : $Builtin.Int1)
bb12:
%28 = integer_literal $Builtin.Int1, 0
br bb13(%28 : $Builtin.Int1)
bb13(%30 : $Builtin.Int1):
cond_br %30, bb14, bb15
bb14:
br bb7(%23 : $Klass)
bb15:
cond_br undef, bb16, bb17
bb16:
br bb4
bb17:
br bb10(undef : $Builtin.Int64)
}