<html>
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body bgcolor="#FFFFFF" text="#000000">
Oh,<br>
and another potential reason for handling aggregate loads and stores
directly is that it expresses the semantics of the program more
clearly, which I think should allow LLVM to optimise more
aggresively.<br>
Here's a bug report showing a missed optimisation, which I think is
due to the use of memcpy, which in turn is required to work around
slow structure loads and stores:<br>
<a class="moz-txt-link-freetext" href="https://llvm.org/bugs/show_bug.cgi?id=23226">https://llvm.org/bugs/show_bug.cgi?id=23226</a><br>
<br>
Cheers,<br>
Nick<br>
<pre class="moz-signature" cols="72">
</pre>
<div class="moz-cite-prefix">On 17/08/2015 22:02, mats petersson via
llvm-dev wrote:<br>
</div>
<blockquote
cite="mid:CAL-htr5Vg9r2pp8dBninbt8s7tr8c3BQ0ajfUJY-Fh+MPvUqSg@mail.gmail.com"
type="cite">
<div dir="ltr">
<div>
<div>
<div>
<div>
<div>
<div>I've definitely "run into this problem", and I
would very much love to remove my kludges [that are
incomplete, because I keep finding places where I
need to modify the code-gen to "fix" the same
problem - this is probably par for the course from a
complete amateur compiler writer and someone that
has only spent the last 14 months working (as a
hobby) with LLVM]. <br>
<br>
</div>
So whilst I can't contribute much on the "what is the
right solution" and "how do we solve this", I would
very much like to see something that allows the user
of LLVM to use load/store withing things like "is my
thing that I'm storing big, if so don't generate a
load, use a memcpy instead". Not only does this make
the usage of LLVM harder, it also causes slow
compilation [perhaps this is a separte problem, but I
have a simple program that copies a large struct a few
times, and if I turn off my "use memcpy for large
things", the compile time gets quite a lot longer -
approx 1000x, and 48 seconds is a long time to compile
37 lines of relatively straight forward code - even
the Pascal compiler on PDP-11/70 that I used at my
school in 1980's was capable of doing more than 1 line
per second, and it didn't run anywhere near 2.5GHz and
had 20-30 users anytime I could use it...]<br>
<br>
../lacsap -no-memcpy -tt longcompile.pas <br>
Time for Parse 0.657 ms<br>
Time for Analyse 0.018 ms<br>
Time for Compile 1.248 ms<br>
Time for CreateObject 48803.263 ms<br>
Time for CreateBinary 48847.631 ms<br>
Time for Compile 48854.064 ms<br>
<br>
</div>
compared with:<br>
../lacsap -tt longcompile.pas <br>
Time for Parse 0.455 ms<br>
Time for Analyse 0.013 ms<br>
Time for Compile 1.138 ms<br>
Time for CreateObject 44.627 ms<br>
Time for CreateBinary 82.758 ms<br>
Time for Compile 95.797 ms<br>
<br>
</div>
wc longcompile.pas <br>
37 84 410 longcompile.pas<br>
<br>
</div>
Source here:<br>
<a moz-do-not-send="true"
href="https://github.com/Leporacanthicus/lacsap/blob/master/test/longcompile.pas">https://github.com/Leporacanthicus/lacsap/blob/master/test/longcompile.pas</a><br>
<br>
</div>
<br>
--<br>
</div>
Mats<br>
</div>
<div class="gmail_extra"><br>
<div class="gmail_quote">On 17 August 2015 at 21:18, deadal nix
via llvm-dev <span dir="ltr"><<a moz-do-not-send="true"
href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span>
wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr">
<div>
<div>
<div>OK, what about that plan :<br>
<br>
</div>
Slice the aggregate into a serie of valid loads/stores
for non atomic ones.<br>
</div>
Use big scalar for atomic/volatile ones.<br>
</div>
Try to generate memcpy or memmove when possible ?<br>
<div><br>
</div>
</div>
<div class="HOEnZb">
<div class="h5">
<div class="gmail_extra"><br>
<div class="gmail_quote">2015-08-17 12:16 GMT-07:00
deadal nix <span dir="ltr"><<a
moz-do-not-send="true"
href="mailto:deadalnix@gmail.com"
target="_blank">deadalnix@gmail.com</a>></span>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0
.8ex;border-left:1px #ccc solid;padding-left:1ex">
<div dir="ltr"><br>
<div class="gmail_extra"><br>
<div class="gmail_quote"><span>2015-08-17
11:26 GMT-07:00 Mehdi Amini <span
dir="ltr"><<a moz-do-not-send="true"
href="mailto:mehdi.amini@apple.com"
target="_blank">mehdi.amini@apple.com</a>></span>:<br>
<blockquote class="gmail_quote"
style="margin:0 0 0 .8ex;border-left:1px
#ccc solid;padding-left:1ex">
<div style="word-wrap:break-word">Hi,
<div><br>
<div><span>
<blockquote type="cite">
<div>On Aug 17, 2015, at 12:13
AM, deadal nix via llvm-dev
<<a
moz-do-not-send="true"
href="mailto:llvm-dev@lists.llvm.org"
target="_blank">llvm-dev@lists.llvm.org</a>>
wrote:</div>
<br>
<div>
<div dir="ltr"><br>
<div class="gmail_extra"><br>
<div class="gmail_quote">2015-08-16
23:21 GMT-07:00 David
Majnemer <span
dir="ltr"><<a
moz-do-not-send="true"
href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span>:<br>
<blockquote
class="gmail_quote"
style="margin:0 0 0
.8ex;border-left:1px
#ccc
solid;padding-left:1ex">
<div dir="ltr"><br>
<div
class="gmail_extra"><br>
<div
class="gmail_quote"><span></span>
<div>Because a
solution which
doesn't
generalize is
not a very
powerful
solution.
What happens
when somebody
says that they
want to use
atomics +
large
aggregate
loads and
stores? Give
them yet
another,
different
answer? That
would mean our
earlier, less
general
answer,
approach was
either a
bandaid (bad)
or the new
answer
requires a
parallel code
path in their
frontend
(worse).</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</blockquote>
<div><br>
</div>
<div><br>
</div>
</span>
<div>+1 with David’s approach:
making thing incrementally
better is fine *as long as* the
long term direction is
identified. Small incremental
changes that makes things
slightly better in the short
term but drives us away of the
long term direction is not good.</div>
<div><br>
</div>
<div>Don’t get me wrong, I’m not
saying that the current patch is
not good, just that it does not
seem clear to me that the long
term direction has been
identified, which explain why
some can be nervous about adding
stuff prematurely. </div>
<div>And I’m not for the status
quo, while I can’t judge it
definitively myself, I even
bugged David last month to look
at this revision and try to
identify what is really the long
term direction and how to make
your (and other) frontends’ life
easier. </div>
<span>
<div><br>
</div>
<div><br>
</div>
</span></div>
</div>
</div>
</blockquote>
<div><br>
</div>
</span>
<div>As long as there is something to be
done. Concern has been raised for very
large aggregate (64K, 1Mb) but there is no
way a good codegen can come out of these
anyway. I don't know of any machine that
have 1Mb of register available to tank the
load. Even I we had a good way to handle
it in InstCombine, the backend would have
no capability to generate something nice
for it anyway. Most aggregates are small
and there is no good excuse to not do
anything to handle them because someone
could generate gigantic ones that won't
map nicely to the hardware anyway.<br>
<br>
</div>
<div>By that logic, SROA should not exists
as one could generate gigantic aggregate
as well (in fact, SROA fail pretty badly
on large aggregates).<br>
<br>
</div>
<div>The second concern raised is for
atomic/volatile, which needs to be handled
by the optimizer differently anyway, so is
mostly irrelevant here.<br>
</div>
</div>
<span>
<div class="gmail_quote">
<div> </div>
<blockquote class="gmail_quote"
style="margin:0 0 0 .8ex;border-left:1px
#ccc solid;padding-left:1ex">
<div style="word-wrap:break-word">
<div>
<div><span>
<blockquote type="cite">
<div>
<div dir="ltr">
<div class="gmail_extra">
<div class="gmail_quote">
<blockquote
class="gmail_quote"
style="margin:0 0 0
.8ex;border-left:1px
#ccc
solid;padding-left:1ex">
<div dir="ltr">
<div
class="gmail_extra">
<div
class="gmail_quote"><span>
<div> </div>
</span></div>
</div>
</div>
</blockquote>
<br>
</div>
<br>
</div>
<div class="gmail_extra">clang
has many developer
behind it, some of them
paid to work on it. That
s simply not the case
for many others.<br>
<br>
</div>
<div class="gmail_extra">But
to answer your questions
:<br>
</div>
<div class="gmail_extra"> -
Per field load/store
generate more
loads/stores than
necessary in many cases.
These can't be
aggregated back because
of padding.<br>
</div>
<div class="gmail_extra"> -
memcpy only work memory
to memory. It is
certainly usable in some
cases, but certainly do
not cover all uses.<br>
</div>
<div class="gmail_extra"><br>
</div>
<div class="gmail_extra">I'm
willing to do the memcpy
optimization in
InstCombine (in fact,
things would not
degenerate into so much
bikescheding, that would
already be done).<br>
</div>
</div>
</div>
</blockquote>
<div><br>
</div>
</span></div>
</div>
<div>Calling out “bikescheding” what
other devs think is what keeps the
quality of the project high is
unlikely to help your patch go
through, it’s probably quite the
opposite actually.</div>
<div><br>
</div>
<div><br>
</div>
</div>
</blockquote>
<br>
</div>
</span>I understand the desire to keep quality
high. That's is not where the problem is. The
problem lies into discussing actual proposal
against hypothetical perfect ones that do not
exists.<br>
</div>
<div class="gmail_extra"><br>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</div>
<br>
_______________________________________________<br>
LLVM Developers mailing list<br>
<a moz-do-not-send="true"
href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>
<a moz-do-not-send="true"
href="http://llvm.cs.uiuc.edu" rel="noreferrer"
target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a moz-do-not-send="true"
href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev"
rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
<br>
</blockquote>
</div>
<br>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
LLVM Developers mailing list
<a class="moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a> <a class="moz-txt-link-freetext" href="http://llvm.cs.uiuc.edu">http://llvm.cs.uiuc.edu</a>
<a class="moz-txt-link-freetext" href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a>
</pre>
</blockquote>
<br>
</body>
</html>