[PATCH] D81500: [SVE] Remove calls to VectorType::getNumElements from IR
Sander de Smalen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 23 07:26:17 PDT 2020
sdesmalen added a comment.
In D82211#2104832 <https://reviews.llvm.org/D82211#2104832>, @ctetreau wrote:
> The goal for this patch is to remove all invalid calls to VectorType::getNumElements with as few behavior changes as possible. If some code previously called getNumElements via a base VectorType pointer, we are assuming that it meant to treat the vector as a fixed width vector, and are instead unconditionally casting to FixedVectorType. Any test failures that arise from this change are cases where the assumption wasn't correct, and these are being handled on a case by case basis.
>
> We're trying to avoid behavior changes of the form "this branch used to be taken for scalable vectors, now it isn't" because 1) There are a ton of such cases, and if we had to write tests for all of them right now this work would never get done and 2) A lot of these cases are actually impossible to trigger for scalable vectors (as of today), so we can't actually write tests for them. In general anything that has to do with constants is hard to test with scalable vectors because there are only a few scalable vectors that it's actually possible to construct constants for today. This means that some very strange code will result. Things like:
>
> if (auto *VTy = dyn_cast<VectorType>(Ty)) {
> unsinged NumElts = cast<FixedVectorType>(VTy);
>
>
> If we just dyn_cast to FixedVectorType, then a branch that used to be taken for scalable vectors will now be skipped, and this is a behavior change that requires a new test. It is my hope that this code will look very strange to people familiar with the code in question, and that it will get fixed over time. If this does crash, it will be very obvious that the cast probably isn't correct. People are unlikely to see this and ask themselves "is VTy actually supposed to be a FixedVectorType? Did *I* break this?" We are also intentionally avoiding some "obvious" fixes like `auto *VTy = VectorType::get(SomeTy, SomeVTy->getNumElements())` => `auto *VTy = VectorType::get(SomeTy, SomeVTy->getElementCount())`. While it seems obvious that the second form should be fine, it is technically a behavior change that requires a new test, and this sort of thing happens a lot. As with the dyn_cast issue, if we had to write tests for every instance, this work would never get done.
>
> While reviewing this code, please try to keep this in mind.
This implies behaviour changes for scalable vectors though; code paths that previously worked for scalable vectors will now break.
I'd much prefer us fixing the code for scalable vectors even when there's no test to guard the fixed behaviour, over breaking codepaths for scalable vectors without a test showing what's now broken.
Mostly I'm concerned that this will start breaking things for the ACLE implementation. While the ACLE doesn't rely heavily on common LLVM IR instructions, it does so around a few areas such as GEPs.
It would be nice if we can make the trade-offs a bit more consciously between moving forward with this migration and adding support/test-coverage. I'd like to suggest that:
- Changes like the ones you made for X86 intrinsics in AutoUpgrade.cpp that can only ever use FixedVectorType, can be changed without needing tests.
- For code that is unlikely to need scalable-vector support any time soon because it is part of a separate LLVM tool (i.e. cannot be reached through invocation of Clang) or because we know there are no code-paths currently leading down that road for scalable vectors in practice, to use cast<FixedVectorType> + FIXME.
- For code that is possibly on an execution path for scalable vectors:
- Make the right behavioural change (fix it to support scalable vectors or bail out early) so that nothing breaks.
- Try to add a test for the behavioural test if this is feasible.
- If adding a test is not possible or very convoluted, add a FIXME saying this still needs a test for scalable vectors.
Does that sound like a suitable way forward?
I also understand this is not a one-person job so we're here to help out if you can split off some files/parts we can work on.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D81500/new/
https://reviews.llvm.org/D81500
More information about the llvm-commits
mailing list