Skip to content

Commit 8f90ae9

Browse files
committed
[mlir][memref] Verify subview offsets and sizes
1 parent 30e4b09 commit 8f90ae9

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2842,8 +2842,18 @@ static LogicalResult produceSubViewErrorMsg(SliceVerificationResult result,
28422842
llvm_unreachable("unexpected subview verification result");
28432843
}
28442844

2845-
/// Verifier for SubViewOp.
28462845
LogicalResult SubViewOp::verify() {
2846+
for (int64_t offset : getStaticOffsets()) {
2847+
if (offset < 0 && !ShapedType::isDynamic(offset))
2848+
return emitError("expected subview offsets to be non-negative, but got ")
2849+
<< offset;
2850+
}
2851+
for (int64_t size : getStaticSizes()) {
2852+
if (size < 1 && !ShapedType::isDynamic(size))
2853+
return emitError("expected subview sizes to be positive, but got ")
2854+
<< size;
2855+
}
2856+
28472857
MemRefType baseType = getSourceType();
28482858
MemRefType subViewType = getType();
28492859

mlir/test/Dialect/MemRef/invalid.mlir

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,22 @@ func.func @invalid_view(%arg0 : index, %arg1 : index, %arg2 : index) {
611611

612612
// -----
613613

614+
func.func @invalid_subview(%input: memref<4x1024xf32>) -> memref<2x256xf32, strided<[1024, 1], offset: 2304>> {
615+
// expected-error@+1 {{expected subview offsets to be non-negative, but got -1}}
616+
%0 = memref.subview %input[-1, 256] [2, 256] [1, 1] : memref<4x1024xf32> to memref<2x256xf32, strided<[1024, 1], offset: 2304>>
617+
return %0 : memref<2x256xf32, strided<[1024, 1], offset: 2304>>
618+
}
619+
620+
// -----
621+
622+
func.func @invalid_subview(%input: memref<4x1024xf32>) -> memref<2x256xf32, strided<[1024, 1], offset: 2304>> {
623+
// expected-error@+1 {{expected subview sizes to be positive, but got 0}}
624+
%0 = memref.subview %input[2, 256] [0, 256] [1, 1] : memref<4x1024xf32> to memref<2x256xf32, strided<[1024, 1], offset: 2304>>
625+
return %0 : memref<2x256xf32, strided<[1024, 1], offset: 2304>>
626+
}
627+
628+
// -----
629+
614630
func.func @invalid_subview(%arg0 : index, %arg1 : index, %arg2 : index) {
615631
%0 = memref.alloc() : memref<8x16x4xf32>
616632
// expected-error@+1 {{expected mixed offsets rank to match mixed sizes rank (2 vs 3) so the rank of the result type is well-formed}}

0 commit comments

Comments
 (0)