288 Commits

Author SHA1 Message Date
Sanjay Patel
2e1f925ba9 [InstSimplify] allow folds for bool vector div/rem
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297411 91177308-0d34-0410-b5e6-96231b3b80d8
2017-03-09 21:56:03 +00:00
Sanjay Patel
5cf1d925cc [ConstantFold] vector div/rem with any zero element in divisor is undef
Follow-up for:
https://reviews.llvm.org/D30665
https://reviews.llvm.org/rL297390


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297409 91177308-0d34-0410-b5e6-96231b3b80d8
2017-03-09 20:42:30 +00:00
Sanjay Patel
ddb500fb8d [InstSimplify] add tests for vector constant folding div/rem-by-0; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297407 91177308-0d34-0410-b5e6-96231b3b80d8
2017-03-09 20:31:20 +00:00
Sanjay Patel
dccf5a1320 [InstSimplify] vector div/rem with any zero element in divisor is undef
This was suggested as a DAG simplification in the review for rL297026 :
http://lists.llvm.org/pipermail/llvm-commits/Week-of-Mon-20170306/435253.html
...but let's start with IR since we have actual docs for IR (LangRef).

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297390 91177308-0d34-0410-b5e6-96231b3b80d8
2017-03-09 16:20:52 +00:00
Sanjay Patel
f0a0c2348e [InstSimplify] add tests for vector div/rem with UB potential; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297048 91177308-0d34-0410-b5e6-96231b3b80d8
2017-03-06 18:45:39 +00:00
Sanjay Patel
f4758b9100 [InstSimplify] regenerate checks; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@297040 91177308-0d34-0410-b5e6-96231b3b80d8
2017-03-06 18:13:01 +00:00
Sanjay Patel
132ef2be48 [InstSimplify] add nsw/nuw (xor X, signbit), signbit --> X
The change to InstCombine in:
https://reviews.llvm.org/D29729
...exposes this missing fold in InstSimplify, so adding this
first to avoid a regression.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295573 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-18 21:59:09 +00:00
Sanjay Patel
f7584cdc50 [InstSimplify] add tests for add nsw/nuw (xor X, signbit), signbit --> X; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@295572 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-18 21:51:14 +00:00
Sanjay Patel
f6e615cc84 [ValueTracking] emit a remark when we detect a conflicting assumption (PR31809)
This is a follow-up to D29395 where we try to be good citizens and let the user know that
we've probably gone off the rails.

This should allow us to resolve:
https://llvm.org/bugs/show_bug.cgi?id=31809

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@294208 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-06 18:26:06 +00:00
Sanjay Patel
24d35c93d6 [ValueTracking] remove a FIXME for something we don't want to do; NFC
The comment was added with:
https://reviews.llvm.org/rL293773
...but there would be a cost to implement this and possibly no payoff.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293823 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-01 22:27:34 +00:00
Sanjay Patel
ab1df8f850 [ValueTracking] avoid crashing from bad assumptions (PR31809)
A program may contain llvm.assume info that disagrees with other analysis. 
This may be caused by UB in the program, so we must not crash because of that.

As noted in the code comments:
https://llvm.org/bugs/show_bug.cgi?id=31809
...we can do better, but this at least avoids the assert/crash in the bug report.

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293773 91177308-0d34-0410-b5e6-96231b3b80d8
2017-02-01 15:41:32 +00:00
Justin Lebar
34292bd5ac [ValueTracking] Implement SignBitMustBeZero correctly for sqrt.
Summary:
Previously we assumed that the result of sqrt(x) always had 0 as its
sign bit.  But sqrt(-0) == -0.

Reviewers: hfinkel, efriedma, sanjoy

Subscribers: llvm-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@293115 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-26 00:10:26 +00:00
Sanjay Patel
b44cec60e3 [InstSimplify] try to eliminate icmp Pred (add nsw X, C1), C2
I was surprised to see that we're missing icmp folds based on 'add nsw' in InstCombine, 
but we should handle the InstSimplify cases first because that could make the InstCombine
code simpler.

Here are Alive-based proofs for the logic:

Name: add_neg_constant
Pre: C1 < 0 && (C2 > ((1<<(width(C1)-1)) + C1))
%a = add nsw i7 %x, C1
%b = icmp sgt %a, C2
  =>
%b = false

Name: add_pos_constant
Pre: C1 > 0 && (C2 < ((1<<(width(C1)-1)) + C1 - 1))
%a = add nsw i6 %x, C1
%b = icmp slt %a, C2
  =>
%b = false

Name: nuw
Pre: C1 u>= C2
%a = add nuw i11 %x, C1
%b = icmp ult %a, C2
  =>
%b = false

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



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292952 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-24 17:03:24 +00:00
Sanjay Patel
ad539e7fe2 [InstSimplify] add tests to show missing folds from 'icmp (add nsw)'; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292841 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-23 22:42:55 +00:00
Chad Rosier
7eb6751ff6 [ValueTracking] Extend known bits to understand @llvm.bitreverse.
Differential Revision: https://reviews.llvm.org/D28780

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292233 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-17 17:23:51 +00:00
Sanjay Patel
e71a092ac9 [InstCombine / InstSimplify] add and move tests for lshr transforms; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291970 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-13 22:54:12 +00:00
Sanjay Patel
16c5e12d3a [InstCombine] if the condition of a select may be known via assumes, eliminate the select
This is a limited solution for PR31512:
https://llvm.org/bugs/show_bug.cgi?id=31512

