@@ -470,10 +470,10 @@ enum SinglePayloadNoXI2 {
470470// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc i1 @select_enum([[WORD:i32]] %0, i8 %1)
471471// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc i1 @select_enum([[WORD:i64]] %0, i8 %1)
472472// CHECK: entry:
473- // CHECK: [[TAG:%.*]] = trunc i8 %1 to i1
474473// CHECK: [[PAYLOAD:%.*]] = icmp eq [[WORD]] %0, 1
475- // CHECK: [[MATCHES:%.*]] = and i1 [[TAG]], [[PAYLOAD]]
476- // CHECK: [[RES:%.*]] = select i1 [[MATCHES]], i1 false, i1 true
474+ // CHECK: [[TAG:%.*]] = icmp eq i8 %1, 1
475+ // CHECK: [[COMBINED:%.*]] = and i1 [[TAG]], [[PAYLOAD]]
476+ // CHECK: [[RES:%.*]] = select i1 [[COMBINED]], i1 false, i1 true
477477// CHECK: ret i1 [[RES]]
478478// CHECK: }
479479
@@ -490,7 +490,7 @@ bb0(%0 : $SinglePayloadNoXI2):
490490sil @single_payload_no_xi_switch : $@convention(thin) (SinglePayloadNoXI2) -> () {
491491// CHECK: entry:
492492entry(%u : $SinglePayloadNoXI2):
493- // CHECK: %2 = trunc i8
493+ // CHECK: %2 = icmp eq i8 %1, 1
494494// CHECK: br i1 %2, label %[[TAGS:[0-9]+]], label %[[X_DEST:[0-9]+]]
495495// CHECK: [[TAGS]]:
496496// CHECK: switch [[WORD]] %0, label %[[DFLT:[0-9]+]] [
564564sil @single_payload_no_xi_switch_arg : $@convention(thin) (SinglePayloadNoXI2) -> () {
565565// CHECK: entry:
566566entry(%u : $SinglePayloadNoXI2):
567- // CHECK: %2 = trunc i8
567+ // CHECK: %2 = icmp eq i8 %1, 1
568568// CHECK: br i1 %2, label %[[TAGS:[0-9]+]], label %[[X_PREDEST:[0-9]+]]
569569// CHECK: [[TAGS]]:
570570// CHECK: switch [[WORD]] %0, label %[[DFLT:[0-9]+]] [
@@ -633,7 +633,7 @@ entry(%0 : $Builtin.Word):
633633// CHECK: entry:
634634// CHECK: store [[WORD]] %0, ptr %1
635635// CHECK: [[T0:%.*]] = getelementptr inbounds %T4enum18SinglePayloadNoXI2O, ptr %1, i32 0, i32 1
636- // CHECK: store i1 false , ptr [[T0]]
636+ // CHECK: store i8 0 , ptr [[T0]]
637637// CHECK: ret void
638638// CHECK: }
639639sil @single_payload_no_xi_inject_x_indirect : $(Builtin.Word, @inout SinglePayloadNoXI2) -> () {
@@ -659,7 +659,7 @@ entry:
659659// CHECK: entry:
660660// CHECK: store [[WORD]] 0, ptr %0
661661// CHECK: [[T0:%.*]] = getelementptr inbounds %T4enum18SinglePayloadNoXI2O, ptr %0, i32 0, i32 1
662- // CHECK: store i1 true , ptr [[T0]]
662+ // CHECK: store i8 1 , ptr [[T0]]
663663// CHECK: ret void
664664// CHECK: }
665665sil @single_payload_no_xi_inject_y_indirect : $(@inout SinglePayloadNoXI2) -> () {
@@ -1593,12 +1593,10 @@ enum MultiPayloadOneSpareBit {
15931593// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_switch(i64 %0, i8 %1) {{.*}} {
15941594sil @multi_payload_one_spare_bit_switch : $(MultiPayloadOneSpareBit) -> () {
15951595entry(%u : $MultiPayloadOneSpareBit):
1596- // CHECK-64: [[NATIVECC_TRUNC:%.*]] = trunc i8 %1 to i1
15971596// CHECK-64: [[SPARE_TAG_LSHR:%.*]] = lshr i64 %0, 63
15981597// CHECK-64: [[SPARE_TAG_TRUNC:%.*]] = trunc i64 [[SPARE_TAG_LSHR]] to i8
15991598// CHECK-64: [[SPARE_TAG:%.*]] = and i8 [[SPARE_TAG_TRUNC]], 1
1600- // CHECK-64: [[EXTRA_TAG_ZEXT:%.*]] = zext i1 [[NATIVECC_TRUNC]] to i8
1601- // CHECK-64: [[EXTRA_TAG:%.*]] = shl i8 [[EXTRA_TAG_ZEXT]], 1
1599+ // CHECK-64: [[EXTRA_TAG:%.*]] = shl i8 %1, 1
16021600// CHECK-64: [[TAG:%.*]] = or i8 [[SPARE_TAG]], [[EXTRA_TAG]]
16031601// CHECK-64: switch i8 [[TAG]], label %[[UNREACHABLE:[0-9]+]] [
16041602// CHECK-64: i8 0, label %[[X_PREDEST:[0-9]+]]
@@ -1681,7 +1679,7 @@ sil @multi_payload_one_spare_bit_switch_indirect : $(@inout MultiPayloadOneSpare
16811679entry(%u : $*MultiPayloadOneSpareBit):
16821680// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %0
16831681// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, ptr %0, i32 0, i32 1
1684- // CHECK-64: [[TAG:%.*]] = load i1 , ptr [[T0]]
1682+ // CHECK-64: [[TAG:%.*]] = load i8 , ptr [[T0]]
16851683// CHECK-64: switch i8 {{%.*}}
16861684// CHECK-64: switch i64 [[PAYLOAD]]
16871685// CHECK-64: {{[0-9]+}}:
@@ -1748,7 +1746,7 @@ entry(%0 : $Builtin.Int62):
17481746// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
17491747// CHECK-64: store i64 [[PAYLOAD_MASKED]], ptr %1
17501748// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, ptr %1, i32 0, i32 1
1751- // CHECK-64: store i1 false , ptr [[T0]]
1749+ // CHECK-64: store i8 0 , ptr [[T0]]
17521750// CHECK-64: ret void
17531751// CHECK-64: }
17541752sil @multi_payload_one_spare_bit_inject_x_indirect : $(Builtin.Int62, @inout MultiPayloadOneSpareBit) -> () {
@@ -1788,7 +1786,7 @@ entry(%0 : $Builtin.Int63):
17881786// CHECK-64: [[PAYLOAD_TAGGED:%.*]] = or i64 [[PAYLOAD_MASKED]], -9223372036854775808
17891787// CHECK-64: store i64 [[PAYLOAD_TAGGED]], ptr %1
17901788// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, ptr %1, i32 0, i32 1
1791- // CHECK-64: store i1 false , ptr [[T0]]
1789+ // CHECK-64: store i8 0 , ptr [[T0]]
17921790// CHECK-64: ret void
17931791// CHECK-64: }
17941792
@@ -1831,7 +1829,7 @@ entry:
18311829// -- 0x8000_0000_0000_0000
18321830// CHECK-64: store i64 -9223372036854775808, ptr %0
18331831// CHECK-64: [[T0:%.*]] = getelementptr inbounds %T4enum23MultiPayloadOneSpareBitO, ptr %0, i32 0, i32 1
1834- // CHECK-64: store i1 true , ptr [[T0]]
1832+ // CHECK-64: store i8 1 , ptr [[T0]]
18351833// CHECK-64: ret void
18361834// CHECK-64: }
18371835sil @multi_payload_one_spare_bit_inject_a_indirect : $(@inout MultiPayloadOneSpareBit) -> () {
@@ -2227,8 +2225,9 @@ enum MultiPayloadNested {
22272225// CHECK: %3 = getelementptr
22282226// CHECK: %4 = load i8, ptr %3
22292227// CHECK: %5 = lshr i8 %4, 7
2230- // CHECK: %6 = trunc i8 %5 to i1
2231- // CHECK: br i1 %6
2228+ // CHECK: %6 = and i8 %5, 1
2229+ // CHECK: %7 = icmp ne i8 %6, 1
2230+ // CHECK: br i1 %7
22322231sil @multi_payload_nested_switch : $(@in MultiPayloadNested) -> () {
22332232entry(%c : $*MultiPayloadNested):
22342233 switch_enum_addr %c : $*MultiPayloadNested, case #MultiPayloadNested.A!enumelt: a_dest, case #MultiPayloadNested.B!enumelt: b_dest
@@ -2259,8 +2258,10 @@ enum MultiPayloadNestedSpareBits {
22592258// CHECK-64: entry:
22602259// CHECK-64: %1 = load [[WORD]], ptr %0
22612260// CHECK-64: %2 = lshr [[WORD]] %1, 61
2262- // CHECK-64: %3 = trunc [[WORD]] %2 to i1
2263- // CHECK-64: br i1 %3
2261+ // CHECK-64: %3 = trunc [[WORD]] %2 to i8
2262+ // CHECK-64: %4 = and i8 %3, 1
2263+ // CHECK-64: %5 = icmp ne i8 %4, 1
2264+ // CHECK-64: br i1 %5
22642265sil @multi_payload_nested_spare_bits_switch : $(@in MultiPayloadNestedSpareBits) -> () {
22652266entry(%c : $*MultiPayloadNestedSpareBits):
22662267 switch_enum_addr %c : $*MultiPayloadNestedSpareBits, case #MultiPayloadNestedSpareBits.A!enumelt: a_dest, case #MultiPayloadNestedSpareBits.B!enumelt: b_dest
@@ -2459,7 +2460,7 @@ entry(%x : $Int32):
24592460 // CHECK-64: [[INT_ZEXT:%.*]] = zext i32 %0 to i64
24602461 // CHECK-64: [[INT_SHL:%.*]] = shl i64 [[INT_ZEXT]], 32
24612462 %d = enum $Optional<(Optional<()>, Int32)>, #Optional.some!enumelt, %c : $(Optional<()>, Int32)
2462- // CHECK-64: [[BIT:%.*]] = trunc i64 [[INT_SHL]] to i1
2463+ // CHECK-64: [[BIT:%.*]] = trunc i64 [[INT_SHL]] to i8
24632464 // CHECK-64: [[INT_SHR:%.*]] = lshr i64 [[INT_SHL]], 32
24642465 // CHECK-64: [[INT:%.*]] = trunc i64 [[INT_SHR]] to i32
24652466 %e = unchecked_enum_data %d : $Optional<(Optional<()>, Int32)>, #Optional.some!enumelt
0 commit comments