Browse Source

[spirv] Require source location for non-uniform binary op.

Ehsan Nasiri 6 năm trước cách đây
mục cha
commit
136fc27a9f

+ 1 - 2
tools/clang/include/clang/SPIRV/SpirvBuilder.h

@@ -209,8 +209,7 @@ public:
       SourceLocation loc = {});
   SpirvNonUniformBinaryOp *createGroupNonUniformBinaryOp(
       spv::Op op, QualType resultType, spv::Scope execScope,
-      SpirvInstruction *operand1, SpirvInstruction *operand2,
-      SourceLocation loc = {});
+      SpirvInstruction *operand1, SpirvInstruction *operand2, SourceLocation);
 
   /// \brief Creates an atomic instruction with the given parameters and returns
   /// its pointer.

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

@@ -7195,6 +7195,7 @@ SpirvInstruction *SpirvEmitter::processWaveBroadcast(const CallExpr *callExpr) {
   // <type> WaveReadLaneFirst(<type> expr)
   // <type> WaveReadLaneAt(<type> expr, uint laneIndex)
   const auto numArgs = callExpr->getNumArgs();
+  const auto srcLoc = callExpr->getExprLoc();
   assert(numArgs == 1 || numArgs == 2);
   featureManager.requestTargetEnv(SPV_ENV_VULKAN_1_1, "Wave Operation",
                                   callExpr->getExprLoc());
@@ -7203,7 +7204,7 @@ SpirvInstruction *SpirvEmitter::processWaveBroadcast(const CallExpr *callExpr) {
   if (numArgs == 2)
     return spvBuilder.createGroupNonUniformBinaryOp(
         spv::Op::OpGroupNonUniformBroadcast, retType, spv::Scope::Subgroup,
-        value, doExpr(callExpr->getArg(1)));
+        value, doExpr(callExpr->getArg(1)), srcLoc);
   else
     return spvBuilder.createGroupNonUniformUnaryOp(
         spv::Op::OpGroupNonUniformBroadcastFirst, retType, spv::Scope::Subgroup,
@@ -7223,6 +7224,7 @@ SpirvEmitter::processWaveQuadWideShuffle(const CallExpr *callExpr,
                                   callExpr->getExprLoc());
 
   auto *value = doExpr(callExpr->getArg(0));
+  const auto srcLoc = callExpr->getExprLoc();
   const QualType retType = callExpr->getCallReturnType(astContext);
 
   SpirvInstruction *target = nullptr;
@@ -7249,7 +7251,7 @@ SpirvEmitter::processWaveQuadWideShuffle(const CallExpr *callExpr,
   }
 
   return spvBuilder.createGroupNonUniformBinaryOp(
-      opcode, retType, spv::Scope::Subgroup, value, target);
+      opcode, retType, spv::Scope::Subgroup, value, target, srcLoc);
 }
 
 SpirvInstruction *SpirvEmitter::processIntrinsicModf(const CallExpr *callExpr) {