diff --git a/tools/clang/lib/SPIRV/SpirvEmitter.cpp b/tools/clang/lib/SPIRV/SpirvEmitter.cpp index 8af0b5311..e0ed30f01 100644 --- a/tools/clang/lib/SPIRV/SpirvEmitter.cpp +++ b/tools/clang/lib/SPIRV/SpirvEmitter.cpp @@ -9465,7 +9465,7 @@ SpirvEmitter::processIntrinsicAsType(const CallExpr *callExpr) { switch (numArgs) { case 1: { // Handling Method 1, 2, and 3. - auto *argInstr = doExpr(arg0); + auto *argInstr = loadIfGLValue(arg0); QualType fromElemType = {}; uint32_t numRows = 0, numCols = 0; // For non-matrix arguments (scalar or vector), just do an OpBitCast. diff --git a/tools/clang/test/CodeGenSPIRV/intrinsics.asuint.rvalue.hlsl b/tools/clang/test/CodeGenSPIRV/intrinsics.asuint.rvalue.hlsl new file mode 100644 index 000000000..69db59802 --- /dev/null +++ b/tools/clang/test/CodeGenSPIRV/intrinsics.asuint.rvalue.hlsl @@ -0,0 +1,25 @@ +// Run: %dxc -T cs_6_0 -E main + +StructuredBuffer input0; +StructuredBuffer input1; + +[numthreads(64,1,1)] +void main(uint3 dtID : SV_DispatchThreadID) +{ +// CHECK: [[ptr_input0:%\d+]] = OpAccessChain %_ptr_Uniform_v4float %input0 %int_0 %int_0 +// CHECK: [[input0:%\d+]] = OpLoad %v4float [[ptr_input0]] +// CHECK: OpBitcast %v4uint [[input0]] + uint4 val0 = asuint(input0.Load(0)); + +// CHECK: [[ptr_input1:%\d+]] = OpAccessChain %_ptr_Uniform_mat4v3float %input1 %int_0 %int_0 +// CHECK: [[input1:%\d+]] = OpLoad %mat4v3float [[ptr_input1]] +// CHECK: [[input1_0:%\d+]] = OpCompositeExtract %v3float [[input1]] 0 +// CHECK: OpBitcast %v3uint [[input1_0]] +// CHECK: OpCompositeExtract %v3float {{%\d+}} 1 +// CHECK: OpBitcast %v3uint +// CHECK: OpCompositeExtract %v3float {{%\d+}} 2 +// CHECK: OpBitcast %v3uint +// CHECK: OpCompositeExtract %v3float {{%\d+}} 3 +// CHECK: OpBitcast %v3uint + uint4x3 val1 = asuint(input1.Load(0)); +} diff --git a/tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp b/tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp index 642ebdd0f..c61e65489 100644 --- a/tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp +++ b/tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp @@ -1076,6 +1076,9 @@ TEST_F(FileTest, IntrinsicsAsDouble) { TEST_F(FileTest, IntrinsicsAsfloat) { runFileTest("intrinsics.asfloat.hlsl"); } TEST_F(FileTest, IntrinsicsAsint) { runFileTest("intrinsics.asint.hlsl"); } TEST_F(FileTest, IntrinsicsAsuint) { runFileTest("intrinsics.asuint.hlsl"); } +TEST_F(FileTest, IntrinsicsAsuintArgumentMustBeRValue) { + runFileTest("intrinsics.asuint.rvalue.hlsl"); +} TEST_F(FileTest, IntrinsicsRound) { runFileTest("intrinsics.round.hlsl"); } TEST_F(FileTest, IntrinsicsAbs) { runFileTest("intrinsics.abs.hlsl"); } TEST_F(FileTest, IntrinsicsCross) { runFileTest("intrinsics.cross.hlsl"); }