Commit Graph

257 Commits

Author SHA1 Message Date
Sanjoy Das
cf6e9a81f6 Simplify x >=u x >> y and x >=u x udiv y
Summary:
Extends InstSimplify to handle both `x >=u x >> y` and `x >=u x udiv y`.

This is a folloup of rL258422 and
https://github.com/rust-lang/rust/pull/30917 where llvm failed to
optimize away the bounds checking in a binary search.

Patch by Arthur Silva!

Reviewers: sanjoy

Subscribers: llvm-commits

Differential Revision: https://reviews.llvm.org/D25941

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@285228 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-26 19:18:43 +00:00
Sanjay Patel
bac9c437ae [InstSimplify] fold negation of sign-bit
0 - X --> X, if X is 0 or the minimum signed value
0 - X --> 0, if X is 0 or the minimum signed value and the sub is NSW

I noticed this pattern might be created in the backend after the change from D25485, 
so we'll want to add a similar fold for the DAG.

The use of computeKnownBits in InstSimplify may be something to investigate if the
compile time of InstSimplify is noticeable. We could replace computeKnownBits with 
specific pattern matchers or limit the recursion.

Differential Revision: https://reviews.llvm.org/D25785


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284649 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-19 21:23:45 +00:00
Sanjay Patel
0ca2107254 [InstSimplify] move one and add more tests for potential negation folds
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@284627 91177308-0d34-0410-b5e6-96231b3b80d8
2016-10-19 18:42:12 +00:00
Sanjay Patel
435dd3c7ec [InstSimplify] allow or-of-icmps folds with vector splat constants
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282592 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-28 14:27:21 +00:00
Sanjay Patel
656a511363 [InstSimplify] add vector splat tests for or-of-icmps
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282591 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-28 14:17:35 +00:00
Sanjay Patel
c17583a507 [InstSimplify] allow and-of-icmps folds with vector splat constants
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@282590 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-28 13:53:13 +00:00
Andrea Di Biagio
d9dffbdd6a [ConstantFold] Improve the bitcast folding logic for constant vectors.
The constant folder didn't know how to always fold bitcasts of constant integer
vectors. In particular, it was unable to handle the case where a constant vector
had some undef elements, and the resulting (i.e. bitcasted) vector type had more
elements than the original vector type.

Example:
  %cast = bitcast <2 x i64><i64 undef, i64 2> to <4 x i32>

On a little endian target, %cast could have been folded to:
  <4 x i32><i32 undef, i32 undef, i32 2, i32 0>

This patch improves the folding logic by teaching how to correctly propagate
undef elements in the folded vector.

Differential Revision: https://reviews.llvm.org/D24301


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281343 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-13 14:50:47 +00:00
Andrea Di Biagio
93627d9415 [InstSimplify] Add tests to show missed bitcast folding opportunities.
InstSimplify doesn't always know how to fold a bitcast of a constant vector.
In particular, the logic in InstSimplify doesn't know how to handle the case
where the constant vector in input contains some undef elements, and the
number of elements is smaller than the number of elements of the bitcast
vector type.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@281332 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-13 13:17:42 +00:00
Dehao Chen
fcc57ae781 Add unittest for r280760
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280963 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-08 16:53:40 +00:00
Andrea Di Biagio
959abb8a67 Regenerate vector bitcast folding tests using update_test_checks.py.
Two tests have been merged together, regenerated and then moved to
a more appropriate directory. No functional change.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280814 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-07 14:50:07 +00:00
Andrea Di Biagio
74f53f3812 [instsimplify] Fix incorrect folding of an ordered fcmp with a vector of all NaN.
This patch fixes a crash caused by an incorrect folding of an ordered comparison
between a packed floating point vector and a splat vector of NaN.

An ordered comparison between a vector and a constant vector of NaN, should
always be folded into a constant vector where each element is i1 false.

Since revision 266175, SimplifyFCmpInst folds the ordered fcmp into a scalar
'false'. Later on, this would cause an assertion failure, since the value type
of the folded value doesn't match the expected value type of the uses of the
original instruction: "Assertion failed: New->getType() == getType() &&
"replaceAllUses of value with new value of different type!".

This patch fixes the issue and adds a test case to the already existing test
InstSimplify/floating-point-compares.ll.

Differential Revision: https://reviews.llvm.org/D24143


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280488 91177308-0d34-0410-b5e6-96231b3b80d8
2016-09-02 14:47:43 +00:00
Sanjay Patel
f097e134b1 [InstCombine] replace divide-by-constant checks with asserts; NFC
These folds already have tests for scalar and vector types, except 
for the vector div-by-0 case, so I'm adding tests for that.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280115 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-30 17:31:34 +00:00
Sanjay Patel
d439a66862 [InstSimplify] allow icmp with constant folds for splat vectors, part 2
Completes the m_APInt changes for simplifyICmpWithConstant().

