In some cases the casted buffer could be allocated in the destination's type.
By rebuilding the allocating op with the matching type, the memref.cast is not needed.
Details
- Reviewers
nicolasvasilache mehdi_amini
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp | ||
---|---|---|
379–382 | ||
387 | ||
388 | When does this happen? | |
402 | Avoid isa + cast : use dyn_cast instead. | |
410 | Can we do all of this in a single traversal of alloc->getUsers() instead of 3? | |
mlir/test/Dialect/MemRef/canonicalize.mlir | ||
947 | Is this useful to check? | |
949 | Same here, I'm not sure this is necessary to check here. Checking the alloc and the NOT: cast seems like capturing the intent of the test I think. | |
961 | Can you add negative tests? Basically we should have a case for each of the return failure() you have in the pattern I think. |
mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp | ||
---|---|---|
388 | When castOp result is an UnrankedMemRefType, it cannot be casted to MemRefType. |
mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp | ||
---|---|---|
370 | Is this valid for all operations in the memref dialect? Also what about something like: %alloc = memref.alloc(...) : memref<?x?xf32> %memref.copy %alloc, ... if (%cond) { %casted = memref.cast %alloc : memref<?x?xf32> to memref<4x4xf32> ... } The control flow should prevent the folding, because the cast may not be reachable I think? | |
388 | Ah! Forgot about unranked... It does not help that for Tensor the hierarchy is named with a different convention... | |
406 | This logic seems overly complex because the interaction between isValidUser and this (they both check for CastOp for example`, and getting the result MemrefType of the cast use. What does it look like if we inline isValidUser here instead? |
mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp | ||
---|---|---|
370 | I think post-dominate is the condition strictly speaking, but "same block" is a good start for now. |
mlir/lib/Dialect/MemRef/IR/MemRefOps.cpp | ||
---|---|---|
370 | Added a test with scf.if and blocked it. |
Is this valid for all operations in the memref dialect?
Also what about something like:
The control flow should prevent the folding, because the cast may not be reachable I think?