@@ -97,6 +97,8 @@ import Swift
97
97
98
98
// CHECK: [[DYNAMIC_SINGLETON:%O4enum16DynamicSingleton.*]] = type <{}>
99
99
100
+ // CHECK: %O4enum40MultiPayloadLessThan32BitsWithEmptyCases = type <{ [1 x i8], [1 x i8] }>
101
+
100
102
// -- Dynamic metadata template carries a value witness table pattern
101
103
// we fill in on instantiation.
102
104
// The witness table pattern includes extra inhabitant witness
@@ -2628,3 +2630,51 @@ bb4:
2628
2630
// CHECK-64: %5 = or i128 %2, %4
2629
2631
// -- 0x1__0000_0000_0000_0000
2630
2632
// CHECK-64: %6 = or i128 %5, 18446744073709551616
2633
+
2634
+ // CHECK-LABEL: define linkonce_odr hidden i32 @_TwugO4enum40MultiPayloadLessThan32BitsWithEmptyCases(%swift.opaque* %value
2635
+ // CHECK: [[VAL00:%.*]] = bitcast %swift.opaque* %value to %O4enum40MultiPayloadLessThan32BitsWithEmptyCases*
2636
+ // CHECK: [[VAL01:%.*]] = bitcast %O4enum40MultiPayloadLessThan32BitsWithEmptyCases* [[VAL00]] to i8*
2637
+ // CHECK: [[VAL02:%.*]] = load {{.*}} [[VAL01]]
2638
+ // CHECK: [[VAL03:%.*]] = getelementptr inbounds {{.*}} [[VAL00]], i32 0, i32 1
2639
+ // CHECK: [[VAL04:%.*]] = bitcast {{.*}} [[VAL03]] to i2*
2640
+ // CHECK: [[VAL05:%.*]] = load {{.*}} [[VAL04]]
2641
+ // CHECK: [[VAL06:%.*]] = zext i2 [[VAL05]] to i32
2642
+ // CHECK: [[VAL07:%.*]] = sub i32 [[VAL06]], 2
2643
+ // CHECK: [[VAL08:%.*]] = zext i8 [[VAL02]] to i32
2644
+ // CHECK: [[VAL09:%.*]] = and i32 [[VAL08]], 255
2645
+ // CHECK: [[VAL10:%.*]] = icmp sge i32 [[VAL07]], 0
2646
+ // CHECK: [[VAL11:%.*]] = select i1 [[VAL10]], i32 [[VAL09]], i32 [[VAL07]]
2647
+ // CHECK: ret i32 [[VAL11]]
2648
+
2649
+ // CHECK-LABEL: define linkonce_odr hidden void @_TwuiO4enum40MultiPayloadLessThan32BitsWithEmptyCases(%swift.opaque* %value, i32 %tag
2650
+ // CHECK: entry:
2651
+ // CHECK: [[VAL00:%.*]] = bitcast %swift.opaque* %value
2652
+ // CHECK: [[VAL01:%.*]] = icmp sge i32 %tag, 0
2653
+ // CHECK: br i1 [[VAL01]], label %[[TLABEL:.*]], label %[[FLABEL:.*]]
2654
+
2655
+ // CHECK: <label>:[[TLABEL]]
2656
+ // CHECK: [[VAL03:%.*]] = trunc i32 %tag to i8
2657
+ // CHECK: [[VAL04:%.*]] = bitcast %O4enum40MultiPayloadLessThan32BitsWithEmptyCases* [[VAL00]] to i8*
2658
+ // CHECK: store i8 [[VAL03]], i8* [[VAL04]]
2659
+ // CHECK: [[VAL05:%.*]] = getelementptr inbounds {{.*}} [[VAL00]], i32 0, i32 1
2660
+ // CHECK: [[VAL06:%.*]] = bitcast [1 x i8]* [[VAL05]] to i2*
2661
+ // CHECK: store i2 -2, i2* [[VAL06]]
2662
+ // CHECK: br label %[[RLABEL:.*]]
2663
+
2664
+ // CHECK: <label>:[[FLABEL]]
2665
+ // CHECK: [[VAL08:%.*]] = add i32 %tag, 2
2666
+ // CHECK: [[VAL09:%.*]] = trunc i32 [[VAL08]] to i2
2667
+ // CHECK: [[VAL10:%.*]] = getelementptr inbounds {{.*}} [[VAL00]], i32 0, i32 1
2668
+ // CHECK: [[VAL11:%.*]] = bitcast [1 x i8]* [[VAL10]] to i2*
2669
+ // CHECK: store i2 [[VAL09]], i2* [[VAL11]]
2670
+ // CHECK: br label %[[RLABEL]]
2671
+
2672
+ // CHECK: <label>:[[RLABEL]]
2673
+ // CHECK: ret void
2674
+
2675
+ enum MultiPayloadLessThan32BitsWithEmptyCases {
2676
+ case A
2677
+ case B
2678
+ case C(Builtin.Int8)
2679
+ case D(Builtin.Int8)
2680
+ }
0 commit comments