mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Replace `unconditional_checked_cast` to an existential metatype with an `init_existential_metatype`, it the source is a conforming type. Note that init_existential_metatype is better than unconditional_checked_cast because it does not need to do any runtime casting.
53 lines
1.3 KiB
Plaintext
53 lines
1.3 KiB
Plaintext
// RUN: %target-sil-opt -enable-copy-propagation=requested-passes-only -enable-sil-verify-all %s -sil-combine -remove-runtime-asserts | %FileCheck %s
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
class RawBuffer {}
|
|
class HeapBufferStorage<T, U> : RawBuffer {}
|
|
|
|
class C {
|
|
}
|
|
class D : C {
|
|
}
|
|
class E {
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_cond_fail
|
|
// CHECK: bb0
|
|
// CHECK-NEXT: tuple ()
|
|
// CHECK-NEXT: return
|
|
sil [ossa] @test_cond_fail : $@convention(thin) (Builtin.Int1) -> () {
|
|
bb0(%0 : $Builtin.Int1):
|
|
cond_fail %0 : $Builtin.Int1
|
|
%2 = tuple ()
|
|
return %2 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_unconditional_checked_cast_addr_fail
|
|
// CHECK: bb0
|
|
// CHECK: unreachable
|
|
// CHECK: }
|
|
sil [ossa] @test_unconditional_checked_cast_addr_fail : $@convention(thin) (@in E, @in D) -> @out D {
|
|
bb0(%0 : $*D, %1 : $*E, %2 : $*D):
|
|
unconditional_checked_cast_addr E in %1 : $*E to D in %0 : $*D
|
|
%4 = load [take] %2 : $*D
|
|
destroy_value %4 : $D
|
|
%6 = tuple ()
|
|
return %6 : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_unconditional_checked_cast_other_use
|
|
// CHECK: bb0([[ARG:%.*]] : @owned $C
|
|
// CHECK-NEXT: return [[ARG]]
|
|
sil [ossa] @test_unconditional_checked_cast_other_use : $@convention(thin) (@owned C) -> @owned C {
|
|
bb0(%0 : @owned $C):
|
|
%0a = copy_value %0 : $C
|
|
%3 = unconditional_checked_cast %0a : $C to C
|
|
destroy_value %0 : $C
|
|
return %3 : $C
|
|
}
|
|
|