mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Use underscores rather than hyphens so that text editors understand the name as a single word.
380 lines
11 KiB
Plaintext
380 lines
11 KiB
Plaintext
// RUN: %target-sil-opt -test-runner %s | %FileCheck %s
|
|
|
|
class Klass {
|
|
}
|
|
|
|
enum FakeOptional<T> {
|
|
case some(T)
|
|
case none
|
|
}
|
|
|
|
enum E1 {
|
|
case A(Klass)
|
|
case B(Klass)
|
|
case C(Klass)
|
|
}
|
|
|
|
enum E2 {
|
|
case A(Klass)
|
|
case B(Klass)
|
|
case C
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_canonicalize_switch_enum1 :
|
|
// CHECK-NOT: default
|
|
// CHECK-LABEL: } // end sil function 'test_canonicalize_switch_enum1'
|
|
sil [ossa] @test_canonicalize_switch_enum1 : $@convention(thin) (@owned FakeOptional<Klass>) -> () {
|
|
bb0(%0 : @owned $FakeOptional<Klass>):
|
|
specify_test "simplify_cfg_canonicalize_switch_enum"
|
|
switch_enum %0 : $FakeOptional<Klass>, case #FakeOptional.none!enumelt: bb1, default bb2
|
|
|
|
bb1:
|
|
br bb3
|
|
|
|
bb2(%5 : @owned $Klass):
|
|
destroy_value %5 : $Klass
|
|
br bb3
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_canonicalize_switch_enum2 :
|
|
// CHECK: default
|
|
// CHECK-LABEL: } // end sil function 'test_canonicalize_switch_enum2'
|
|
sil [ossa] @test_canonicalize_switch_enum2 : $@convention(thin) (@owned E1) -> () {
|
|
bb0(%0 : @owned $E1):
|
|
specify_test "simplify_cfg_canonicalize_switch_enum"
|
|
switch_enum %0 : $E1, case #E1.A!enumelt: bb1, default bb2
|
|
|
|
bb1(%2 : @owned $Klass):
|
|
destroy_value %2 : $Klass
|
|
br bb3
|
|
|
|
bb2(%5 : @owned $E1):
|
|
destroy_value %5 : $E1
|
|
br bb3
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_canonicalize_switch_enum3 :
|
|
// CHECK: default
|
|
// CHECK-LABEL: } // end sil function 'test_canonicalize_switch_enum3'
|
|
sil [ossa] @test_canonicalize_switch_enum3 : $@convention(thin) (@owned E2) -> () {
|
|
bb0(%0 : @owned $E2):
|
|
specify_test "simplify_cfg_canonicalize_switch_enum"
|
|
switch_enum %0 : $E2, case #E2.A!enumelt: bb1, default bb2
|
|
|
|
bb1(%2 : @owned $Klass):
|
|
destroy_value %2 : $Klass
|
|
br bb3
|
|
|
|
bb2(%5 : @owned $E2):
|
|
destroy_value %5 : $E2
|
|
br bb3
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum1 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum1'
|
|
sil [ossa] @test_simplify_switch_enum1 : $@convention(thin) (@owned Klass) -> () {
|
|
bb0(%0 : @owned $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_block @instruction[1]"
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
br bb3
|
|
|
|
bb1(%3 : @owned $Klass):
|
|
destroy_value %3 : $Klass
|
|
br bb3
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum2 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum2'
|
|
sil [ossa] @test_simplify_switch_enum2 : $@convention(thin) (@guaranteed Klass) -> () {
|
|
bb0(%0 : @guaranteed $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_block @instruction[1]"
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
br bb3
|
|
|
|
bb1(%3 : @guaranteed $Klass):
|
|
br bb3
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum3 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum3'
|
|
sil [ossa] @test_simplify_switch_enum3 : $@convention(thin) (@owned Klass) -> () {
|
|
bb0(%0 : @owned $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_block @instruction[2]"
|
|
%b = begin_borrow %0 : $Klass
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %b : $Klass
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
br bb3
|
|
|
|
bb1(%3 : @guaranteed $Klass):
|
|
br bb3
|
|
|
|
bb3:
|
|
end_borrow %b : $Klass
|
|
destroy_value %0 : $Klass
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
sil @use_optional : $@convention(thin) (@guaranteed FakeOptional<Klass>) -> ()
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum4 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum4'
|
|
sil [ossa] @test_simplify_switch_enum4 : $@convention(thin) (@guaranteed Klass) -> () {
|
|
bb0(%0 : @guaranteed $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_block @instruction[3]"
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
|
|
%f = function_ref @use_optional : $@convention(thin) (@guaranteed FakeOptional<Klass>) -> ()
|
|
%c = apply %f(%1) : $@convention(thin) (@guaranteed FakeOptional<Klass>) -> ()
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
br bb3
|
|
|
|
bb1(%3 : @guaranteed $Klass):
|
|
br bb3
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum5 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum5'
|
|
sil [ossa] @test_simplify_switch_enum5 : $@convention(thin) (@owned Klass) -> () {
|
|
bb0(%0 : @owned $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_block @instruction[4]"
|
|
%b = begin_borrow %0 : $Klass
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %b : $Klass
|
|
%f = function_ref @use_optional : $@convention(thin) (@guaranteed FakeOptional<Klass>) -> ()
|
|
%c = apply %f(%1) : $@convention(thin) (@guaranteed FakeOptional<Klass>) -> ()
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
br bb3
|
|
|
|
bb1(%3 : @guaranteed $Klass):
|
|
br bb3
|
|
|
|
bb3:
|
|
end_borrow %b : $Klass
|
|
destroy_value %0 : $Klass
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum6 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum6'
|
|
sil [ossa] @test_simplify_switch_enum6 : $@convention(thin) (@owned Klass) -> () {
|
|
bb0(%0 : @owned $Klass):
|
|
cond_br undef, bb1, bb2
|
|
|
|
bb1:
|
|
%2 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
|
|
br bb3(%2 : $FakeOptional<Klass>)
|
|
|
|
bb2:
|
|
%4 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
|
|
br bb3(%4 : $FakeOptional<Klass>)
|
|
|
|
bb3(%6 :@owned $FakeOptional<Klass>):
|
|
specify_test "simplify_cfg_simplify_switch_enum_block @instruction[5]"
|
|
switch_enum %6 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb4, case #FakeOptional.none!enumelt: bb5
|
|
|
|
bb4(%8 : @owned $Klass):
|
|
destroy_value %8 : $Klass
|
|
br bb6
|
|
|
|
bb5:
|
|
br bb6
|
|
|
|
bb6:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable1 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable1'
|
|
sil [ossa] @test_simplify_switch_enum_unreachable1 : $@convention(thin) (@owned Klass) -> () {
|
|
bb0(%0 : @owned $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_unreachable_blocks @instruction[1]"
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
unreachable
|
|
|
|
bb1(%3 : @owned $Klass):
|
|
destroy_value %3 : $Klass
|
|
unreachable
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable2 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable2'
|
|
sil [ossa] @test_simplify_switch_enum_unreachable2 : $@convention(thin) (@owned Klass) -> () {
|
|
bb0(%0 : @owned $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_unreachable_blocks @instruction[1]"
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
unreachable
|
|
|
|
bb1(%3 : @owned $Klass):
|
|
destroy_value %3 : $Klass
|
|
br bb3
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
|
|
// This case does not get optimized because the some block has instructions other than unreachable
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable3 :
|
|
// CHECK: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable3'
|
|
sil [ossa] @test_simplify_switch_enum_unreachable3 : $@convention(thin) (@owned Klass) -> () {
|
|
bb0(%0 : @owned $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_unreachable_blocks @instruction[1]"
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
br bb3
|
|
|
|
bb1(%3 : @owned $Klass):
|
|
destroy_value %3 : $Klass
|
|
unreachable
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable4 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable4'
|
|
sil [ossa] @test_simplify_switch_enum_unreachable4 : $@convention(thin) (@guaranteed Klass) -> () {
|
|
bb0(%0 : @guaranteed $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_unreachable_blocks @instruction[1]"
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
unreachable
|
|
|
|
bb1(%3 : @guaranteed $Klass):
|
|
unreachable
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable5 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable5'
|
|
sil [ossa] @test_simplify_switch_enum_unreachable5 : $@convention(thin) (@owned Klass) -> () {
|
|
bb0(%0 : @owned $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_unreachable_blocks @instruction[2]"
|
|
%b = begin_borrow %0 : $Klass
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %b : $Klass
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
unreachable
|
|
|
|
bb1(%3 : @guaranteed $Klass):
|
|
unreachable
|
|
|
|
bb3:
|
|
end_borrow %b : $Klass
|
|
destroy_value %0 : $Klass
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable6 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable6'
|
|
sil [ossa] @test_simplify_switch_enum_unreachable6 : $@convention(thin) (@guaranteed Klass) -> () {
|
|
bb0(%0 : @guaranteed $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_unreachable_blocks @instruction[1]"
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %0 : $Klass
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
unreachable
|
|
|
|
bb1(%3 : @guaranteed $Klass):
|
|
br bb3
|
|
|
|
bb3:
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|
|
// CHECK-LABEL: sil [ossa] @test_simplify_switch_enum_unreachable7 :
|
|
// CHECK-NOT: switch_enum
|
|
// CHECK-LABEL: } // end sil function 'test_simplify_switch_enum_unreachable7'
|
|
sil [ossa] @test_simplify_switch_enum_unreachable7 : $@convention(thin) (@owned Klass) -> () {
|
|
bb0(%0 : @owned $Klass):
|
|
specify_test "simplify_cfg_simplify_switch_enum_unreachable_blocks @instruction[2]"
|
|
%b = begin_borrow %0 : $Klass
|
|
%1 = enum $FakeOptional<Klass>, #FakeOptional.some!enumelt, %b : $Klass
|
|
switch_enum %1 : $FakeOptional<Klass>, case #FakeOptional.some!enumelt: bb1, case #FakeOptional.none!enumelt: bb2
|
|
|
|
bb2:
|
|
unreachable
|
|
|
|
bb1(%3 : @guaranteed $Klass):
|
|
br bb3
|
|
|
|
bb3:
|
|
end_borrow %b : $Klass
|
|
destroy_value %0 : $Klass
|
|
%t = tuple ()
|
|
return %t : $()
|
|
}
|
|
|