Other commits in this series:
https://reviews.llvm.org/rL279492
https://reviews.llvm.org/rL279530
https://reviews.llvm.org/rL279534
https://reviews.llvm.org/rL279538



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@279543 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-23 18:00:51 +00:00
Sanjay Patel
405b046cb5 [InstSimplify] allow icmp with constant folds for splat vectors, part 1
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@279538 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-23 17:30:56 +00:00
Sanjay Patel
f98248330c [InstSimplify] add tests to show missing vector icmp folds
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@279534 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-23 17:13:38 +00:00
Sanjay Patel
d09e4ee68a [InstSimplify] move icmp with constant tests to another file; NFC
...because like the corresponding code, this is just too big to keep adding to.
And the next step is to add a vector version of each of these tests to show
missed folds.

Also, auto-generate CHECK lines and add comments for the tests that correspond to
the source code.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@279530 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-23 16:46:53 +00:00
David Majnemer
0bf24e0333 [InstSimplify] Fold gep (gep V, C), (xor V, -1) to C-1
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@278779 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-16 06:13:46 +00:00
David Majnemer
7428509ec4 [InstSimplify] Fold gep (gep V, C), (sub 0, V) to C
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277952 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-07 07:58:12 +00:00
David Majnemer
2a07d9fdb3 [InstSimplify] Try hard to simplify pointer comparisons
Simplify ptrtoint comparisons involving operands with different source
types.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277951 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-07 07:58:10 +00:00
Sanjay Patel
5c3c157c52 remove FIXME comments (fixed with r277738)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277744 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 18:14:02 +00:00
Sanjay Patel
47b6d6791b [InstCombine] use m_APInt to allow icmp eq (op X, Y), C folds for splat constant vectors
I'm removing a misplaced pair of more specific folds from InstCombine in this patch as well,
so we know where those folds are happening in InstSimplify.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277738 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 17:48:04 +00:00
Sanjay Patel
2c8de85448 add tests for missing vector folds
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277736 91177308-0d34-0410-b5e6-96231b3b80d8
2016-08-04 16:48:30 +00:00
David Majnemer
8065d776a0 [ConstantFolding] Use ConstantExpr::getWithOperands
ConstantExpr::getWithOperands does much of the hard work that
ConstantFoldInstOperandsImpl tries to do but more completely.

This lets us fold ExtractValue/InsertValue expressions.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277100 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-29 03:27:31 +00:00
David Majnemer
fd8b386557 [ConstantFolding] Don't bail on folding if ConstantFoldConstantExpression fails
When folding an expression, we run ConstantFoldConstantExpression on
each operand of that expression.
However, ConstantFoldConstantExpression can fail and retur nullptr.

Previously, we would bail on further refining the expression.
Instead, use the original operand and see if we can refine a later
operand.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276959 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-28 06:39:48 +00:00
David Majnemer
00429d5fa9 [ConstantFolding] Correctly handle failures in ConstantFoldConstantExpressionImpl
Failures in ConstantFoldConstantExpressionImpl were ignored causing
crashes down the line.

