Jaebaek Seo 6 роки тому
батько
коміт
4336b5ad0b

+ 4 - 1
tools/clang/lib/SPIRV/InitListHandler.cpp

@@ -88,7 +88,8 @@ void InitListHandler::decompose(SpirvInstruction *inst) {
   uint32_t elemCount;
   if (isVectorType(type, &elemType, &elemCount)) {
     decomposeVector(inst, elemType, elemCount);
-  } else if (isScalarType(type, &elemType) && !type->isBuiltinType()) {
+  } else if (isScalarType(type, &elemType)) {
+    // decomposeVector also handles the scalar cases.
     decomposeVector(inst, elemType, 1);
   } else if (hlsl::IsHLSLMatType(type)) {
     elemType = hlsl::GetHLSLMatElementType(type);
@@ -203,6 +204,8 @@ SpirvInstruction *InitListHandler::createInitForType(QualType type,
   if (isVectorType(type, &elemType, &elemCount))
     return createInitForVectorType(elemType, elemCount, srcLoc);
 
+  // The purpose of this check is for vectors of size 1 (for which isVectorType
+  // is false).
   if (isScalarType(type, &elemType))
     return createInitForVectorType(elemType, 1, srcLoc);
 

+ 187 - 0
tools/clang/test/CodeGenSPIRV/var.init.vec.size.1.hlsl

@@ -0,0 +1,187 @@
+// Run: %dxc -T cs_6_0 -E main
+
+// CHECK:       [[ext:%\d+]] = OpExtInstImport "GLSL.std.450"
+
+struct S1 {
+  float value;
+};
+
+struct S2 {
+  float1 value;
+};
+
+struct S3 {
+  int value;
+};
+
+struct S4 {
+  int1 value;
+};
+
+struct S5 {
+  bool value;
+};
+
+struct S6 {
+  bool1 value;
+};
+
+void main() {
+  int1 vi;
+  float1 vf;
+  bool1 vb;
+
+// CHECK:      [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:  [[x:%\d+]] = OpConvertSToF %float [[vi]]
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S1 [[x]]
+// CHECK-NEXT:               OpStore %a1 [[s]]
+  S1 a1 = { vi };
+
+// CHECK-NEXT: [[vf:%\d+]] = OpLoad %float %vf
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S1 [[vf]]
+// CHECK-NEXT:               OpStore %b1 [[s]]
+  S1 b1 = { vf };
+
+// CHECK-NEXT: [[vb:%\d+]] = OpLoad %bool %vb
+// CHECK-NEXT:  [[x:%\d+]] = OpSelect %float [[vb]] %float_1 %float_0
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S1 [[x]]
+// CHECK-NEXT:               OpStore %c1 [[s]]
+  S1 c1 = { vb };
+
+// CHECK-NEXT:   [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:    [[u:%\d+]] = OpBitcast %uint [[vi]]
+// CHECK-NEXT: [[half:%\d+]] = OpExtInst %v2float [[ext]] UnpackHalf2x16 [[u]]
+// CHECK-NEXT:    [[x:%\d+]] = OpCompositeExtract %float [[half]] 0
+// CHECK-NEXT:    [[s:%\d+]] = OpCompositeConstruct %S1 [[x]]
+// CHECK-NEXT:                 OpStore %d1 [[s]]
+  S1 d1 = { half1(f16tof32(vi)) };
+
+// CHECK-NEXT: [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:  [[x:%\d+]] = OpConvertSToF %float [[vi]]
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S2 [[x]]
+// CHECK-NEXT:               OpStore %a2 [[s]]
+  S2 a2 = { vi };
+
+// CHECK-NEXT: [[vf:%\d+]] = OpLoad %float %vf
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S2 [[vf]]
+// CHECK-NEXT:               OpStore %b2 [[s]]
+  S2 b2 = { vf };
+
+// CHECK-NEXT: [[vb:%\d+]] = OpLoad %bool %vb
+// CHECK-NEXT:  [[x:%\d+]] = OpSelect %float [[vb]] %float_1 %float_0
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S2 [[x]]
+// CHECK-NEXT:               OpStore %c2 [[s]]
+  S2 c2 = { vb };
+
+// CHECK-NEXT:   [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:    [[u:%\d+]] = OpBitcast %uint [[vi]]
+// CHECK-NEXT: [[half:%\d+]] = OpExtInst %v2float [[ext]] UnpackHalf2x16 [[u]]
+// CHECK-NEXT:    [[x:%\d+]] = OpCompositeExtract %float [[half]] 0
+// CHECK-NEXT:    [[s:%\d+]] = OpCompositeConstruct %S2 [[x]]
+// CHECK-NEXT:                 OpStore %d2 [[s]]
+  S2 d2 = { half1(f16tof32(vi)) };
+
+// CHECK-NEXT: [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S3 [[vi]]
+// CHECK-NEXT:               OpStore %a3 [[s]]
+  S3 a3 = { vi };
+
+// CHECK-NEXT: [[vf:%\d+]] = OpLoad %float %vf
+// CHECK-NEXT:  [[x:%\d+]] = OpConvertFToS %int [[vf]]
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S3 [[x]]
+// CHECK-NEXT:               OpStore %b3 [[s]]
+  S3 b3 = { vf };
+
+// CHECK-NEXT: [[vb:%\d+]] = OpLoad %bool %vb
+// CHECK-NEXT:  [[x:%\d+]] = OpSelect %int [[vb]] %int_1 %int_0
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S3 [[x]]
+// CHECK-NEXT:               OpStore %c3 [[s]]
+  S3 c3 = { vb };
+
+// CHECK-NEXT:   [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:    [[u:%\d+]] = OpBitcast %uint [[vi]]
+// CHECK-NEXT: [[half:%\d+]] = OpExtInst %v2float [[ext]] UnpackHalf2x16 [[u]]
+// CHECK-NEXT:    [[f:%\d+]] = OpCompositeExtract %float [[half]] 0
+// CHECK-NEXT:    [[x:%\d+]] = OpConvertFToS %int [[f]]
+// CHECK-NEXT:    [[s:%\d+]] = OpCompositeConstruct %S3 [[x]]
+// CHECK-NEXT:                 OpStore %d3 [[s]]
+  S3 d3 = { half1(f16tof32(vi)) };
+
+// CHECK-NEXT: [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S4 [[vi]]
+// CHECK-NEXT:               OpStore %a4 [[s]]
+  S4 a4 = { vi };
+
+// CHECK-NEXT: [[vf:%\d+]] = OpLoad %float %vf
+// CHECK-NEXT:  [[x:%\d+]] = OpConvertFToS %int [[vf]]
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S4 [[x]]
+// CHECK-NEXT:               OpStore %b4 [[s]]
+  S4 b4 = { vf };
+
+// CHECK-NEXT: [[vb:%\d+]] = OpLoad %bool %vb
+// CHECK-NEXT:  [[x:%\d+]] = OpSelect %int [[vb]] %int_1 %int_0
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S4 [[x]]
+// CHECK-NEXT:               OpStore %c4 [[s]]
+  S4 c4 = { vb };
+
+// CHECK-NEXT:   [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:    [[u:%\d+]] = OpBitcast %uint [[vi]]
+// CHECK-NEXT: [[half:%\d+]] = OpExtInst %v2float [[ext]] UnpackHalf2x16 [[u]]
+// CHECK-NEXT:    [[f:%\d+]] = OpCompositeExtract %float [[half]] 0
+// CHECK-NEXT:    [[x:%\d+]] = OpConvertFToS %int [[f]]
+// CHECK-NEXT:    [[s:%\d+]] = OpCompositeConstruct %S4 [[x]]
+// CHECK-NEXT:                 OpStore %d4 [[s]]
+  S4 d4 = { half1(f16tof32(vi)) };
+
+// CHECK-NEXT: [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:  [[x:%\d+]] = OpINotEqual %bool [[vi]] %int_0
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S5 [[x]]
+// CHECK-NEXT:               OpStore %a5 [[s]]
+  S5 a5 = { vi };
+
+// CHECK-NEXT: [[vf:%\d+]] = OpLoad %float %vf
+// CHECK-NEXT:  [[x:%\d+]] = OpFOrdNotEqual %bool [[vf]] %float_0
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S5 [[x]]
+// CHECK-NEXT:               OpStore %b5 [[s]]
+  S5 b5 = { vf };
+
+// CHECK-NEXT: [[vb:%\d+]] = OpLoad %bool %vb
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S5 [[vb]]
+// CHECK-NEXT:               OpStore %c5 [[s]]
+  S5 c5 = { vb };
+
+// CHECK-NEXT:   [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:    [[u:%\d+]] = OpBitcast %uint [[vi]]
+// CHECK-NEXT: [[half:%\d+]] = OpExtInst %v2float [[ext]] UnpackHalf2x16 [[u]]
+// CHECK-NEXT:    [[f:%\d+]] = OpCompositeExtract %float [[half]] 0
+// CHECK-NEXT:    [[x:%\d+]] = OpFOrdNotEqual %bool [[f]] %float_0
+// CHECK-NEXT:    [[s:%\d+]] = OpCompositeConstruct %S5 [[x]]
+// CHECK-NEXT:                 OpStore %d5 [[s]]
+  S5 d5 = { half1(f16tof32(vi)) };
+
+// CHECK-NEXT: [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:  [[x:%\d+]] = OpINotEqual %bool [[vi]] %int_0
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S6 [[x]]
+// CHECK-NEXT:               OpStore %a6 [[s]]
+  S6 a6 = { vi };
+
+// CHECK-NEXT: [[vf:%\d+]] = OpLoad %float %vf
+// CHECK-NEXT:  [[x:%\d+]] = OpFOrdNotEqual %bool [[vf]] %float_0
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S6 [[x]]
+// CHECK-NEXT:               OpStore %b6 [[s]]
+  S6 b6 = { vf };
+
+// CHECK-NEXT: [[vb:%\d+]] = OpLoad %bool %vb
+// CHECK-NEXT:  [[s:%\d+]] = OpCompositeConstruct %S6 [[vb]]
+// CHECK-NEXT:               OpStore %c6 [[s]]
+  S6 c6 = { vb };
+
+// CHECK-NEXT:   [[vi:%\d+]] = OpLoad %int %vi
+// CHECK-NEXT:    [[u:%\d+]] = OpBitcast %uint [[vi]]
+// CHECK-NEXT: [[half:%\d+]] = OpExtInst %v2float [[ext]] UnpackHalf2x16 [[u]]
+// CHECK-NEXT:    [[f:%\d+]] = OpCompositeExtract %float [[half]] 0
+// CHECK-NEXT:    [[x:%\d+]] = OpFOrdNotEqual %bool [[f]] %float_0
+// CHECK-NEXT:    [[s:%\d+]] = OpCompositeConstruct %S6 [[x]]
+// CHECK-NEXT:                 OpStore %d6 [[s]]
+  S6 d6 = { half1(f16tof32(vi)) };
+}

+ 1 - 0
tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp

@@ -160,6 +160,7 @@ TEST_F(FileTest, VarInitOpaque) { runFileTest("var.init.opaque.hlsl"); }
 TEST_F(FileTest, VarInitCrossStorageClass) {
   runFileTest("var.init.cross-storage-class.hlsl");
 }
+TEST_F(FileTest, VarInitVec1) { runFileTest("var.init.vec.size.1.hlsl"); }
 TEST_F(FileTest, StaticVar) { runFileTest("var.static.hlsl"); }
 TEST_F(FileTest, UninitStaticResourceVar) {
   runFileTest("var.static.resource.hlsl");