@@ -233,7 +233,8 @@ int AssignInt(int V){
233
233
234
234
// CHECK: lor.end:
235
235
// CHECK-NEXT: [[H:%.*]] = phi i1 [ true, %entry ], [ [[G]], %lor.rhs ]
236
- // CHECK-NEXT: store i1 [[H]], ptr [[XAddr]], align 4
236
+ // CHECK-NEXT: [[J:%.*]] = zext i1 %9 to i32
237
+ // CHECK-NEXT: store i32 [[J]], ptr [[XAddr]], align 4
237
238
// CHECK-NEXT: [[I:%.*]] = load i32, ptr [[XAddr]], align 4
238
239
// CHECK-NEXT: [[LoadV:%.*]] = trunc i32 [[I]] to i1
239
240
// CHECK-NEXT: ret i1 [[LoadV]]
@@ -257,8 +258,8 @@ bool AssignBool(bool V) {
257
258
// CHECK-NEXT: store <2 x i32> [[A]], ptr [[X]], align 8
258
259
// CHECK-NEXT: [[B:%.*]] = load i32, ptr [[VAddr]], align 4
259
260
// CHECK-NEXT: [[LV1:%.*]] = trunc i32 [[B]] to i1
260
- // CHECK-NEXT: [[C:%.*]] = load <2 x i32>, ptr [[X]], align 8
261
261
// CHECK-NEXT: [[D:%.*]] = zext i1 [[LV1]] to i32
262
+ // CHECK-NEXT: [[C:%.*]] = load <2 x i32>, ptr [[X]], align 8
262
263
// CHECK-NEXT: [[E:%.*]] = insertelement <2 x i32> [[C]], i32 [[D]], i32 1
263
264
// CHECK-NEXT: store <2 x i32> [[E]], ptr [[X]], align 8
264
265
// CHECK-NEXT: ret void
@@ -275,8 +276,8 @@ void AssignBool2(bool V) {
275
276
// CHECK-NEXT: store <2 x i32> splat (i32 1), ptr [[X]], align 8
276
277
// CHECK-NEXT: [[Z:%.*]] = load <2 x i32>, ptr [[VAddr]], align 8
277
278
// CHECK-NEXT: [[LV:%.*]] = trunc <2 x i32> [[Z]] to <2 x i1>
278
- // CHECK-NEXT: [[A:%.*]] = load <2 x i32>, ptr [[X]], align 8
279
279
// CHECK-NEXT: [[B:%.*]] = zext <2 x i1> [[LV]] to <2 x i32>
280
+ // CHECK-NEXT: [[A:%.*]] = load <2 x i32>, ptr [[X]], align 8
280
281
// CHECK-NEXT: [[C:%.*]] = shufflevector <2 x i32> [[B]], <2 x i32> poison, <2 x i32> <i32 0, i32 1>
281
282
// CHECK-NEXT: store <2 x i32> [[C]], ptr [[X]], align 8
282
283
// CHECK-NEXT: ret void
@@ -302,3 +303,21 @@ bool2 AccessBools() {
302
303
bool4 X = true .xxxx;
303
304
return X.zw;
304
305
}
306
+
307
+ // CHECK-LABEL: define void {{.*}}BoolSizeMismatch{{.*}}
308
+ // CHECK: [[B:%.*]] = alloca <4 x i32>, align 16
309
+ // CHECK-NEXT: [[Tmp:%.*]] = alloca <1 x i32>, align 4
310
+ // CHECK-NEXT: store <4 x i32> splat (i32 1), ptr [[B]], align 16
311
+ // CHECK-NEXT: store <1 x i32> zeroinitializer, ptr [[Tmp]], align 4
312
+ // CHECK-NEXT: [[L0:%.*]] = load <1 x i32>, ptr [[Tmp]], align 4
313
+ // CHECK-NEXT: [[L1:%.*]] = shufflevector <1 x i32> [[L0]], <1 x i32> poison, <3 x i32> zeroinitializer
314
+ // CHECK-NEXT: [[TruncV:%.*]] = trunc <3 x i32> [[L1]] to <3 x i1>
315
+ // CHECK-NEXT: [[L2:%.*]] = zext <3 x i1> [[TruncV]] to <3 x i32>
316
+ // CHECK-NEXT: [[L3:%.*]] = load <4 x i32>, ptr [[B]], align 16
317
+ // CHECK-NEXT: [[L4:%.*]] = shufflevector <3 x i32> [[L2]], <3 x i32> poison, <4 x i32> <i32 0, i32 1, i32 2, i32 poison>
318
+ // CHECK-NEXT: [[L5:%.*]] = shufflevector <4 x i32> [[L3]], <4 x i32> [[L4]], <4 x i32> <i32 4, i32 5, i32 6, i32 3>
319
+ // CHECK-NEXT: store <4 x i32> [[L5]], ptr [[B]], align 16
320
+ void BoolSizeMismatch () {
321
+ bool4 B = {true ,true ,true ,true };
322
+ B.xyz = false .xxx;
323
+ }
0 commit comments