1403 Commits

Author SHA1 Message Date
Mikhail Gudim
9abf3df111
[ValueTracking] Analyze Select in isKnownNonEqual. (#68427)
Basic way to recursively analyze `select` in `isKnownNonEqual`: `select
%c, %t, %f` is non-equal to `%x` if `%t` is non-equal to `%x` and `%f`
is non-equal to `%x`.
2023-10-25 01:08:40 -04:00
Nikita Popov
eb86de63d9
[IR] Require that ptrmask mask matches pointer index size (#69343)
Currently, we specify that the ptrmask intrinsic allows the mask to have
any size, which will be zero-extended or truncated to the pointer size.

However, what semantics of the specified GEP expansion actually imply is
that the mask is only meaningful up to the pointer type *index* size --
any higher bits of the pointer will always be preserved. In other words,
the mask gets 1-extended from the index size to the pointer size. This
is also the behavior we want for CHERI architectures.

This PR makes two changes:
* It spells out the interaction with the pointer type index size more
explicitly.
* It requires that the mask matches the pointer type index size. The
intention here is to make handling of this intrinsic more robust, to
avoid accidental mix-ups of pointer size and index size in code
generating this intrinsic. If a zero-extend or truncate of the mask is
desired, it should just be done explicitly in IR. This also cuts down on
the amount of testing we have to do, and things transforms needs to
check for.

As far as I can tell, we don't actually support pointers with different
index type size at the SDAG level, so I'm just asserting the sizes match
there for now. Out-of-tree targets using different index sizes may need
to adjust that code.
2023-10-24 09:54:29 +02:00
Dhruv Chawla
076581fd95
[ValueTracking] Implement sdiv/udiv support for isKnownNonNullFromDominatingCondition (#67282)
The second operand of a sdiv/udiv has to be non-null, as division by
zero is UB.

Proofs: https://alive2.llvm.org/ce/z/WttZbb

Fixes https://github.com/llvm/llvm-project/issues/64240.
2023-10-20 09:24:33 +05:30
Dhruv Chawla
be57381a4a
[InstCombine] Create a class to lazily track computed known bits (#66611)
This patch adds a new class "WithCache" which stores a pointer to
any type passable to computeKnownBits along with KnownBits
information which is computed on-demand when getKnownBits()
is called. This allows reusing the known bits information when it is
passed as an argument to multiple functions.

It also changes a few functions to accept WithCache(s) so that
known bits information computed in some callees can be propagated to
others from the top level visitAddSub caller.

This gives a speedup of 0.14%:
https://llvm-compile-time-tracker.com/compare.php?from=499d41cef2e7bbb65804f6a815b9fa8b27efce0f&to=fbea87f1f1e6d5552e2bc309f8e201a3af6d28ec&stat=instructions:u
2023-10-17 21:40:18 +05:30
Nikita Popov
d4300154b6 Revert "[ValueTracking] Remove by-ref computeKnownBits() overloads (NFC)"
This reverts commit b5743d4798b250506965e07ebab806a3c2d767cc.

This causes some minor compile-time impact. Revert for now, better
to do the change more gradually.
2023-10-16 14:04:09 +02:00
Nikita Popov
b5743d4798 [ValueTracking] Remove by-ref computeKnownBits() overloads (NFC)
Remove the old overloads that accept KnownBits by reference, in
favor of those that return it by value.
2023-10-16 13:00:31 +02:00
Noah Goldstein
444383e0d0 [ValueTracking] Do more thorough non-zero check in isKnownToBePowerOfTwo when OrZero is no set.
We can cover more cases by directly checking if the result is
known-nonzero for common patterns when they are missing `OrZero`.

This patch add `isKnownNonZero` checks for `shl`, `lshr`, `and`, and `mul`.

Differential Revision: https://reviews.llvm.org/D157309
2023-10-12 16:05:19 -05:00
Noah Goldstein
dfda65c892 [ValueTracking] Add support for non-splat vecs in cmpExcludesZero
Just a small QOL change.
2023-10-12 16:05:19 -05:00
Noah Goldstein
50ece4cba9 [ValueTracking] Add better support for ConstantRange(And)
The fairly common power of two pattern `X & -X` can be capped at the
highest power of 2 (signbit set).
2023-10-12 14:12:26 -05:00
Noah Goldstein
0f8b40a82e [ValueTracking] Add better support for ConstantRange(Shl)
1) If LHS is constant:
    - The low bits of the LHS is set, the lower bound is non-zero
    - The upper bound can be capped at popcount(LHS) high bits
2) If RHS is constant:
    - The upper bound can be capped at (Width - RHS) high bits
2023-10-12 14:12:26 -05:00
Nikita Popov
80fa5a6377 [ValueTracking] Use SimplifyQuery in haveNoCommonBitsSet() (NFC)
Pass SimplifyQuery instead of unpacked list of arguments.
2023-10-10 11:39:59 +02:00
Nikita Popov
1b3cc4e715 [ValueTracking] Use SimplifyQuery for the overflow APIs (NFC)
Accept a SimplifyQuery instead of an unpacked list of arguments.
2023-10-10 10:57:49 +02:00
Matt Arsenault
7a46baa465
ValueTracking: Use fcAllFlags for unknown value (#66393)
In the failure case we return null, which callers are checking. We were
also returning an fcNone which was unused. It's more consistent to
return fcAllFlags as any possible value, such that the value is always
directly usable without checking the returned value.
2023-10-05 13:10:28 -07:00
Mikhail Gudim
4a2a6a4111
[ValueTracking] Try to infer range of select from true and false values. (#68256)
When computing range of `select` instruction, first compute the union of
ranges of "True" and "False" operands of the `select` instruction.
2023-10-05 13:23:05 -04:00
Nikita Popov
ba149f6e09 [ValueTracking] Add SimplifyQuery ctor without TLI (NFC)
While we pretty much always want to pass DT, AC and CxtI, most
places don't care about TLI. Add an overload where this is not
one of the first parameters.
2023-10-05 09:55:00 +02:00
Nikita Popov
941c75a530 [ValueTracking] Return ConstantRange instead of setting limits (NFC)
Same as previously done for intrinsics.
2023-10-05 09:24:20 +02:00
Nikita Popov
74ab4937c1 [ValueTracking] Avoid use of ConstantExpr::getCast()
Use the constant folding API instead.
2023-09-29 11:48:59 +02:00
Yingwei Zheng
9f2fc88b23
[ValueTracking] Simplify uaddo pattern (#65910)
This patch simplifies the overflow check of unsigned addition.

`a + b <u a` implies `a + b <u b`
`a + b >=u a` implies `a + b >=u b`

Alive2: https://alive2.llvm.org/ce/z/H8oK8n
Fixes #65863.
2023-09-29 01:59:17 +08:00
Nikita Popov
dd55ece638 [ValueTracking] Remove unused Depth parameter (NFC)
Clarify that the Depth is always 0 in this function for a future
change.
2023-09-18 11:12:12 +02:00
Tyler Lanphear
1029fd028c
[NFC][ValueTracking] Simplify check in llvm::isBitwiseValue() (#65817)
Change `!isNonZero()` to `isZero()` for a minor readability improvement.
2023-09-08 17:24:04 -07:00
Matt Arsenault
d3c46db494 ValueTracking: exp10 does not introduce poison 2023-09-01 20:23:45 -04:00
Matt Arsenault
301b0e477b ValueTracking: Handle exp10 in computeKnownFPClass
It's the same as the other exps.

https://reviews.llvm.org/D157891
2023-09-01 20:19:55 -04:00
Philip Reames
294ad08ecc Revert "Revert "InstSimplify: Use correct interested FP classes when simplifying fcmp""
This reverts commit 89f0314ee14a4d7f5a92fd63574ba545863df016.  Change does not build.
2023-09-01 12:17:36 -07:00
Zequan Wu
89f0314ee1 Revert "InstSimplify: Use correct interested FP classes when simplifying fcmp"
Revert "InstSimplify: Add baseline tests for reported regression"
Revert "InstSimplify: Start cleaning up simplifyFCmpInst"

This reverts commit 0637b00041c7d6a191d51d9966c4f5f41fb97ab5.
This reverts commit 239fb206de35935416e652b89725d5f3193f78f5.
This reverts commit ddb3f12c428bc4bd5a98913d74dfd7f2402bdfd8.

These commits causes crashes when compiling chromium code, attached reduced ir at: https://reviews.llvm.org/D151887#4634914
2023-09-01 14:54:27 -04:00
Noah Goldstein
dd48a9b056 [ValueTracking] Handle conflicts when computing knownbits of PHI nodes in deadcode; PR65022
Bug was introduced in: https://reviews.llvm.org/D157807

The prior logic assumed that the information from the knownbits
returned from analyzing the `icmp` and its operands in the context
basicblock would be consistent.

This is not necessarily the case if we are analyzing deadcode.

For example with `(icmp sgt (select cond, 0, 1), -1)`. If we take
knownbits for the `select` using knownbits from the operator, we will
know the signbit is zero. If we are analyzing a not-taken from based
on the `icmp` (deadcode), we will also "know" that the `select` must
be negative (signbit is one). This will result in a conflict in
knownbits.

The fix is to just give up on analying the phi-node if its deadcode. We 1) don't want to waste time continuing to analyze it and 2) will be removing it (and its dependencies) later.

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D158960
2023-09-01 02:11:50 -05:00
Matt Arsenault
ddb3f12c42 InstSimplify: Start cleaning up simplifyFCmpInst
Also picks up a few improvements (Some of the fcmp.ll
test names imply they aren't quite testing what was intended.
Checking the sign bit can't be performed with a compare to a 0).

Much of the logic in here is the same as the class detection
logic of fcmpToClassTest. We could unify more with a weaker
version of fcmpToClassTest which returns implied classes rather
than exact class-like compares. Also could unify more with detection
of possible classes in non-splat vectors.

One problem here is we now only perform folds that used
to always work now require a context instruction. This is
because fcmpToClassTest requires the parent function.
Either fcmpToClassTest could tolerate a missing context
function, or we could require passing in one to simplifyFCmpInst.
Without this it's possible to hit the !isNan assert (which feels like
an unnecessary assert). In any case, these cases don't appear in
any tests.

https://reviews.llvm.org/D151887
2023-08-30 11:53:05 -04:00
Johannes Doerfert
e5313ef55f [Attributor] Filter potential callees based on noundef arguments
If a potential callee has more arguments than the call site, the values
passed will be `poison`. If the potential callee would exhibit UB for
such `undef` argument, e.g., they are marked `noundef`, we can rule the
potential callee out.
2023-08-25 14:36:43 -07:00
Noah Goldstein
846ff921ff [ValueTracking] Compute sdiv as non-zero if abs(num) u>= abs(denum)
Just covering an additional case.

Proof: https://alive2.llvm.org/ce/z/MJz9fT

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D157302
2023-08-24 19:43:10 -05:00
Noah Goldstein
7c9fe735d4 [ValueTracking] Strengthen analysis in computeKnownBits of phi
Use the comparison based analysis to strengthen the standard
knownbits analysis rather than choosing either/or.

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D157807
2023-08-22 10:59:03 -05:00
Noah Goldstein
39e9862e6b [ValueTracking] Use predicates for incoming phi-edges to deduce non-zero
This is basically a copy and paste of the same logic we do in
`computeKnownBits` but adapts it for just `isKnownNonZero`.

Differential Revision: https://reviews.llvm.org/D157801
2023-08-22 10:59:02 -05:00
Noah Goldstein
61df774ab7 [ValueTracking] Improve analysis of knownbits from incoming phi edges.
Just fill in missing cases (TODO) for `ugt`, `uge`, `sgt`, `sge`,
`slt`, and `sle`. These are all in the same spirit as `ult`/`uge`, but
each of the other conditions have different constraints.

Proofs: https://alive2.llvm.org/ce/z/gnj4o-

Differential Revision: https://reviews.llvm.org/D157800
2023-08-22 10:59:02 -05:00
Dhruv Chawla
de059a2ea2
[NFC][ValueTracking] Remove calls to computeKnownBits for non-intrinsic CallInsts in isKnownNonZeroFromOperator
For non-intrinsic CallInsts, computeKnownBits only handles range
metadata and checking getReturnedArgOperand(). Both of these are now
handled in isKnownNonZero, so there is no need to fall through to
a call to computeKnownBits anymore.

Differential Revision: https://reviews.llvm.org/D158095
2023-08-16 22:52:13 +05:30
luxufan
43114cb696 [ValueTracking] Dereferenceable and !NullPointerIsDefined imply non-zero
Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D157253
2023-08-14 11:42:21 +08:00
Matt Arsenault
e86be1fd30 ValueTracking: frexp never introduces poison 2023-08-11 19:54:58 -04:00
Matt Arsenault
5dbeed2e5b ValueTracking: ldexp never introduces poison 2023-08-11 19:54:57 -04:00
Noah Goldstein
035aaae45c [ValueTracking] Check likely to be canonicalized constant operands first in ; NFC
Checking operands that a likely to be canonicalized constants first makes sense
from a compile time perspective as it puts whats expected to be a cheaper check first.

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D157313
2023-08-09 14:42:55 -05:00
Noah Goldstein
fbb40df2bf [ValueTracking] In isKnownToBeAPowerOfTwo an i1 value is always true if OrZero is set
This is trivially true.

Differential Revision: https://reviews.llvm.org/D157310
2023-08-09 14:42:55 -05:00
Noah Goldstein
dff3d8a279 [ValueTracking] Add support for mul in isKnownToBeAPowerOfTwo
pow2 * pow2 is a power of 2 or zero.

Proof: https://alive2.llvm.org/ce/z/FNiiXd

Differential Revision: https://reviews.llvm.org/D157308
2023-08-09 14:42:55 -05:00
Noah Goldstein
4f818daca6 [ValueTracking] Add support for fshl/fshr in isKnownToBeAPowerOfTwo
If the funnel shifts are rotates (op0 == op1) then the number of 1s/0s
don't change so we can just look through op0/op1.

Proofs: https://alive2.llvm.org/ce/z/Pja5yu

Differential Revision: https://reviews.llvm.org/D157307
2023-08-09 14:42:55 -05:00
Noah Goldstein
6f4d660d7f [ValueTracking] Add support for bswap and bitreverse in isKnownToBeAPowerOfTwo
Both of these intrinsics don't change the number of 1s/0s so we can
look directly through them.

Proofs: https://alive2.llvm.org/ce/z/gnZuwC

Differential Revision: https://reviews.llvm.org/D157306
2023-08-09 14:42:55 -05:00
Noah Goldstein
03b529a2a6 [ValueTracking] Use switch for Intrinsics in isKnownToBePowerOfTwo; NFC
Differential Revision: https://reviews.llvm.org/D157305
2023-08-09 14:42:54 -05:00
Noah Goldstein
bab8058d3b [ValueTracking] If OrZero is set, look through trunc in isKnownToBePowerOfTwo
Just move coverage.

Proof: https://alive2.llvm.org/ce/z/H37tVX

Differential Revision: https://reviews.llvm.org/D157304
2023-08-09 14:42:54 -05:00
Alexander Kornienko
0b779b0daa Revert "[AggressiveInstCombine] Fold strcmp for short string literals"
This reverts commit 5dde755188e34c0ba5304365612904476c8adfda,
cbfcf90152de5392a36d0a0241eef25f5e159eef and
8981520b19f2d2fe3d2bc80cf26318ee6b5b7473 due to a miscompile introduced in
8981520b19f2d2fe3d2bc80cf26318ee6b5b7473 (see
https://reviews.llvm.org/D154725#4568845 for details)

Differential Revision: https://reviews.llvm.org/D157430
2023-08-08 22:53:45 +02:00
Matt Arsenault
729b55ef5e ValueTracking: Reduce indentation in computeKnownFPClass 2023-08-07 17:32:03 -04:00
Noah Goldstein
f6c726472d Revert "[ValueTracking] Improve the coverage of isKnownToBeAPowerOfTwo for vscale"
Logic is incorrect. Shift can make non-zero pow2 zero.

This reverts commit 9c837b7d0e2e2dffae804f3df49c4aeefe4743c0.
2023-08-07 10:26:05 -05:00
Nikita Popov
5de89b4d99 [ValueTracking] Support non-zero pow2 for shl with nowrap flags
If the shl has either nuw or nsw flags, then we know that bits
cannot be shifted out, so a power of two cannot become zero.

Proofs: https://alive2.llvm.org/ce/z/4QfebE
2023-08-07 17:04:55 +02:00
Nikita Popov
8aeb84c1b6 [ValueTracking] Switch over opcode in isKnownToBeAPowerOfTwo() (NFC)
Similar to the other ValueTracking function, switch over the
instruction opcode instead of doing a long sequence of match()es.
2023-08-07 16:34:15 +02:00
Matt Arsenault
1d9f77f54f ValueTracking: Really remove CannotBeOrderedLessThanZero
6640df94f9abd4f9fef0263afbf7978ac55832b8 did not actually remove it,
just its final user. cannotBeOrderedLessThanZeroImpl still has a user
which needs to be updated before it can be removed.

The users of SignBitMustBeZero currently have broken expectations for
nan handling, so requires more work to replace.
2023-08-07 08:14:41 -04:00
luxufan
4e84ec8184 [ValueTracking] Dereferenceable ret attributes implys noundef
Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D156510
2023-08-07 15:11:03 +08:00
Zhongyunde
9c837b7d0e [ValueTracking] Improve the coverage of isKnownToBeAPowerOfTwo for vscale
this PR tries to match the following pattern, seperate from D156881
     ```
     %vscale = call i64 @llvm.vscale.i64()
     %shift = shl nuw nsw i64 %vscale, 11
     ```
Now, we only check the shl recursively when the OrZero is true.

Reviewed By: goldstein.w.n
Differential Revision: https://reviews.llvm.org/D157062
2023-08-04 09:06:34 +08:00