@@ -233,7 +233,8 @@ int AssignInt(int V){
233233
234234// CHECK: lor.end:
235235// 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
237238// CHECK-NEXT: [[I:%.*]] = load i32, ptr [[XAddr]], align 4
238239// CHECK-NEXT: [[LoadV:%.*]] = trunc i32 [[I]] to i1
239240// CHECK-NEXT: ret i1 [[LoadV]]
@@ -257,8 +258,8 @@ bool AssignBool(bool V) {
257258// CHECK-NEXT: store <2 x i32> [[A]], ptr [[X]], align 8
258259// CHECK-NEXT: [[B:%.*]] = load i32, ptr [[VAddr]], align 4
259260// CHECK-NEXT: [[LV1:%.*]] = trunc i32 [[B]] to i1
260- // CHECK-NEXT: [[C:%.*]] = load <2 x i32>, ptr [[X]], align 8
261261// CHECK-NEXT: [[D:%.*]] = zext i1 [[LV1]] to i32
262+ // CHECK-NEXT: [[C:%.*]] = load <2 x i32>, ptr [[X]], align 8
262263// CHECK-NEXT: [[E:%.*]] = insertelement <2 x i32> [[C]], i32 [[D]], i32 1
263264// CHECK-NEXT: store <2 x i32> [[E]], ptr [[X]], align 8
264265// CHECK-NEXT: ret void
@@ -275,8 +276,8 @@ void AssignBool2(bool V) {
275276// CHECK-NEXT: store <2 x i32> splat (i32 1), ptr [[X]], align 8
276277// CHECK-NEXT: [[Z:%.*]] = load <2 x i32>, ptr [[VAddr]], align 8
277278// CHECK-NEXT: [[LV:%.*]] = trunc <2 x i32> [[Z]] to <2 x i1>
278- // CHECK-NEXT: [[A:%.*]] = load <2 x i32>, ptr [[X]], align 8
279279// CHECK-NEXT: [[B:%.*]] = zext <2 x i1> [[LV]] to <2 x i32>
280+ // CHECK-NEXT: [[A:%.*]] = load <2 x i32>, ptr [[X]], align 8
280281// CHECK-NEXT: [[C:%.*]] = shufflevector <2 x i32> [[B]], <2 x i32> poison, <2 x i32> <i32 0, i32 1>
281282// CHECK-NEXT: store <2 x i32> [[C]], ptr [[X]], align 8
282283// CHECK-NEXT: ret void
@@ -302,3 +303,21 @@ bool2 AccessBools() {
302303 bool4 X = true .xxxx;
303304 return X.zw;
304305}
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