[llvm-dev] llvm.assume after CodeGenPrepare
Philip Reames via llvm-dev
llvm-dev at lists.llvm.org
Wed May 26 08:04:26 PDT 2021
My second point should still stand. Not caring about the MI
representation does simplify the work involved, so that's a good
observation.
Philip
On 5/25/21 11:58 PM, Markus Lavin wrote:
>
> That is correct. The only use case I am interested in is when AA is
> queried during scheduling of MI and as Bjorn points out (and afaiu)
> this falls back on assumes being present in the IR. The fact that AA,
> during the MI layer, falls back on IR can indeed seem a bit strange
> but that is simply how it works and not directly related to the
> presence of assumes or not.
>
> AFAIU llvm.assume will iselect to nothing (which effectively also
> eliminates its predecessors if the llvm.assume was their only use) so
> at least for this use case no explicit llvm.assume representation is
> required in the MI layer. The requirement would possibly be different
> if there were other uses of llvm.assume in the MI layer but I am not
> sure what they would be.
>
> -Markus
>
> *From:*Björn Pettersson A <bjorn.a.pettersson at ericsson.com>
> *Sent:* den 25 maj 2021 20:39
> *To:* Philip Reames <listmail at philipreames.com>; Markus Lavin
> <markus.lavin at ericsson.com>; jannh at google.com; nikita.ppv at gmail.com;
> llvm-dev <llvm-dev at lists.llvm.org>
> *Subject:* RE: [llvm-dev] llvm.assume after CodeGenPrepare
>
> I think Markus use case is that MachineInstr::mayAlias may use AA (and
> even possibly TBAA), and AA could make use of llvm.assume to make
> decisions.
>
> So the alias analysis in cadegen is partly based on analysing the
> “final” IR representation before ISel, so the llvm.assume does not
> need to be present in the MI layer for that to work.
>
> PS. It might seem a bit strange and dangerous to use the IR and IR
> analyses during the codegen (e.g. afte PHI elimination), but afaik it
> works as long as MachineMemOperands are handled correctly (being
> dropped or updated correctly when doing certain transforms such as
> store merging).
>
> /Björn
>
> *From:*llvm-dev <llvm-dev-bounces at lists.llvm.org
> <mailto:llvm-dev-bounces at lists.llvm.org>> *On Behalf Of *Philip Reames
> via llvm-dev
> *Sent:* den 25 maj 2021 17:42
> *To:* Markus Lavin <markus.lavin at ericsson.com
> <mailto:markus.lavin at ericsson.com>>; llvm-dev <llvm-dev at lists.llvm.org
> <mailto:llvm-dev at lists.llvm.org>>; jannh at google.com
> <mailto:jannh at google.com>; nikita.ppv at gmail.com
> <mailto:nikita.ppv at gmail.com>
> *Subject:* Re: [llvm-dev] llvm.assume after CodeGenPrepare
>
> I think there's two interacting pieces here:
>
> * I don't believe we have a way to represent an assume at the MI
> layer. If we let them flow through codegen, we'd need to add such
> a thing.
> * The tradeoffs between information preservation and lowering may be
> different at different points in the pipeline. Johannes frames
> this as a canonicalization problem. That sounds reasonable, but
> it's also reasonable that we may need to give up on preserving
> assumes at some point. (As a silly example, we probably don't
> want them at MC.) Where exactly that point is unclear, and is
> mostly a matter of practical engineering tradeoffs.
>
> If you felt like exploring alternate lowering points, that would seem
> entirely reasonable. It might not work out, or it might require a
> bunch of work to make happen, but the basic idea seems entirely worth
> exploring.
>
> Philip
>
> On 5/25/21 3:11 AM, Markus Lavin via llvm-dev wrote:
>
> With recent changes in BasicAA (mostly by Nikita Popov I believe)
> llvm.assumes can now guide in the AA decision making. Which is of
> course great.
>
> For example for C input (or IR equivalent) as follows it can make
> a huge difference if the variable ‘x’ is known to be non-zero when
> AA is queried during scheduling
>
> __builtin_assume(x != 0);
>
> for (int i = 0; i < 64; i += 4) {
>
> v[(i + 0) * x] = v[(i + 0) * x] >> 2;
>
> v[(i + 1) * x] = v[(i + 1) * x] >> 2;
>
> v[(i + 2) * x] = v[(i + 2) * x] >> 2;
>
> v[(i + 3) * x] = v[(i + 3) * x] >> 2;
>
> }
>
> Unfortunately it appears that the CodeGenPrepare pass removes
> llvm.assume so that they never reach the code generator. Currently
> commit 91c9dee3fb6d89ab3 (and before that commit
> 6d20937c29a1a1d67) eliminate assumptions in CodeGenPrepare for
> reasons that appear to be optimization (avoiding blocks that would
> be empty if it was not for the llvm.assume and its predecessors).
>
> It seems these two efforts are quite contradictory. Is there any
> deeper thinking behind this? I for one would be in favor of not
> eliminating assumes.
>
> -Markus
>
> _______________________________________________
>
> LLVM Developers mailing list
>
> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>
> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
> <https://protect2.fireeye.com/v1/url?k=efdd418c-b0467bc9-efdd0117-867b36d1634c-7a75399069504f9e&q=1&e=17991efb-205e-4418-bc44-152a2fed67d4&u=https%3A%2F%2Flists.llvm.org%2Fcgi-bin%2Fmailman%2Flistinfo%2Fllvm-dev>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20210526/8adf88b8/attachment.html>
More information about the llvm-dev
mailing list