The motivation is that we will need to increase usage of llvm.assume and/or metadata to solve PR28430:
https://llvm.org/bugs/show_bug.cgi?id=28430

...and this kind of simplification is needed to take advantage of that extra information.

The 'not' test case would be handled by:
https://reviews.llvm.org/D28485

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


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291915 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-13 17:02:42 +00:00
Matt Arsenault
1f4353fb62 InstSimplify: Eliminate fabs on known positive
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291624 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-11 00:33:24 +00:00
David Majnemer
dae3654635 [InstSimplify] Optimize away udivs in the presence of range metadata
We know that udiv %V, C can be optimized away to 0 if %V is ult C.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291296 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-06 22:58:02 +00:00
David Majnemer
ef654a7ee6 [InstSimplify] Optimize away urems in the presence of range metadata
We know that urem %V, C can be optimized away to %V if %V is ult C.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291282 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-06 21:23:51 +00:00
Sanjay Patel
157c03acff [InstSimplify] add tests to show missing select simplifications; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@291043 91177308-0d34-0410-b5e6-96231b3b80d8
2017-01-05 00:40:52 +00:00
Daniel Jasper
8de3a54f07 Revert @llvm.assume with operator bundles (r289755-r289757)
This creates non-linear behavior in the inliner (see more details in
r289755's commit thread).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@290086 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-19 08:22:17 +00:00
Hal Finkel
fe647d2183 Make processing @llvm.assume more efficient by using operand bundles
There was an efficiency problem with how we processed @llvm.assume in
ValueTracking (and other places). The AssumptionCache tracked all of the
assumptions in a given function. In order to find assumptions relevant to
computing known bits, etc. we searched every assumption in the function. For
ValueTracking, that means that we did O(#assumes * #values) work in InstCombine
and other passes (with a constant factor that can be quite large because we'd
repeat this search at every level of recursion of the analysis).

Several of us discussed this situation at the last developers' meeting, and
this implements the discussed solution: Make the values that an assume might
affect operands of the assume itself. To avoid exposing this detail to
frontends and passes that need not worry about it, I've used the new
operand-bundle feature to add these extra call "operands" in a way that does
not affect the intrinsic's signature. I think this solution is relatively
clean. InstCombine adds these extra operands based on what ValueTracking, LVI,
etc. will need and then those passes need only search the users of the values
under consideration. This should fix the computational-complexity problem.

At this point, no passes depend on the AssumptionCache, and so I'll remove
that as a follow-up change.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289755 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-15 02:53:42 +00:00
Sanjay Patel
587c78e31a [Constants] don't die processing non-ConstantInt GEP indices in isGEPWithNoNotionalOverIndexing() (PR31262)
This should fix:
https://llvm.org/bugs/show_bug.cgi?id=31262


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289401 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-11 20:07:02 +00:00
Zia Ansari
ea5455c788 [InstSimplify] Add "X / 1.0" to SimplifyFDivInst.
Differential Revision: https://reviews.llvm.org/D27587


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289153 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-08 23:27:40 +00:00
Sanjay Patel
328a9cb5c6 [InstSimplify] add fdiv x/1.0 test and update checks; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@289098 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-08 20:23:56 +00:00
Sanjay Patel
43179a0fbb [InstSimplify] fixed (?) to not mutate icmps
As Eli noted in the post-commit thread for r288833, the use of
swapOperands() may not be allowed in InstSimplify, so I'm 
removing those calls here pending further review. 

The swap mutates the icmp, and there doesn't appear to be precedent
for instruction mutation in InstSimplify.

I didn't actually have any tests for those cases, so I'm adding
a few here. 



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288855 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-06 22:09:52 +00:00
Sanjay Patel
02d83470ab [InstSimplify] add folds for and-of-icmps with same operands
All of these (and a few more) are already handled by InstCombine,
but we shouldn't have to wait until then to simplify these because
they're cheap to deal with here in InstSimplify.

This is the 'and' sibling of the earlier 'or' patch:
https://reviews.llvm.org/rL288833


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288841 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-06 19:05:46 +00:00
Sanjay Patel
feccc03d8c [InstSimplify] add tests for and-of-icmps; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288837 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-06 18:46:54 +00:00
Sanjay Patel
b4824c6afa [InstSimplify] add folds for or-of-icmps with same operands
All of these (and a few more) are already handled by InstCombine,
but we shouldn't have to wait until then to simplify these because
they're cheap to deal with here in InstSimplify.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288833 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-06 18:09:37 +00:00
Sanjay Patel
b1960d468e [InstSimplify] add tests for or-of-icmps; NFC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288830 91177308-0d34-0410-b5e6-96231b3b80d8
2016-12-06 17:49:10 +00:00
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