[PATCH] D108885: [Delinerization] Keep array element byte offset.
Michael Kruse via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 1 23:04:57 PDT 2021
Meinersbur added a comment.
In D108885#2977230 <https://reviews.llvm.org/D108885#2977230>, @bmahjour wrote:
> If it needs to be isolated to be handled, then I don't see how returning it as a separate parameter makes it more complicated.
It only is handled differently because the legacy code does not expect an additional parameter. However, fixing the bug a higher priority and the individual passes could be improved making proper uses of the returned subscript at a later point.
> The original goal of the delinearization algorithm is to recover source level subscripts.
[citation needed]
If this was true than any delinearization that does not correspond to the original source subscript needed to be considered wrong. However, I am pretty sure we also want to delinearize `A[i +j*n]` even though the source code subscript has been linearized.
> I tried a simple example and it seems that the "element offset" is zero regardless of which member of a structure is being accessed, so not sure if it has any bearing on the ability to delinearize arrays of structs:
It is delinearized as array element `sizeof(float)`, not `sizeof(MyS)` with one dimension twice as large and SCEVAddRecExpr starting with 1 instead of 0. This has to do with how ScalarEvolution tries to remove the struct index from the GEP, modeling it as a simple addition.
Use different elements of different sizes in the struct:
struct __attribute__((packed)) Pair { int x; long y; };
void foo(unsigned long N, struct Pair A[][N]) {
for (unsigned long i = 0; i < N; i+=1)
A[i][i].y = 0;
}
name=opt -delinearize
AccessFunction: {4,+,(12 + (12 * %N))}<%for.cond>
Base offset: %A
ArrayDecl[UnknownSize][%N][8]
ArrayRef[0][{0,+,1}<%for.cond>][{4,+,(4 + (12 * %N))}<%for.cond>]
This is obviously more complicated than it needs to be. Specifically, it still considers element size to be `sizeof(long)`, because that's the access it sees. If accessing `x` instead of `y` the element size would be 4. Polly tries to combine the shapes from multiple delinearization results into a common one such that subscripts are comparable.
Yes, with the current implementation of delinearization, I don't think there are a lot of cases where the byte offset subscript would improve the dependence analysis. Still, I think the right API that allows improving the delinerization includes the byte offset.
Having derived this example, it is much better understandable than the regression test I got from llvm-reduce, I could replace it.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D108885/new/
https://reviews.llvm.org/D108885
More information about the llvm-commits
mailing list