diff options
author | Hanumanth <hhanuman@mathworks.com> | 2025-10-22 09:19:40 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-10-22 15:19:40 +0200 |
commit | d08cbc1cdd7b73e9a582f5602e8ca4829decab8c (patch) | |
tree | e06b46353f8c3e52c716b9270269a2184da4aad2 /clang/lib/CodeGen/CodeGenModule.cpp | |
parent | b3073470424c9ef4c5f319d3eed4d42170e15cf1 (diff) | |
download | llvm-d08cbc1cdd7b73e9a582f5602e8ca4829decab8c.zip llvm-d08cbc1cdd7b73e9a582f5602e8ca4829decab8c.tar.gz llvm-d08cbc1cdd7b73e9a582f5602e8ca4829decab8c.tar.bz2 |
[mlir][linalg] Fix Linalg runtime verification pass to handle tensors with dimensions of size 0 (#163791)
Runtime verification on Linalg structured ops unconditionally computed
`end - 1` to determine the last iteration index before composing
indexing maps. This caused spurious "negative index" assertion failures
while operating on empty tensors (tensors with a dimension of size 0).
The issue occurs because:
1. Empty tensors create loop ranges [0, 0) with zero trip count
2. Computing end - 1 = 0 - 1 = -1 creates a fictitious negative index
3. The negative index check triggers even though no loop iterations
occur
The fix is to guard all runtime verification with a check that ensures
all loop ranges are non-empty (start < end) before performing any index
arithmetic.
Example MLIR that previously failed:
```mlir
func.func @fill_empty() -> tensor<0xi32> {
%c0 = arith.constant 0 : i32
%empty = tensor.empty() : tensor<0xi32>
%filled = linalg.fill ins(%c0 : i32) outs(%empty : tensor<0xi32>) -> tensor<0xi32>
return %filled : tensor<0xi32>
}
```
---------
Co-authored-by: Hanumanth Hanumantharayappa <hhanuman@ah-hhanuman-l.dhcp.mathworks.com>
Diffstat (limited to 'clang/lib/CodeGen/CodeGenModule.cpp')
0 files changed, 0 insertions, 0 deletions