1587 Commits

Author SHA1 Message Date
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
Dhruv Chawla
d899dc5296
[NFC][ValueTracking]: Move some code from isKnownNonZero to isKnownNonZeroFromOperator
There is some pointer simplification code originally from isKnownNonNull
that is now better suited to be in isKnownNonZeroFromOperator.

Differential Revision: https://reviews.llvm.org/D156141
2023-07-26 13:50:38 +05:30
Dhruv Chawla
de7a7aa110
[NFC][ValueTracking]: Remove redundant computeKnownBits call for LoadInst in isKnownNonZero
For load instructions, computeKnownBits only checks the range metadata.
This check is already present in isKnownNonZero, so there is no need to
fall through to computeKnownBits.

This change gives a speed improvement of 0.12-0.18%:
https://llvm-compile-time-tracker.com/compare.php?from=3c6ed559e5274307995586c1499a2c8e4e0276a0&to=78b462d8c4ae079638b728c6446da5999c4ee9f8&stat=instructions:u

Differential Revision: https://reviews.llvm.org/D155958
2023-07-24 15:29:46 +05:30
Matt Arsenault
d873a14e93 ValueTracking: Implement computeKnownFPClass for frexp
Work around the lack of proper multiple return values by looking
at the extractvalue.

https://reviews.llvm.org/D150982
2023-07-21 16:04:13 -04:00
Nikita Popov
4f7e03463f [ValueTracking] Check non-zero operator before dominating condition (NFC)
Prefer checking for non-zero operator before non-zero via
dominating conditions. This is to make sure we don't have
compile-time regressions when special cases that are currently
part of isKnownNonZero() get moved into isKnownNonZeroFromOperator().
2023-07-21 15:56:41 +02:00
Nikita Popov
98b10727b1 [ValueTracking] Extract isKnownNonZeroFromOperator() (NFC)
Split off the primary part of the isKnownNonZero() implementation,
in the same way it is done for computeKnownBits(). This makes it
easier to reorder different parts of isKnownNonZero().
2023-07-21 15:51:29 +02:00
Maksim Kita
8981520b19 [AggressiveInstCombine] Fold strcmp for short string literals
Fold strcmp() against 1-char string literals.

This designates AggressiveInstCombine as the pass for libcalls
simplifications that may need to change the control flow graph.

Fixes https://github.com/llvm/llvm-project/issues/58003.

Differential Revision: https://reviews.llvm.org/D154725
2023-07-19 17:12:27 +02:00
Matt Arsenault
f868c22bee ValueTracking: Fix computeKnownFPClass canonicalize handling
This mostly manifested as broken constant folding. This was
mishandling the dynamic denormal mode. It was also mishandling literal
signaling nans, such that they would also be treated as poison.

https://reviews.llvm.org/D155437
2023-07-18 06:37:15 -04:00
Matt Arsenault
82c65cc8f8 ValueTracking: Fix computeKnownFPClass for vector-with-scalar powi
Fixes regression reported after
0f4eb557e87912afa412b1b0299d10eb7443410b
2023-07-17 17:27:48 -04:00
zhongyunde
4d2723bd00 [ValueTracking] Support vscale assumes for isKnownToBeAPowerOfTwo
This patch is separated from D154953 to see what tests are affected by this
change alone according comment.
Depend on the related updating of LangRef on D155193.

Reviewed By: paulwalker-arm, nikic, david-arm
Differential Revision: https://reviews.llvm.org/D155350
2023-07-15 19:42:58 +08:00
Matt Arsenault
6ed48ebf2e ValueTracking: Recognize fpclass clamping select patterns
Improve computeKnownFPClass select handling to cover the case where
the condition performs a class test. This allows us to recognize
no-nans in cases like:

  %not.nan = fcmp ord float %x, 0.0
  %select = select i1 %not.nan, float %x, float 0.0

Math library code has similar edge case filtering on the inputs and
final results.

https://reviews.llvm.org/D153089
2023-07-12 13:14:05 -04:00
Matt Arsenault
0f4eb557e8 ValueTracking: Replace CannotBeNegativeZero
This is now just a wrapper around computeKnownFPClass.
2023-07-12 13:14:05 -04:00
Matt Arsenault
c457619c5b ValueTracking: ldexp cannot return denormals based on range of exponent
The implementations of a number of math functions on amdgpu involve
pre and post-scaling the inputs out of the denormal range. If these
are chained together we can possibly fold them out.

computeConstantRange seems weaker than computeKnownBits, so this
regresses some of the older vector tests.
2023-07-11 14:53:03 -04:00
Matt Arsenault
e1ac984a10 ValueTracking: Implement computeKnownFPClass for ldexp
https://reviews.llvm.org/D149590
2023-07-11 09:26:41 -04:00
Nikita Popov
2e0af16c93 [ValueTracking] Support add+icmp assumes for KnownBits
Support the canonical range check pattern for KnownBits assumptions.
This is the same as the generic ConstantRange handling, just shifted
by an offset.
2023-07-05 16:15:47 +02:00
Nikita Popov
c6a4fc8ddf [ValueTracking] Determine assume KnownBits using ConstantRange
For non-equality icmps, we don't do any KnownBits-specific
reasoning, and just use the known bits as a constraint on the range.
We can generalize this for all predicates by round-tripping through
ConstantRange and using makeAllowedICmpRegion().

The minor improvement in zext-or-icmp is because we assume that
a value is ult [0,1], which means it must be zero.
2023-07-05 14:00:03 +02:00
Nikita Popov
8d3856836c [ValueTracking] Don't handle ptrtoint with mismatches sizes
When processing assumes, we also handle assumes on ptrtoint of the
value. In canonical IR, these will have the same size as the value.
However, in non-canonical IR there may be an implicit zext or
trunc, which results in a bit width mismatch. We currently handle
this by adjusting bitwidth everywhere, but this is fragile and I'm
pretty sure that the way we do this is incorrect for some predicates,
because we effectively end up commuting an ext/trunc and an icmp.

Instead, add an m_PtrToIntSameSize() matcher that will only handle
bitwidth preserving cases. For the bitwidth-changing cases, wait
until they have been canonicalized.

The original handling for this was added purely to prevent crashes
in an earlier implementation which failed to account for this
entirely.
2023-07-05 12:18:00 +02:00