|
| 1 | +// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s |
| 2 | + |
| 3 | +// CHECK-LABEL: fn |
| 4 | +// CHECK: [[B:%.*]] = alloca <2 x i32>, align 1 |
| 5 | +// CHECK-NEXT: store <2 x i32> splat (i32 1), ptr [[B]], align 1 |
| 6 | +// CHECK-NEXT: [[BoolVec:%.*]] = load <2 x i32>, ptr [[B]], align 1 |
| 7 | +// CHECK-NEXT: [[L:%.*]] = trunc <2 x i32> [[BoolVec:%.*]] to <2 x i1> |
| 8 | +// CHECK-NEXT: [[VecExt:%.*]] = extractelement <2 x i1> [[L]], i32 0 |
| 9 | +// CHECK-NEXT: ret i1 [[VecExt]] |
| 10 | +bool fn() { |
| 11 | + bool2 B = {true,true}; |
| 12 | + return B[0]; |
| 13 | +} |
| 14 | + |
| 15 | +// CHECK-LABEL: fn2 |
| 16 | +// CHECK: [[VAddr:%.*]] = alloca i32, align 4 |
| 17 | +// CHECK-NEXT: [[A:%.*]] = alloca <2 x i32>, align 1 |
| 18 | +// CHECK-NEXT: [[StoreV:%.*]] = zext i1 {{.*}} to i32 |
| 19 | +// CHECK-NEXT: store i32 [[StoreV]], ptr [[VAddr]], align 4 |
| 20 | +// CHECK-NEXT: [[L:%.*]] = load i32, ptr [[VAddr]], align 4 |
| 21 | +// CHECK-NEXT: [[LoadV:%.*]] = trunc i32 [[L]] to i1 |
| 22 | +// CHECK-NEXT: [[Vec:%.*]] = insertelement <2 x i1> poison, i1 [[LoadV]], i32 0 |
| 23 | +// CHECK-NEXT: [[Vec1:%.*]] = insertelement <2 x i1> [[Vec]], i1 true, i32 1 |
| 24 | +// CHECK-NEXT: [[Z:%.*]] = zext <2 x i1> [[Vec1]] to <2 x i32> |
| 25 | +// CHECK-NEXT: store <2 x i32> [[Z]], ptr [[A]], align 1 |
| 26 | +// CHECK-NEXT: [[LoadBV:%.*]] = load <2 x i32>, ptr [[A]], align 1 |
| 27 | +// CHECK-NEXT: [[LoadV2:%.*]] = trunc <2 x i32> [[LoadBV]] to <2 x i1> |
| 28 | +// CHECK-NEXT: ret <2 x i1> [[LoadV2]] |
| 29 | +bool2 fn2(bool V) { |
| 30 | + bool2 A = {V,true}; |
| 31 | + return A; |
| 32 | +} |
0 commit comments