This fixes PR28725.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276827 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-27 02:39:16 +00:00
David Majnemer
e37fa0be6d Reapply: [InstSimplify] Add support for bitcasts"
This reverts commit r276700 and reapplies r276698.
The relevant clang tests have been updated.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276727 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-26 05:52:29 +00:00
David Majnemer
f6fdf20c5f Revert "[InstSimplify] Add support for bitcasts"
This reverts commit r276698.  Clang has tests which rely on the
optimizer :(

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276700 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-25 22:24:59 +00:00
David Majnemer
66e75f38d9 [InstSimplify] Add support for bitcasts
BitCasts of BitCasts can be folded away as can BitCasts which don't
change the type of the operand.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276698 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-25 22:04:58 +00:00
Sanjay Patel
366a2caf93 [InstSimplify] don't crash handling a pointer or aggregate type
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276345 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-21 21:56:00 +00:00
Sanjay Patel
32995b5eb3 [InstSimplify] recognize trunc + icmp sgt/slt variants of select simplifications (PR28466)
rL245171 exposed a hole in InstSimplify that manifested in a strange way in PR28466:
https://llvm.org/bugs/show_bug.cgi?id=28466

It's possible to use trunc + icmp sgt/slt in place of an and + icmp eq/ne, so we need to
recognize that pattern to eliminate selects that are choosing between some value and some
bitmasked version of that value.

Note that there is significant room for improvement (refactoring) and enhancement (more
patterns, possibly in InstCombine rather than here).

Differential Revision: https://reviews.llvm.org/D22537



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276341 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-21 21:26:45 +00:00
Sanjay Patel
d1938d1914 add vector tests and a simpler version of the negative tests
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276328 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-21 20:11:08 +00:00
Sanjay Patel
4c8b3b4588 [InstSimplify][InstCombine] don't crash when folding vector selects of icmp
Differential Revision: https://reviews.llvm.org/D22602


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276209 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-20 23:40:01 +00:00
Sanjay Patel
5f33cbe2bf add even more missing tests for simplifySelectBitTest()
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@276024 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-19 20:47:00 +00:00
Sanjay Patel
d9f3c5ebc0 add tests related to PR28466
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275995 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-19 17:07:35 +00:00
Sanjay Patel
779845c3ce add missing test for simplifySelectBitTest()
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275990 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-19 16:49:55 +00:00
Sanjay Patel
52f3fd0660 auto-generate checks
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275899 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-18 20:06:51 +00:00
David Majnemer
6d67ce109b Simplify llvm.masked.load w/ undef masks
We can always pick the passthru value if the mask is undef: we are
permitted to treat the mask as-if it were filled with zeros.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275379 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-14 06:58:37 +00:00
David Majnemer
3dc0c3e82b [ConstantFolding] Fold masked loads
We can constant fold a masked load if the operands are appropriately
constant.

Differential Revision: http://reviews.llvm.org/D22324

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275352 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-14 00:29:50 +00:00
David Majnemer
46fef919d4 [ConstantFolding] Extend FoldReinterpretLoadFromConstPtr to handle negative offsets
Treat loads which clip before the start of a global initializer the same
way we treat clipping beyond the end of the initializer: use zeros.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275345 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-13 23:33:07 +00:00
Hal Finkel
b0d67723f0 Pointer-comparison folding should look through returned-argument functions
For functions which are known to return a specific argument, pointer-comparison
folding can look through the function calls as part of its analysis.

Differential Revision: http://reviews.llvm.org/D9387

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@275039 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-11 03:37:59 +00:00
Davide Italiano
d0de2d93f5 [PM] Port InstSimplify to the new pass manager.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274796 91177308-0d34-0410-b5e6-96231b3b80d8
2016-07-07 21:14:36 +00:00
David Majnemer
35fad14a31 [InstSimplify] Replace calls to null with undef
Calling null is undefined behavior, we can simplify the resulting value
to undef.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273777 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-25 07:37:30 +00:00
Sanjay Patel
efa1f7f367 [ValueTracking] improve ComputeNumSignBits for vector constants
This is similar to the computeKnownBits improvement in rL268479. 
There's probably more we can do for vector logic instructions, but 
this should let us see non-splat constant masking ops that can
become vector selects instead of and/andn/or sequences.

Differential Revision: http://reviews.llvm.org/D21610



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273459 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-22 19:20:59 +00:00
Sanjay Patel
0993083d68 [InstSimplify] add ashr tests including vector types
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273421 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-22 14:18:04 +00:00
Sanjay Patel
525981004f [InstSimplify] regenerate checks
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273419 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-22 14:00:16 +00:00
Sanjay Patel
832e25415d [InstSimplify] analyze (optionally casted) icmps to eliminate obviously false logic (PR27869)
By moving this transform to InstSimplify from InstCombine, we sidestep the problem/question
raised by PR27869:
https://llvm.org/bugs/show_bug.cgi?id=27869
...where InstCombine turns an icmp+zext into a shift causing us to miss the fold.

Credit to David Majnemer for a draft patch of the changes to InstructionSimplify.cpp.

Differential Revision: http://reviews.llvm.org/D21512



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273200 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-20 20:59:59 +00:00
Sanjay Patel
4e73ba41a0 [InstSimplify] add tests for PR27689; regenerate checks
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@273128 91177308-0d34-0410-b5e6-96231b3b80d8
2016-06-19 21:40:12 +00:00
Sanjay Patel
e571983e6c [ValueTracking, InstSimplify] extend isKnownNonZero() to handle vector constants
Similar in spirit to D20497 :
If all elements of a constant vector are known non-zero, then we can say that the
whole vector is known non-zero.

It seems like we could extend this to FP scalar/vector too, but isKnownNonZero()
says it only works for integers and pointers for now.

Differential Revision: http://reviews.llvm.org/D20544


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@270562 91177308-0d34-0410-b5e6-96231b3b80d8
2016-05-24 14:18:49 +00:00
Sanjay Patel
526957f4ed [InstSimplify] add vector tests for isKnownNonZero
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@270498 91177308-0d34-0410-b5e6-96231b3b80d8
2016-05-23 22:09:04 +00:00
Elena Demikhovsky
746e3cee24 Vector GEP - fixed a crash on InstSimplify Pass.
Vector GEP with mixed (vector and scalar) indices failed on the InstSimplify Pass when all indices are constants.

Differential revision http://reviews.llvm.org/D20149



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@269590 91177308-0d34-0410-b5e6-96231b3b80d8
2016-05-15 12:30:25 +00:00