Add verification for dimension attribute on GPUDialect index operations.
authorStephan Herhut <herhut@google.com>
Thu, 29 Aug 2019 06:39:20 +0000 (23:39 -0700)
committerA. Unique TensorFlower <gardener@tensorflow.org>
Thu, 29 Aug 2019 06:39:57 +0000 (23:39 -0700)
PiperOrigin-RevId: 266073204

mlir/include/mlir/Dialect/GPU/GPUOps.td
mlir/lib/Dialect/GPU/IR/GPUDialect.cpp
mlir/test/Dialect/GPU/invalid.mlir

index b38a597..6c713b7 100644 (file)
@@ -37,7 +37,9 @@ class GPU_Op<string mnemonic, list<OpTrait> traits = []> :
 
 class GPU_IndexOp<string mnemonic, list<OpTrait> traits = []> :
     GPU_Op<mnemonic, !listconcat(traits, [NoSideEffect])>,
-    Arguments<(ins StrAttr:$dimension)>, Results<(outs Index)>;
+    Arguments<(ins StrAttr:$dimension)>, Results<(outs Index)> {
+  let verifier = [{ return ::verifyIndexOp(*this); }];
+}
 
 def gpu_BlockDim : GPU_IndexOp<"block_dim">;
 def gpu_BlockId : GPU_IndexOp<"block_id">;
index 22d433a..5609725 100644 (file)
@@ -47,6 +47,13 @@ GPUDialect::GPUDialect(MLIRContext *context)
                 >();
 }
 
+template <typename T> static LogicalResult verifyIndexOp(T op) {
+  auto dimension = op.dimension();
+  if (dimension != "x" && dimension != "y" && dimension != "z")
+    return op.emitError("dimension \"") << dimension << "\" is invalid";
+  return success();
+}
+
 #define GET_OP_CLASSES
 #include "mlir/Dialect/GPU/GPUOps.cpp.inc"
 
index bfc18fa..2a0be68 100644 (file)
@@ -162,3 +162,39 @@ func @launch_func_kernel_operand_types(%sz : index, %arg : f32) {
       : (index, index, index, index, index, index, f32) -> ()
   return
 }
+
+// -----
+
+func @illegal_dimension() {
+  // expected-error@+1 {{dimension "o" is invalid}}
+  %tIdX = "gpu.thread_id"() {dimension = "o"} : () -> (index)
+
+  return
+}
+
+// -----
+
+func @illegal_dimension() {
+  // expected-error@+1 {{dimension "o" is invalid}}
+  %bDimX = "gpu.block_dim"() {dimension = "o"} : () -> (index)
+
+  return
+}
+
+// -----
+
+func @illegal_dimension() {
+  // expected-error@+1 {{dimension "o" is invalid}}
+  %bIdX = "gpu.block_id"() {dimension = "o"} : () -> (index)
+
+  return
+}
+
+// -----
+
+func @illegal_dimension() {
+  // expected-error@+1 {{dimension "o" is invalid}}
+  %gDimX = "gpu.grid_dim"() {dimension = "o"} : () -> (index)
+
+  return
+}