[PATCH] D124325: [AArch64][SVE] Support logical operation BIC with DestructiveBinary patterns
Paul Walker via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 21 02:49:13 PDT 2022
paulwalker-arm added inline comments.
================
Comment at: llvm/lib/Target/AArch64/AArch64ExpandPseudoInsts.cpp:592
+ // Zeros the lanes in z0 that aren't active in p0 with sequence movprfx
+ // z0.b, p0/z, z0.b; add z0.b, z0.b, #0;
+ if (DType == AArch64::DestructiveBinary &&
----------------
Allen wrote:
> paulwalker-arm wrote:
> > efriedma wrote:
> > > paulwalker-arm wrote:
> > > > paulwalker-arm wrote:
> > > > > Do any of the tests exercise this code?
> > > > I don't believe this is safe because only predicated instructions are allowed to follow a predicated `movprfx` instruction. There's a section within
> > > > ```
> > > > https://developer.arm.com/documentation/ddi0487/latest/
> > > >
> > > > Data processing - SVE
> > > > -> Move operations
> > > > --> Move prefix
> > > > ```
> > > > that details which instructions are allowed to follow a `movprfx`.
> > > Oh, oops, I misread the documentation. Can we use `lsl z0.b, p0/m, z0.b, #0` instead?
> > I think so but will check if there's an architecture preferred answer and will report back.
> Thanks @paulwalker-arm and @efriedma.
> If we don't have a better architecture preferred answer, how about using **lsl z0.b, p0/m, z0.b, #0** first? In fact, there are very few scenarios where this additional instruction is required, such as case **bic_i64_zero_no_comm**.
lsl is not a great fit for current implementations but as you say this will only be used in rare cases that we ultimately want to solve during register allocation anyway. Plus, looking over the instruction set I'm not sure there's a non-shift alternative so yes let's go with `lsl z0.b, p0/m, z0.b, #0`.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124325/new/
https://reviews.llvm.org/D124325
More information about the llvm-commits
mailing list