109 lines · plain
1// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s2 3// CHECK: %struct.S = type <{ <2 x i32>, float }>4// CHECK: [[ConstS:@.*]] = private unnamed_addr constant %struct.S <{ <2 x i32> splat (i32 1), float 1.000000e+00 }>, align 15// CHECK: [[ConstArr:.*]] = private unnamed_addr constant [2 x <2 x i32>] [<2 x i32> splat (i32 1), <2 x i32> zeroinitializer], align 86 7struct S {8 bool2 bv;9 float f;10};11 12// CHECK-LABEL: define hidden noundef i1 {{.*}}fn1{{.*}}13// CHECK: [[B:%.*]] = alloca <2 x i32>, align 814// CHECK-NEXT: store <2 x i32> splat (i32 1), ptr [[B]], align 815// CHECK-NEXT: [[BoolVec:%.*]] = load <2 x i32>, ptr [[B]], align 816// CHECK-NEXT: [[L:%.*]] = trunc <2 x i32> [[BoolVec:%.*]] to <2 x i1>17// CHECK-NEXT: [[VecExt:%.*]] = extractelement <2 x i1> [[L]], i32 018// CHECK-NEXT: ret i1 [[VecExt]]19bool fn1() {20 bool2 B = {true,true};21 return B[0];22}23 24// CHECK-LABEL: define hidden noundef <2 x i1> {{.*}}fn2{{.*}}25// CHECK: [[VAddr:%.*]] = alloca i32, align 426// CHECK-NEXT: [[A:%.*]] = alloca <2 x i32>, align 827// CHECK-NEXT: [[StoreV:%.*]] = zext i1 {{.*}} to i3228// CHECK-NEXT: store i32 [[StoreV]], ptr [[VAddr]], align 429// CHECK-NEXT: [[L:%.*]] = load i32, ptr [[VAddr]], align 430// CHECK-NEXT: [[LoadV:%.*]] = trunc i32 [[L]] to i131// CHECK-NEXT: [[Vec:%.*]] = insertelement <2 x i1> poison, i1 [[LoadV]], i32 032// CHECK-NEXT: [[Vec1:%.*]] = insertelement <2 x i1> [[Vec]], i1 true, i32 133// CHECK-NEXT: [[Z:%.*]] = zext <2 x i1> [[Vec1]] to <2 x i32>34// CHECK-NEXT: store <2 x i32> [[Z]], ptr [[A]], align 835// CHECK-NEXT: [[LoadBV:%.*]] = load <2 x i32>, ptr [[A]], align 836// CHECK-NEXT: [[LoadV2:%.*]] = trunc <2 x i32> [[LoadBV]] to <2 x i1>37// CHECK-NEXT: ret <2 x i1> [[LoadV2]]38bool2 fn2(bool V) {39 bool2 A = {V,true};40 return A;41}42 43// CHECK-LABEL: define hidden noundef i1 {{.*}}fn3{{.*}}44// CHECK: [[s:%.*]] = alloca %struct.S, align 145// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[s]], ptr align 1 [[ConstS]], i32 12, i1 false)46// CHECK-NEXT: [[BV:%.*]] = getelementptr inbounds nuw %struct.S, ptr [[s]], i32 0, i32 047// CHECK-NEXT: [[LBV:%.*]] = load <2 x i32>, ptr [[BV]], align 148// CHECK-NEXT: [[LV:%.*]] = trunc <2 x i32> [[LBV]] to <2 x i1>49// CHECK-NEXT: [[VX:%.*]] = extractelement <2 x i1> [[LV]], i32 050// CHECK-NEXT: ret i1 [[VX]]51bool fn3() {52 S s = {{true,true}, 1.0};53 return s.bv[0];54}55 56// CHECK-LABEL: define hidden noundef i1 {{.*}}fn4{{.*}}57// CHECK: [[Arr:%.*]] = alloca [2 x <2 x i32>], align 858// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 8 [[Arr]], ptr align 8 [[ConstArr]], i32 16, i1 false)59// CHECK-NEXT: [[Idx:%.*]] = getelementptr inbounds [2 x <2 x i32>], ptr [[Arr]], i32 0, i32 060// CHECK-NEXT: [[L:%.*]] = load <2 x i32>, ptr [[Idx]], align 861// CHECK-NEXT: [[LV:%.*]] = trunc <2 x i32> [[L]] to <2 x i1>62// CHECK-NEXT: [[VX:%.*]] = extractelement <2 x i1> [[LV]], i32 163// CHECK-NEXT: ret i1 [[VX]]64bool fn4() {65 bool2 Arr[2] = {{true,true}, {false,false}};66 return Arr[0][1];67}68 69// CHECK-LABEL: define hidden void {{.*}}fn5{{.*}}70// CHECK: [[Arr:%.*]] = alloca <2 x i32>, align 871// CHECK-NEXT: store <2 x i32> splat (i32 1), ptr [[Arr]], align 872// CHECK-NEXT: [[Ptr:%.*]] = getelementptr <2 x i32>, ptr [[Arr]]73// CHECK-NEXT: store i32 0, ptr [[Ptr]], align 474// CHECK-NEXT: ret void75void fn5() {76 bool2 Arr = {true,true};77 Arr[1] = false;78}79 80// CHECK-LABEL: define hidden void {{.*}}fn6{{.*}}81// CHECK: [[V:%.*]] = alloca i32, align 482// CHECK-NEXT: [[S:%.*]] = alloca %struct.S, align 183// CHECK-NEXT: store i32 0, ptr [[V]], align 484// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 1 [[S]], ptr align 1 {{.*}}, i32 12, i1 false)85// CHECK-NEXT: [[Y:%.*]] = load i32, ptr [[V]], align 486// CHECK-NEXT: [[LV:%.*]] = trunc i32 [[Y]] to i187// CHECK-NEXT: [[BV:%.*]] = getelementptr inbounds nuw %struct.S, ptr [[S]], i32 0, i32 088// CHECK-NEXT: [[Z:%.*]] = zext i1 [[LV]] to i3289// CHECK-NEXT: [[Ptr:%.*]] = getelementptr <2 x i32>, ptr [[BV]], i32 0, i32 190// CHECK-NEXT: store i32 [[Z]], ptr [[Ptr]], align 491// CHECK-NEXT: ret void92void fn6() {93 bool V = false;94 S s = {{true,true}, 1.0};95 s.bv[1] = V;96}97 98// CHECK-LABEL: define hidden void {{.*}}fn7{{.*}}99// CHECK: [[Arr:%.*]] = alloca [2 x <2 x i32>], align 8100// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 8 [[Arr]], ptr align 8 {{.*}}, i32 16, i1 false)101// CHECK-NEXT: [[Idx:%.*]] = getelementptr inbounds [2 x <2 x i32>], ptr [[Arr]], i32 0, i32 0102// CHECK-NEXT: %[[Ptr:.*]] = getelementptr <2 x i32>, ptr [[Idx]], i32 0, i32 1103// CHECK-NEXT: store i32 0, ptr %[[Ptr]], align 4104// CHECK-NEXT: ret void105void fn7() {106 bool2 Arr[2] = {{true,true}, {false,false}};107 Arr[0][1] = false;108}109