Ver Fonte

[spirv] Fix unsafe pointer access. (#2945)

Ehsan há 5 anos atrás
pai
commit
5ebc67c618

+ 2 - 1
tools/clang/lib/SPIRV/SpirvEmitter.cpp

@@ -5492,7 +5492,8 @@ SpirvInstruction *SpirvEmitter::processBinaryOp(
     val->setRValue();
 
     // Propagate RelaxedPrecision
-    if (lhsVal->isRelaxedPrecision() || rhsVal->isRelaxedPrecision())
+    if ((lhsVal && lhsVal->isRelaxedPrecision()) ||
+        (rhsVal && rhsVal->isRelaxedPrecision()))
       val->setRelaxedPrecision();
 
     return val;

+ 23 - 0
tools/clang/test/CodeGenSPIRV/intrinsics.multiprefix.hlsl

@@ -0,0 +1,23 @@
+// Run: %dxc -T ps_6_5 -E main
+
+StructuredBuffer<uint4> g_mask;
+
+uint main(uint input : ATTR0) : SV_Target {
+  uint4 mask = g_mask[0];
+
+  uint res = uint4(0, 0, 0, 0);
+// CHECK: 10:10: error: WaveMultiPrefixBitAnd intrinsic function unimplemented
+  res += WaveMultiPrefixBitAnd(input, mask);
+// CHECK: 12:10: error: WaveMultiPrefixBitOr intrinsic function unimplemented
+  res += WaveMultiPrefixBitOr(input, mask);
+// CHECK: 14:10: error: WaveMultiPrefixBitXor intrinsic function unimplemented
+  res += WaveMultiPrefixBitXor(input, mask);
+// CHECK: 16:10: error: WaveMultiPrefixProduct intrinsic function unimplemented
+  res += WaveMultiPrefixProduct(input, mask);
+// CHECK: 18:10: error: WaveMultiPrefixSum intrinsic function unimplemented
+  res += WaveMultiPrefixSum(input, mask);
+// CHECK: 20:12: error: WaveMultiPrefixCountBits intrinsic function unimplemented
+  res.x += WaveMultiPrefixCountBits((input.x == 1), mask);
+
+  return res;
+}

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

@@ -1178,6 +1178,9 @@ TEST_F(FileTest, IntrinsicsGetRenderTargetSamplePosition) {
 TEST_F(FileTest, IntrinsicsNonUniformResourceIndex) {
   runFileTest("intrinsics.non-uniform-resource-index.hlsl");
 }
+TEST_F(FileTest, IntrinsicsMultiPrefix) {
+  runFileTest("intrinsics.multiprefix.hlsl", Expect::Failure);
+}
 
 // For attributes
 TEST_F(FileTest, AttributeEarlyDepthStencil) {