Author: Prateek Gupta
Date: 2021-09-23T05:53:52+05:30
New Revision: 071e483b072ee7ff59ec3386b6bc0155c7a230b3

URL: 
https://github.com/llvm/llvm-project/commit/071e483b072ee7ff59ec3386b6bc0155c7a230b3
DIFF: 
https://github.com/llvm/llvm-project/commit/071e483b072ee7ff59ec3386b6bc0155c7a230b3.diff

LOG: Add verifier for the LHLO TupleOp
Added verification support for LHLO TupleOp, so that inconsistency between 
input and output types for the LHLO TupleOp can be checked.

Added: 
    

Modified: 
    mlir/include/mlir/Dialect/LHLO/IR/LHLOOps.td
    mlir/lib/Dialect/LHLO/IR/LHLOOps.cc
    mlir/test/Dialect/LHLO/invalid.mlir

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Dialect/LHLO/IR/LHLOOps.td 
b/mlir/include/mlir/Dialect/LHLO/IR/LHLOOps.td
index 104e9c011de6..752992761485 100644
--- a/mlir/include/mlir/Dialect/LHLO/IR/LHLOOps.td
+++ b/mlir/include/mlir/Dialect/LHLO/IR/LHLOOps.td
@@ -600,6 +600,8 @@ def LHLO_TupleOp : LHLO_ReadOnlyOp<"tuple", 
[NoSideEffect]>, BASE_HLO_TupleOp {
   let results = (outs NestedTupleOf<[LHLO_BufferOrIntOrFP]>);
 
   let builders = [OpBuilder<(ins "ValueRange":$values)>];
+
+  let verifier = [{ return::verify(*this);}];
 }
 
 def LHLO_WhileOp

diff  --git a/mlir/lib/Dialect/LHLO/IR/LHLOOps.cc 
b/mlir/lib/Dialect/LHLO/IR/LHLOOps.cc
index 01b0da948dea..27d2596f167e 100644
--- a/mlir/lib/Dialect/LHLO/IR/LHLOOps.cc
+++ b/mlir/lib/Dialect/LHLO/IR/LHLOOps.cc
@@ -122,6 +122,17 @@ void TupleOp::build(OpBuilder& builder, OperationState& 
result,
   build(builder, result, builder.getTupleType(types), values);
 }
 
+static LogicalResult verify(TupleOp op) {
+  SmallVector<Type, 4> operandTypes = {op.operand_type_begin(),
+                                       op.operand_type_end()};
+  auto expectedType = TupleType::get(op.getContext(), operandTypes);
+  if (op.getType() != expectedType) {
+    return op.emitOpError(llvm::formatv("has return type {0}, but expected 
{1}",
+                                        op.getType(), expectedType));
+  }
+  return success();
+}
+
 
//===----------------------------------------------------------------------===//
 // GetTupleElementOp
 
//===----------------------------------------------------------------------===//

diff  --git a/mlir/test/Dialect/LHLO/invalid.mlir 
b/mlir/test/Dialect/LHLO/invalid.mlir
index 0e269535d00c..98e744c0167c 100644
--- a/mlir/test/Dialect/LHLO/invalid.mlir
+++ b/mlir/test/Dialect/LHLO/invalid.mlir
@@ -8,3 +8,30 @@ func @passthrough(%arg : memref<8xi32>) {
   %mem = "xla_lhlo.get_tuple_element"(%tuple) {index = 0 : i32} : (tuple<i32, 
memref<8xi32>>) -> memref<8xi32>
   return
 }
+
+// -----
+
+func @pass_wrong_number_of_arguments(%arg : memref<8xi32>){
+    %c0 = constant 0 : i32
+    %c1 = constant 1 : i32
+    // expected-error@+1{{'xla_lhlo.tuple' op has return type tuple<i32>, but 
expected tuple<i32, memref<8xi32>, i32>}}
+    %tuple = "xla_lhlo.tuple"(%c0, %arg, %c1) : (i32, memref<8xi32>, i32) -> 
(tuple<i32>)
+}
+
+// -----
+
+func @pass_wrong_type(%arg : i32){
+    %c = constant 0 : i32
+    // expected-error@+1{{'xla_lhlo.tuple' op has return type tuple<i32, 
memref<8xi32>>, but expected tuple<i32, i32>}}
+    %tuple = "xla_lhlo.tuple"(%c, %arg) : (i32, i32) -> (tuple<i32, 
memref<8xi32>>)
+    return 
+}
+
+// -----
+
+func @pass_wrong_order(%arg : memref<8xi32>){
+    %c = constant 0 : i32
+    // expected-error@+1{{'xla_lhlo.tuple' op has return type 
tuple<memref<8xi32>, i32>, but expected tuple<i32, memref<8xi32>>}}
+    %tuple = "xla_lhlo.tuple"(%c, %arg) : (i32, memref<8xi32>) -> 
(tuple<memref<8xi32>, i32>)
+    return 
+}
\ No newline at end of file


        
_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to