mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
These were added in https://github.com/swiftlang/swift/pull/81375 (and several other follow-up PRs because we missed a few places) and are no longer needed.
98 lines
4.4 KiB
Plaintext
98 lines
4.4 KiB
Plaintext
// RUN: %target-swift-frontend -Xllvm -sil-disable-pass=simplification -gnone -emit-ir %s | %FileCheck %s
|
|
|
|
import Builtin
|
|
|
|
enum SinglePayloadSingleEmpty {
|
|
case EmptyCase
|
|
case DataCase(Builtin.Word)
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc void @select_enum_SinglePayloadSingleEmpty(ptr noalias captures(none) dereferenceable({{.*}}) %0)
|
|
sil @select_enum_SinglePayloadSingleEmpty : $@convention(thin) (@in SinglePayloadSingleEmpty) -> () {
|
|
bb0(%0 : $*SinglePayloadSingleEmpty):
|
|
%1 = load %0 : $*SinglePayloadSingleEmpty
|
|
// CHECK: [[PAYLOAD1:%[0-9]+]] = load [[WORD_TY:(i32|i64)]], ptr
|
|
// CHECK: [[TAG1:%[0-9]+]] = load i8, ptr
|
|
// CHECK: [[TAG1_TRUNC0:%.*]] = icmp eq i8 [[TAG1]], 1
|
|
|
|
%2 = integer_literal $Builtin.Int32, 2
|
|
%3 = integer_literal $Builtin.Int32, 3
|
|
|
|
// CHECK: select i1 [[TAG1_TRUNC0]], i32 2, i32 3
|
|
%4 = select_enum %1 : $SinglePayloadSingleEmpty, case #SinglePayloadSingleEmpty.EmptyCase!enumelt: %2, case #SinglePayloadSingleEmpty.DataCase!enumelt: %3 : $Builtin.Int32
|
|
|
|
// CHECK: [[TAG1_TRUNC1:%.*]] = icmp eq i8 [[TAG1]], 1
|
|
// CHECK: [[V3:%[0-9]+]] = xor i1 [[TAG1_TRUNC1]], true
|
|
// CHECK-NEXT: select i1 [[V3]], i32 3, i32 2
|
|
%5 = select_enum %1 : $SinglePayloadSingleEmpty, case #SinglePayloadSingleEmpty.DataCase!enumelt: %3, case #SinglePayloadSingleEmpty.EmptyCase!enumelt: %2 : $Builtin.Int32
|
|
|
|
// CHECK: [[PAYLOAD0:%[0-9]+]] = load [[WORD_TY:(i32|i64)]], ptr
|
|
// CHECK: [[TAG0:%[0-9]+]] = load i8, ptr
|
|
// CHECK: [[TAG0_TRUNC0:%.*]] = icmp eq i8 [[TAG0]], 1
|
|
|
|
// CHECK: select i1 [[TAG0_TRUNC0]], i32 2, i32 3
|
|
%6 = select_enum_addr %0 : $*SinglePayloadSingleEmpty, case #SinglePayloadSingleEmpty.EmptyCase!enumelt: %2, case #SinglePayloadSingleEmpty.DataCase!enumelt: %3 : $Builtin.Int32
|
|
|
|
// CHECK: [[TAG1_TRUNC2:%.*]] = icmp eq i8 [[TAG1]], 1
|
|
// CHECK-NEXT: select i1 [[TAG1_TRUNC2]], i32 2, i32 3
|
|
%7 = select_enum %1 : $SinglePayloadSingleEmpty, case #SinglePayloadSingleEmpty.EmptyCase!enumelt: %2, default %3 : $Builtin.Int32
|
|
|
|
return undef : $()
|
|
}
|
|
|
|
enum TwoCasesNoPayload { case X, Y }
|
|
|
|
enum MyOptional<T> {
|
|
case some(T), none
|
|
}
|
|
|
|
|
|
sil @select_enum_TwoCasesNoPayload :$ @convention(thin) (@in TwoCasesNoPayload, @in MyOptional<TwoCasesNoPayload>) -> () {
|
|
bb0(%0 : $*TwoCasesNoPayload, %10 : $*MyOptional<TwoCasesNoPayload>):
|
|
// CHECK: [[PAYLOAD1:%[0-9]+]] = load i8, ptr
|
|
%1 = load %0 : $*TwoCasesNoPayload
|
|
|
|
%2 = integer_literal $Builtin.Int32, 2
|
|
%3 = integer_literal $Builtin.Int32, 42
|
|
|
|
// CHECK-NEXT: [[V2:%[0-9]+]] = icmp eq i8 [[PAYLOAD1]], 0
|
|
// CHECK-NEXT: select i1 [[V2]], i32 2, i32 42
|
|
%4 = select_enum %1 : $TwoCasesNoPayload, case #TwoCasesNoPayload.X!enumelt: %2, case #TwoCasesNoPayload.Y!enumelt: %3 : $Builtin.Int32
|
|
|
|
// CHECK-NEXT: [[V2:%[0-9]+]] = icmp eq i8 [[PAYLOAD1]], 1
|
|
// CHECK-NEXT: select i1 [[V2]], i32 42, i32 2
|
|
%5 = select_enum %1 : $TwoCasesNoPayload, case #TwoCasesNoPayload.Y!enumelt: %3, default %2 : $Builtin.Int32
|
|
|
|
|
|
// CHECK: [[PAYLOAD2:%[0-9]+]] = load i8, ptr
|
|
%11 = load %10 : $*MyOptional<TwoCasesNoPayload>
|
|
|
|
// CHECK-NEXT: [[V1:%[0-9]+]] = icmp eq i8 [[PAYLOAD2]], 2
|
|
// CHECK-NEXT: [[V2:%[0-9]+]] = xor i1 [[V1]], true
|
|
// CHECK: = select i1 [[V2]], i32 2, i32 42
|
|
%14 = select_enum %11 : $MyOptional<TwoCasesNoPayload>, case #MyOptional.some!enumelt: %2, case #MyOptional.none!enumelt: %3 : $Builtin.Int32
|
|
|
|
// CHECK-NEXT: [[V1:%[0-9]+]] = icmp eq i8 [[PAYLOAD2]], 2
|
|
// CHECK: = select i1 [[V1]], i32 42, i32 2
|
|
%15 = select_enum %11 : $MyOptional<TwoCasesNoPayload>, case #MyOptional.none!enumelt: %3, default %2 : $Builtin.Int32
|
|
|
|
return undef : $()
|
|
}
|
|
|
|
enum NoPayloadSingleton {
|
|
case One
|
|
}
|
|
|
|
// CHECK-LABEL: define{{( dllexport)?}}{{( protected)?}} swiftcc i1 @testOptionalOfNoPayloadSingleton(i8 %0)
|
|
sil @testOptionalOfNoPayloadSingleton : $@convention(thin) (MyOptional<NoPayloadSingleton>) -> Builtin.Int1 {
|
|
bb0(%0 : $MyOptional<NoPayloadSingleton>):
|
|
// CHECK: [[NATIVECCTRUNC:%.*]] = icmp eq i8 %0, 1
|
|
// CHECK: [[NOT:%.*]] = xor i1 [[NATIVECCTRUNC]], true
|
|
// CHECK: ret i1 [[NOT]]
|
|
%4 = integer_literal $Builtin.Int1, -1 // users: %6, %7
|
|
%5 = integer_literal $Builtin.Int1, 0 // user: %6
|
|
%6 = select_enum %0 : $MyOptional<NoPayloadSingleton>, case #MyOptional.none!enumelt: %4, case #MyOptional.some!enumelt: %5 : $Builtin.Int1 // user: %7
|
|
%7 = builtin "xor_Int1"(%6 : $Builtin.Int1, %4 : $Builtin.Int1) : $Builtin.Int1 // user: %8
|
|
return %7 : $Builtin.Int1
|
|
}
|