diff options
author | Sanjay Patel <spatel@rotateright.com> | 2018-06-21 20:15:09 +0000 |
---|---|---|
committer | Sanjay Patel <spatel@rotateright.com> | 2018-06-21 20:15:09 +0000 |
commit | a76b70069d46dd13ec1a6631e5bcfde752bc3be3 (patch) | |
tree | b75eee30c1671455e833ce857e91e8e3c29932f5 /clang/lib/Frontend/CompilerInvocation.cpp | |
parent | aef6c79d28be9d1a4703b585539f2005e2315d36 (diff) | |
download | bcm5719-llvm-a76b70069d46dd13ec1a6631e5bcfde752bc3be3.tar.gz bcm5719-llvm-a76b70069d46dd13ec1a6631e5bcfde752bc3be3.zip |
[InstCombine] fold vector select of binops with constant ops to 1 binop (PR37806)
This is the simplest case from PR37806:
https://bugs.llvm.org/show_bug.cgi?id=37806
If we have a common variable operand used in a pair of binops with vector constants
that are vector selected together, then we can constant shuffle the constant vectors
to eliminate the shuffle instruction.
This has some tricky parts that are hopefully addressed in the tests and their
respective comments:
1. If the shuffle mask contains an undef element, then that lane of the result is
undef:
http://llvm.org/docs/LangRef.html#shufflevector-instruction
Therefore, we can replace the constant in that lane with an undef value except
for div/rem. With div/rem, an undef in the divisor would cause the whole op to
be undef. So I'm using the same hack as in D47686 - replace the undefs with '1'.
2. Intersect the wrapping and FMF of the original binops for the new binop. There
should be no extra poison or fast-math potential in the new binop that wasn't
possible in the original code.
3. Disregard other uses. Given that we're eliminating uses (shortening the
dependency chain), I think that's always the right IR canonicalization. But
I purposely chose the udiv test to demonstrate the scenario where both
intermediate values have other uses because that seems likely worse for
codegen with an expensive math op. This seems like a very rare possibility to
me, so I don't think it requires a backend patch first.
Differential Revision: https://reviews.llvm.org/D48401
llvm-svn: 335283
Diffstat (limited to 'clang/lib/Frontend/CompilerInvocation.cpp')
0 files changed, 0 insertions, 0 deletions