The source looks like a straightforward canonical loop. What pass
transformed it to have code between the exiting block and the latch?
> But the difference is that vectorize_width() now implies vectorize(enable), and so this is now marked as forced vectorisation which wasn't the case before. Because of this forced vectorization, and that the transformation wasn't applied, we now emit this diagnostic. The first part of this diagnostic is spot on: "the optimizer was unable to perform the requested transformation". We could argue about the suggestions given as to why the transformations didn't happen in this case, but overall I think this is an improvement.
The patch that added the warning as-is was by me
(https://reviews.llvm.org/D55288). It changed to emitted message from
"loop not vectorized: failed explicitly specified loop vectorization"
to the lengthier description following review feedback.
It's done by the WarnMissedTransformation and just looks for
transformation metadata that is still in the IR after all passes that
should have transformed them have ran. That is, it does not know why
it is still there -- it could be because the LoopVectorize pass is not
even in the pipeline -- and we cannot be more specific in the message.
However, -Rpass-missed=loop-vectorize may give more information.
> The additional warning makes sense to me and I think is also beneficial to the user.
>
> Before, we silently ignored vector_width() in the example [1] and I suppose the user was expecting vectorize_width(4) to be honored. Now we are more transparent in informing the user what is happening: we were not able to honor their requested pragma and I assume they would be interested in knowing.
As already mentioned, the loop indeed was never vectorized. It is
again the question whether vectorize_width(4) means "vectorize with
simd length 4" or "if this is vectorized, use simd length 4". Since
the decided on the former (which is also what the docs say), the
warning is correct.
That is, IMHO, Chrome should either remove the #pragma (since it has
no effect), add -Wno-pass-failed. We could also wait for the
LoopVectorize pass to support this, Philip Reames is currently working
on it.
Michael
_______________________________________________
LLVM Developers mailing list
llvm...@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
This was not the only consideration. With ordered transformations,
such as vectorize after unroll-and-jam, the LoopVectorize does not
even have a chance to analyze the code since it is located after the
LoopUnrollAndJam pass. We would still warn that vectorization has not
been performed.
> I recommend that we consider taking a kind of delayed-diagnostic
> approach. When a pass cannot perform the requested transformation, it
> records some rationale into the metadata. That rationale can be reported
> by WarnMissedTransformation, if available, to make the diagnostic more
> helpful. If the transformation is later actually performed, then the
> extra information is discarded along with the transformation metadata
> itself.
I like the idea, but I am not sure how helpful are messages such as
"The exiting block is not the loop latch" or "Cannot identify array
bounds" are to the end user. It would still be an improvement.
If there is no diagnostic metadata, do we keep emitting the current
message? If there already is an explanation metadata, does the new one
override the old one or is it appended?
We could also just a hint to the diagnostic such as
"-Rpass=loop-vectorize may provide more information".
On Oct 4, 2019, at 15:28, Sjoerd Meijer via llvm-dev <llvm...@lists.llvm.org> wrote:Thanks for your replies. That was a very useful discussion.
I won't recommit on a Friday afternoon, but will do on Monday, as it looks like we agreed again on the direction and the change.
Orthogonal to this change, the interesting topics brought up are improved diagnostics, and the cases the vectoriser misses. I will briefly look why this particular case isn't vectorised, but I suspect that it's a simple case of some prep / clean-up passes not running at Oz.
I wasn't familiar with this pragma before, but if the intended meaning
is indeed "vectorize this" and not "if vectorizing, use this width",
then the change makes sense.
The problem I see is that the warning isn't very actionable. Good
warnings are supposed to be actionable, but what is the developer
supposed to do in this case? The code looks perfectly set up for
vectorization, but the compiler doesn't vectorize. What's the fix for
the code?
I think the thread mentioned that someone was working on fixing the
vectorization for this case. Maybe we should wait for that?
(Another question is what we should do at -O0, because there I think
we still don't warn. Does that mean the pragma doesn't have the same
meaning at -O0?)
Thanks,
Hans
Yes it will be correct, but again it's not entirely clear what action
the user should take. Should one always use this #pragma with some
#ifdef to check optimization level? I don't mean to complain, I'm just
not sure what the answer is to these problems.
> IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
Unfortunately, the problem is too complex that we could explain in a
single warning line.
Actionable warnings are nicer, but I don't think we can only emit
warnings if they are actionable.
> I think the thread mentioned that someone was working on fixing the
> vectorization for this case. Maybe we should wait for that?
This would fix one source of this warnings, but unfortunately there
are many reasons why vectorization can fail.
> (Another question is what we should do at -O0, because there I think
> we still don't warn. Does that mean the pragma doesn't have the same
> meaning at -O0?)
-O0 skips the entire optimization pass pipeline, i.e. the code is
never vectorized.
Michael
These warnings depend on optimization options, toolchain (e.g.
LTO,PGO) and target platform. That is, the warning may appear in many
circumstances that have not been tested by an upsteam project. My
suggestion to compile without warning would be:
If the vectorization is not very important, remove the pragma and
leave the decision to the compiler.
If code size in -Oz is more important than vectorization, add
-Wno-pass-failed to the command line in that configuration.
If vectorization is critical (it seems not to since the #pragma is
already guarded by an #if), I see no other way than maintaining a list
of supported configurations or manual vectorization. The vector width
is target-specific already.
This kind of warning has been introduced in r213110, r213112 [1,2].
Unfortunately I have not found a discussion about the unpredictable
nature of forced transformation failure warnings. Maybe we have one
now.
Michael
[1] https://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20140714/225803.html
[2] https://lists.llvm.org/pipermail/cfe-commits/Week-of-Mon-20140714/110132.html