@@ -470,10 +470,10 @@ enum SinglePayloadNoXI2 {
470
470
// CHECK-32: define{{( dllexport)?}}{{( protected)?}} swiftcc i1 @select_enum([[WORD:i32]] %0, i8 %1)
471
471
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc i1 @select_enum([[WORD:i64]] %0, i8 %1)
472
472
// CHECK: entry:
473
- // CHECK: [[TAG:%.*]] = trunc i8 %1 to i1
474
473
// 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
477
477
// CHECK: ret i1 [[RES]]
478
478
// CHECK: }
479
479
@@ -490,7 +490,7 @@ bb0(%0 : $SinglePayloadNoXI2):
490
490
sil @single_payload_no_xi_switch : $@convention(thin) (SinglePayloadNoXI2) -> () {
491
491
// CHECK: entry:
492
492
entry(%u : $SinglePayloadNoXI2):
493
- // CHECK: %2 = trunc i8
493
+ // CHECK: %2 = icmp eq i8 %1, 1
494
494
// CHECK: br i1 %2, label %[[TAGS:[0-9]+]], label %[[X_DEST:[0-9]+]]
495
495
// CHECK: [[TAGS]]:
496
496
// CHECK: switch [[WORD]] %0, label %[[DFLT:[0-9]+]] [
564
564
sil @single_payload_no_xi_switch_arg : $@convention(thin) (SinglePayloadNoXI2) -> () {
565
565
// CHECK: entry:
566
566
entry(%u : $SinglePayloadNoXI2):
567
- // CHECK: %2 = trunc i8
567
+ // CHECK: %2 = icmp eq i8 %1, 1
568
568
// CHECK: br i1 %2, label %[[TAGS:[0-9]+]], label %[[X_PREDEST:[0-9]+]]
569
569
// CHECK: [[TAGS]]:
570
570
// CHECK: switch [[WORD]] %0, label %[[DFLT:[0-9]+]] [
@@ -633,7 +633,7 @@ entry(%0 : $Builtin.Word):
633
633
// CHECK: entry:
634
634
// CHECK: store [[WORD]] %0, ptr %1
635
635
// 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]]
637
637
// CHECK: ret void
638
638
// CHECK: }
639
639
sil @single_payload_no_xi_inject_x_indirect : $(Builtin.Word, @inout SinglePayloadNoXI2) -> () {
@@ -659,7 +659,7 @@ entry:
659
659
// CHECK: entry:
660
660
// CHECK: store [[WORD]] 0, ptr %0
661
661
// 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]]
663
663
// CHECK: ret void
664
664
// CHECK: }
665
665
sil @single_payload_no_xi_inject_y_indirect : $(@inout SinglePayloadNoXI2) -> () {
@@ -1593,12 +1593,10 @@ enum MultiPayloadOneSpareBit {
1593
1593
// CHECK-64: define{{( dllexport)?}}{{( protected)?}} swiftcc void @multi_payload_one_spare_bit_switch(i64 %0, i8 %1) {{.*}} {
1594
1594
sil @multi_payload_one_spare_bit_switch : $(MultiPayloadOneSpareBit) -> () {
1595
1595
entry(%u : $MultiPayloadOneSpareBit):
1596
- // CHECK-64: [[NATIVECC_TRUNC:%.*]] = trunc i8 %1 to i1
1597
1596
// CHECK-64: [[SPARE_TAG_LSHR:%.*]] = lshr i64 %0, 63
1598
1597
// CHECK-64: [[SPARE_TAG_TRUNC:%.*]] = trunc i64 [[SPARE_TAG_LSHR]] to i8
1599
1598
// 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
1602
1600
// CHECK-64: [[TAG:%.*]] = or i8 [[SPARE_TAG]], [[EXTRA_TAG]]
1603
1601
// CHECK-64: switch i8 [[TAG]], label %[[UNREACHABLE:[0-9]+]] [
1604
1602
// CHECK-64: i8 0, label %[[X_PREDEST:[0-9]+]]
@@ -1681,7 +1679,7 @@ sil @multi_payload_one_spare_bit_switch_indirect : $(@inout MultiPayloadOneSpare
1681
1679
entry(%u : $*MultiPayloadOneSpareBit):
1682
1680
// CHECK-64: [[PAYLOAD:%.*]] = load i64, ptr %0
1683
1681
// 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]]
1685
1683
// CHECK-64: switch i8 {{%.*}}
1686
1684
// CHECK-64: switch i64 [[PAYLOAD]]
1687
1685
// CHECK-64: {{[0-9]+}}:
@@ -1748,7 +1746,7 @@ entry(%0 : $Builtin.Int62):
1748
1746
// CHECK-64: [[PAYLOAD_MASKED:%.*]] = and i64 [[PAYLOAD]], 9223372036854775807
1749
1747
// CHECK-64: store i64 [[PAYLOAD_MASKED]], ptr %1
1750
1748
// 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]]
1752
1750
// CHECK-64: ret void
1753
1751
// CHECK-64: }
1754
1752
sil @multi_payload_one_spare_bit_inject_x_indirect : $(Builtin.Int62, @inout MultiPayloadOneSpareBit) -> () {
@@ -1788,7 +1786,7 @@ entry(%0 : $Builtin.Int63):
1788
1786
// CHECK-64: [[PAYLOAD_TAGGED:%.*]] = or i64 [[PAYLOAD_MASKED]], -9223372036854775808
1789
1787
// CHECK-64: store i64 [[PAYLOAD_TAGGED]], ptr %1
1790
1788
// 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]]
1792
1790
// CHECK-64: ret void
1793
1791
// CHECK-64: }
1794
1792
@@ -1831,7 +1829,7 @@ entry:
1831
1829
// -- 0x8000_0000_0000_0000
1832
1830
// CHECK-64: store i64 -9223372036854775808, ptr %0
1833
1831
// 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]]
1835
1833
// CHECK-64: ret void
1836
1834
// CHECK-64: }
1837
1835
sil @multi_payload_one_spare_bit_inject_a_indirect : $(@inout MultiPayloadOneSpareBit) -> () {
@@ -2227,8 +2225,9 @@ enum MultiPayloadNested {
2227
2225
// CHECK: %3 = getelementptr
2228
2226
// CHECK: %4 = load i8, ptr %3
2229
2227
// 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
2232
2231
sil @multi_payload_nested_switch : $(@in MultiPayloadNested) -> () {
2233
2232
entry(%c : $*MultiPayloadNested):
2234
2233
switch_enum_addr %c : $*MultiPayloadNested, case #MultiPayloadNested.A!enumelt: a_dest, case #MultiPayloadNested.B!enumelt: b_dest
@@ -2259,8 +2258,10 @@ enum MultiPayloadNestedSpareBits {
2259
2258
// CHECK-64: entry:
2260
2259
// CHECK-64: %1 = load [[WORD]], ptr %0
2261
2260
// 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
2264
2265
sil @multi_payload_nested_spare_bits_switch : $(@in MultiPayloadNestedSpareBits) -> () {
2265
2266
entry(%c : $*MultiPayloadNestedSpareBits):
2266
2267
switch_enum_addr %c : $*MultiPayloadNestedSpareBits, case #MultiPayloadNestedSpareBits.A!enumelt: a_dest, case #MultiPayloadNestedSpareBits.B!enumelt: b_dest
@@ -2459,7 +2460,7 @@ entry(%x : $Int32):
2459
2460
// CHECK-64: [[INT_ZEXT:%.*]] = zext i32 %0 to i64
2460
2461
// CHECK-64: [[INT_SHL:%.*]] = shl i64 [[INT_ZEXT]], 32
2461
2462
%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
2463
2464
// CHECK-64: [[INT_SHR:%.*]] = lshr i64 [[INT_SHL]], 32
2464
2465
// CHECK-64: [[INT:%.*]] = trunc i64 [[INT_SHR]] to i32
2465
2466
%e = unchecked_enum_data %d : $Optional<(Optional<()>, Int32)>, #Optional.some!enumelt
0 commit comments