Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[flang] Fix overallocation by fir-to-llvm-ir pass
When converting a fir.alloca of an array to the LLVM dialect, we used to multiply the allocated size by all the constant factors encoded in the array type. This is fine when the array type is converted to the element type for the purposes of the allocation, but if it's converted to an array type, then we might be allocating too much space. For example, for `%2 = fir.alloca !fir.array<8x16x32xf32>, %0, %1` we would allocate %0 * %1 * 8 * 16 * 32 x llvm.array<32 x array<16 * array<8 x f32>>>. We really only need to allocate %0 * %1 such arrays. This patch fixes the issue by taking note of the array type that we're trying to allocate. It tries to match the behaviour of LLVMTypeConverter::convertPointerLike, which returns a pointer to the element type only when the array type doesn't have a constant interior. We consequently only multiply with the constant factors in the array type if the array type doesn't have a constant interior. This has the nice side effect that it gets rid of some redundant multiplications with the constant 1 in some cases. Differential Revision: https://reviews.llvm.org/D116926
- Loading branch information
Showing
2 changed files
with
54 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters