mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
SIL type lowering erases DynamicSelfType, so we generate incorrect code when casting to DynamicSelfType. Fixing this requires a fair amount of plumbing, but most of the changes are mechanical. Note that the textual SIL syntax for casts has changed slightly; the target type is now a formal type without a '$', not a SIL type. Also, the unconditional_checked_cast_value and checked_cast_value_br instructions now take the _source_ formal type as well, just like the *_addr forms they are intended to replace.
95 lines
2.5 KiB
Plaintext
95 lines
2.5 KiB
Plaintext
// RUN: %target-sil-opt -enable-sil-verify-all %s -jumpthread-simplify-cfg | %FileCheck %s
|
|
|
|
// Two select_enum instructions must not be considered as the same "condition",
|
|
// even if they have the same enum operand.
|
|
// This test checks that SimplifyCFG does not remove a dominated terminator with
|
|
// such a condition.
|
|
|
|
sil_stage canonical
|
|
|
|
import Builtin
|
|
import Swift
|
|
|
|
enum E {
|
|
case A
|
|
case B
|
|
case C
|
|
}
|
|
|
|
class Base { }
|
|
|
|
class Derived1 : Base { }
|
|
|
|
class Derived2 : Base { }
|
|
|
|
// CHECK-LABEL: sil @test_checked_cast_br
|
|
// CHECK: select_enum
|
|
// CHECK: checked_cast_br
|
|
// CHECK: integer_literal $Builtin.Int64, 1
|
|
// CHECK: select_enum
|
|
// CHECK: checked_cast_br
|
|
// CHECK: integer_literal $Builtin.Int64, 2
|
|
// CHECK: integer_literal $Builtin.Int64, 3
|
|
// CHECK: return
|
|
sil @test_checked_cast_br : $@convention(thin) (E, @owned Base, @owned Base, @owned Base, @owned Base) -> Builtin.Int64 {
|
|
bb0(%0 : $E, %1 : $Base, %2 : $Base, %3 : $Base, %4 : $Base):
|
|
%s1 = select_enum %0 : $E, case #E.A!enumelt: %1, default %2 : $Base
|
|
checked_cast_br %s1 : $Base to Derived1, bb1, bb2
|
|
|
|
bb1(%a1 : $Derived1):
|
|
%i1 = integer_literal $Builtin.Int64, 1
|
|
br bb5(%i1 : $Builtin.Int64)
|
|
|
|
bb2:
|
|
%s2 = select_enum %0 : $E, case #E.B!enumelt: %3, default %4 : $Base
|
|
checked_cast_br %s2 : $Base to Derived1, bb3, bb4
|
|
|
|
bb3(%a2 : $Derived1):
|
|
%i2 = integer_literal $Builtin.Int64, 2
|
|
br bb5(%i2 : $Builtin.Int64)
|
|
|
|
bb4:
|
|
%i3 = integer_literal $Builtin.Int64, 3
|
|
br bb5(%i3 : $Builtin.Int64)
|
|
|
|
bb5(%a3 : $Builtin.Int64):
|
|
return %a3 : $Builtin.Int64
|
|
}
|
|
|
|
// CHECK-LABEL: sil @test_cond_br
|
|
// CHECK: select_enum
|
|
// CHECK: cond_br
|
|
// CHECK: integer_literal $Builtin.Int64, 1
|
|
// CHECK: select_enum
|
|
// CHECK: cond_br
|
|
// CHECK: integer_literal $Builtin.Int64, 2
|
|
// CHECK: integer_literal $Builtin.Int64, 3
|
|
// CHECK: return
|
|
sil @test_cond_br : $@convention(thin) (E, @owned Base, @owned Base, @owned Base, @owned Base) -> Builtin.Int64 {
|
|
bb0(%0 : $E, %1 : $Base, %2 : $Base, %3 : $Base, %4 : $Base):
|
|
%t1 = integer_literal $Builtin.Int1, -1
|
|
%f1 = integer_literal $Builtin.Int1, 0
|
|
%s1 = select_enum %0 : $E, case #E.A!enumelt: %t1, default %f1 : $Builtin.Int1
|
|
cond_br %s1, bb1, bb2
|
|
|
|
bb1:
|
|
%i1 = integer_literal $Builtin.Int64, 1
|
|
br bb5(%i1 : $Builtin.Int64)
|
|
|
|
bb2:
|
|
%s2 = select_enum %0 : $E, case #E.B!enumelt: %t1, default %f1 : $Builtin.Int1
|
|
cond_br %s2, bb3, bb4
|
|
|
|
bb3:
|
|
%i2 = integer_literal $Builtin.Int64, 2
|
|
br bb5(%i2 : $Builtin.Int64)
|
|
|
|
bb4:
|
|
%i3 = integer_literal $Builtin.Int64, 3
|
|
br bb5(%i3 : $Builtin.Int64)
|
|
|
|
bb5(%a3 : $Builtin.Int64):
|
|
return %a3 : $Builtin.Int64
|
|
}
|
|
|