Browse Source

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

Ehsan Nasiri 6 years ago
parent
commit
2041241a55

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

@@ -203,10 +203,9 @@ public:
                                                    spv::Scope execScope,
                                                    SourceLocation loc = {});
   SpirvNonUniformUnaryOp *createGroupNonUniformUnaryOp(
-      spv::Op op, QualType resultType, spv::Scope execScope,
+      SourceLocation, spv::Op op, QualType resultType, spv::Scope execScope,
       SpirvInstruction *operand,
-      llvm::Optional<spv::GroupOperation> groupOp = llvm::None,
-      SourceLocation loc = {});
+      llvm::Optional<spv::GroupOperation> groupOp = llvm::None);
   SpirvNonUniformBinaryOp *createGroupNonUniformBinaryOp(
       spv::Op op, QualType resultType, spv::Scope execScope,
       SpirvInstruction *operand1, SpirvInstruction *operand2, SourceLocation);

+ 2 - 3
tools/clang/lib/SPIRV/SpirvBuilder.cpp

@@ -342,9 +342,8 @@ SpirvNonUniformElect *SpirvBuilder::createGroupNonUniformElect(
 }
 
 SpirvNonUniformUnaryOp *SpirvBuilder::createGroupNonUniformUnaryOp(
-    spv::Op op, QualType resultType, spv::Scope execScope,
-    SpirvInstruction *operand, llvm::Optional<spv::GroupOperation> groupOp,
-    SourceLocation loc) {
+    SourceLocation loc, spv::Op op, QualType resultType, spv::Scope execScope,
+    SpirvInstruction *operand, llvm::Optional<spv::GroupOperation> groupOp) {
   assert(insertPoint && "null insert point");
   auto *instruction = new (context)
       SpirvNonUniformUnaryOp(op, resultType, loc, execScope, groupOp, operand);

+ 9 - 7
tools/clang/lib/SPIRV/SpirvEmitter.cpp

@@ -7071,7 +7071,7 @@ SpirvInstruction *SpirvEmitter::processWaveVote(const CallExpr *callExpr,
   auto *predicate = doExpr(callExpr->getArg(0));
   const QualType retType = callExpr->getCallReturnType(astContext);
   return spvBuilder.createGroupNonUniformUnaryOp(
-      opcode, retType, spv::Scope::Subgroup, predicate);
+      callExpr->getExprLoc(), opcode, retType, spv::Scope::Subgroup, predicate);
 }
 
 spv::Op SpirvEmitter::translateWaveOp(hlsl::IntrinsicOp op, QualType type,
@@ -7154,16 +7154,18 @@ SpirvEmitter::processWaveCountBits(const CallExpr *callExpr,
   featureManager.requestTargetEnv(SPV_ENV_VULKAN_1_1, "Wave Operation",
                                   callExpr->getExprLoc());
   auto *predicate = doExpr(callExpr->getArg(0));
+  const auto srcLoc = callExpr->getExprLoc();
   const QualType u32Type = astContext.UnsignedIntTy;
   const QualType v4u32Type = astContext.getExtVectorType(u32Type, 4);
   const QualType retType = callExpr->getCallReturnType(astContext);
   auto *ballot = spvBuilder.createGroupNonUniformUnaryOp(
-      spv::Op::OpGroupNonUniformBallot, v4u32Type, spv::Scope::Subgroup,
+      srcLoc, spv::Op::OpGroupNonUniformBallot, v4u32Type, spv::Scope::Subgroup,
       predicate);
 
   return spvBuilder.createGroupNonUniformUnaryOp(
-      spv::Op::OpGroupNonUniformBallotBitCount, retType, spv::Scope::Subgroup,
-      ballot, llvm::Optional<spv::GroupOperation>(groupOp));
+      srcLoc, spv::Op::OpGroupNonUniformBallotBitCount, retType,
+      spv::Scope::Subgroup, ballot,
+      llvm::Optional<spv::GroupOperation>(groupOp));
 }
 
 SpirvInstruction *SpirvEmitter::processWaveReductionOrPrefix(
@@ -7186,7 +7188,7 @@ SpirvInstruction *SpirvEmitter::processWaveReductionOrPrefix(
   auto *predicate = doExpr(callExpr->getArg(0));
   const QualType retType = callExpr->getCallReturnType(astContext);
   return spvBuilder.createGroupNonUniformUnaryOp(
-      opcode, retType, spv::Scope::Subgroup, predicate,
+      callExpr->getExprLoc(), opcode, retType, spv::Scope::Subgroup, predicate,
       llvm::Optional<spv::GroupOperation>(groupOp));
 }
 
@@ -7207,8 +7209,8 @@ SpirvInstruction *SpirvEmitter::processWaveBroadcast(const CallExpr *callExpr) {
         value, doExpr(callExpr->getArg(1)), srcLoc);
   else
     return spvBuilder.createGroupNonUniformUnaryOp(
-        spv::Op::OpGroupNonUniformBroadcastFirst, retType, spv::Scope::Subgroup,
-        value);
+        srcLoc, spv::Op::OpGroupNonUniformBroadcastFirst, retType,
+        spv::Scope::Subgroup, value);
 }
 
 SpirvInstruction *