26838 Commits

Author SHA1 Message Date
Yingwei Zheng
d10ee8942f
[InstCombine] Add sext version of pre-commit tests for PR65852. NFC. 2023-09-19 01:53:22 +08:00
Konstantina Mitropoulou
135e5216ba
[NewGVN] Set parent to the temporal instructions that are generated during phi-of-ops optimization (#66314)
- Test for future commit in NewGVN
- [NewGVN] Set parent to the temporal instructions that are generated
during phi-of-ops optimization
2023-09-18 10:13:44 -07:00
Yingwei Zheng
2a38d83918
[InstSimplify] Add pre-commits for PR#66606. NFC. 2023-09-19 01:00:34 +08:00
Nikita Popov
38c59b9f53 Revert "Reapply [Verifier] Sanity check alloca size against DILocalVariable fragment size"
This reverts commit 47324cfd7d8ca1a2a5cbb9f948ecff66a28ee6bc.

This exposed incorrect debuginfo in rustc. Revert the verification
until this has been fixed.
2023-09-18 17:24:53 +02:00
Yingwei Zheng
dc118147f2
[InstCombine] Add pre-commit tests for PR65073. NFC. 2023-09-18 22:27:05 +08:00
Nikita Popov
c7aacbb5b6 [ArgPromotion] Update allocsize indices after promotion
Promotion can add/remove arguments. We need to update the
indices in the allocsize attribute accordingly.

Fixes https://github.com/llvm/llvm-project/issues/66103.
2023-09-18 16:15:16 +02:00
Yingwei Zheng
be2723da5c
[InstSimplify] Fold icmp of X and/or C1 and X and/or C2 into constant (#65905)
This patch simplifies the pattern `icmp X and/or C1, X and/or C2` when
one constant mask is the subset of the other.
If `C1 & C2 == C1`, `A = X and/or C1`, `B = X and/or C2`, we can do the
following folds:
`icmp ule A, B -> true`
`icmp ugt A, B -> false`
We can apply similar folds for signed predicates when `C1` and `C2` are
the same sign:
`icmp sle A, B -> true`
`icmp sgt A, B -> false`

Alive2: https://alive2.llvm.org/ce/z/Q4ekP5
Fixes #65833.
2023-09-18 21:32:48 +08:00
Kohei Asano
baf031a853
[MemCpyOpt] fix miscompile for non-dominated use of src alloca for stack-move optimization (#66618)
Stack-move optimization, the optimization that merges src and dest
alloca of the full-size copy, replaces all uses of the dest alloca with
src alloca. For safety, we needed to check all uses of the dest alloca
locations are dominated by src alloca, to be replaced. This PR adds the
check for that.

Fixes #65225
2023-09-18 21:29:10 +09:00
Nikita Popov
efe4e7a026
[SCEV] Fix incorrect nsw inference for multiply of addrec (#66500)
SCEV currently preserves the nsw flag when performing an nsw multiply of
an nsw addrec. While this is legal for nuw, this is not generally the
case for nsw.

This is because nsw mul does not distribute over nsw add:
https://alive2.llvm.org/ce/z/mergCt

Instead, we need either both nuw and nsw to be set
(https://alive2.llvm.org/ce/z/7wpgGc) or explicitly prove that the
distributed multiplications are also nsw
(https://alive2.llvm.org/ce/z/wef9su).

Fixes https://github.com/llvm/llvm-project/issues/66066.
2023-09-18 08:23:10 +02:00
Ben Shi
068357d9b0
[VectorCombine] Enable transform 'scalarizeLoadExtract' for scalable vector types (#65443)
The transform 'scalarizeLoadExtract' can be applied to scalable
vector types if the index is less than the minimum number of elements.

The check whether the index is less than the minimum number of elements
locates at line 1175~1180. 'scalarizeLoadExtract' will call
'canScalarizeAccess' and check the returned result if this transform is safe.

At the beginning of the function 'canScalarizeAccess', the index will be
checked
1. If it is less than the number of elements of a fixed vector type.
2. If it is less than the minimum number of elements of a scalable vector type.

Otherwise 'canScalarizeAccess' will return unsafe and this transform
will be prevented.
2023-09-18 10:49:18 +08:00
Yingwei Zheng
1679b20cd0
[InstCombine] Fix transforms of two select patterns (#65845)
This patch fixes transforms of `select (~a | c), a, b` and `select (c &
b), a, b` as discussed in [D158983](https://reviews.llvm.org/D158983).
Alive2: https://alive2.llvm.org/ce/z/ft6TDw
2023-09-18 01:28:37 +08:00
Yingwei Zheng
a054d89cd4
[InstSimplify] Add signed version of pre-commit tests for PR65905. NFC. 2023-09-17 22:36:01 +08:00
Yingwei Zheng
2f45b56728
[InstSimplify] Add pre-commit tests for PR65905. NFC. 2023-09-17 20:40:19 +08:00
Yingwei Zheng
3aec4f9ae3
[InstCombine] Add pre-commit tests for PR65845
See also https://reviews.llvm.org/D158983
2023-09-17 19:23:17 +08:00
Yingwei Zheng
bce6c53464
[InstSimplify] Add pre-commit tests for PR65910. NFC. 2023-09-16 20:07:04 +08:00
Antonio Frighetto
ce5b88bf10 [InstCombine] Handle constant arms in select of srem fold
Extend folding for `2^n` euclidean division remainder operations
on signed integers by handling the specific instance in which one
`select` arm has already been replaced by 1.

Reported-By: HypheX

Fixes: https://github.com/llvm/llvm-project/issues/66417.
2023-09-16 12:22:46 +02:00
Alexey Bataev
434aa2fe56 [SLP]Improve canreuseExtracts for reordering analysis.
Improve the analysis in canReuseExtracts for the reodering to better
reorder extracts for ExtractSubvector pattern.
2023-09-15 12:09:45 -07:00
Anton Korobeynikov
51d5d7bbae
Extend retcon.once coroutines lowering to optionally produce a normal result (#66333)
One of the main user of these kind of coroutines is swift. There yield-once (`retcon.once`) coroutines are used to temporary "expose" pointers to internal fields of various objects creating borrow scopes.

However, in some cases it might be useful also to allow these coroutines to produce a normal result, but there is no convenient way to represent this (as compared to switched-resume kind of coroutines where C++ `co_return`
is transformed to a member / callback call on promise object).

The extension is simple: we allow continuation function to have a non-void result and accept optional extra arguments via a special `llvm.coro.end.result` intrinsic that would essentially forward them as normal results.
2023-09-15 09:54:38 -07:00
bipmis
530a45c296 Add a or(phi,phi) test without loops 2023-09-15 16:18:25 +01:00
Nikita Popov
47324cfd7d Reapply [Verifier] Sanity check alloca size against DILocalVariable fragment size
Reapply after fixing a clang bug this exposed in D158972 and
adjusting a number of tests that failed for 32-bit targets.

-----

Add a check that the DILocalVariable fragment size in dbg.declare
does not exceed the size of the alloca.

This would have caught the invalid debuginfo regenerated by rustc
in https://github.com/llvm/llvm-project/issues/64149.

Differential Revision: https://reviews.llvm.org/D158743
2023-09-15 14:51:50 +02:00
Nikita Popov
0e67a68478 [SCEV] Add tests for PR66066 (NFC) 2023-09-15 13:53:11 +02:00
Alexey Bataev
b9ad72ba05 [SLP]Fix PR66176: SLP incorrectly reorders select operands.
On the very first iteration for the reductions, when trying to build
reduction for boolean logic operations, no need to compare LHS/RHS with
the Reduction(VectorizedTree), need to compare with actual parameters of
the reduction operations.
2023-09-15 03:57:36 -07:00
Nikita Popov
18e77760ce [GVN] Also remove phi nodes from VN table (PR65447)
Followup to D158849: We also need to remove the phi node from the
VN table, which is not handled by removeInstruction().

Fixes https://github.com/llvm/llvm-project/issues/65447.
2023-09-15 11:50:34 +02:00
Bevin Hansson
e412697451
[MemoryBuiltins] Cache the result of ObjectOffsetSizeVisitor::visit. #64796 (#65326)
visit will skip visiting instructions it already has visited
to avoid issues with cycles in the data graph. However,
the result of this skipping behavior is that if we
encounter the same instruction twice, and that instruction
has a well defined result and isn't part of a cycle, we
will introduce unknowns into the analysis even though we
knew the size and offset of the instruction's result.

Instead of skipping such instructions, keep a cache of
the result of visiting them. This result is initialized
to unknown() before visiting, so if we happen to visit
it again recursively (perhaps as the result of a cycle
or a phi), we will get unknown as the cached result and
exit out.
2023-09-15 10:30:45 +02:00
Nikita Popov
07460b6666 [MemCpyOpt] Avoid infinite loop in processMemSetMemCpyDependence (PR54983)
This adds an additional transform to drop zero-size memcpys, also in
the case where the size is only zero after instruction simplification.
The motivation is the case from PR54983 where the size is non-trivially
zero, and processMemSetMemCpyDependence() keeps trying to reduce the
memset size by zero bytes.

This fix it's not really principled. It only works on the premise that
if InstSimplify doesn't realize the size is zero, then AA also won't.

The principled approach would be to instead add a isKnownNonZero()
guard to the processMemSetMemCpyDependence() transform, but I
suspect that would render that optimization mostly useless (at least
it breaks all the existing test coverage -- worth noting that the
constant size case is also handled by DSE, so I think this transform
is primarily about the dynamic size case).

Fixes https://github.com/llvm/llvm-project/issues/54983.
Fixes https://github.com/llvm/llvm-project/issues/64886.

Differential Revision: https://reviews.llvm.org/D124078
2023-09-15 09:10:15 +02:00
Nikita Popov
7c229f6e85 [GVN] Invalidate MDA when deduplicating phi nodes
Duplicate phi nodes were being directly removed, without
invalidating MDA. This could result in a new phi node being
allocated at the same address, incorrectly reusing a cache entry.

Fix this by optionally allowing EliminateDuplicatePHINodes() to
collect phi nodes to remove into a vector, which allows GVN to
handle removal itself.

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

Differential Revision: https://reviews.llvm.org/D158849
2023-09-15 07:04:32 +02:00
Marc Auberer
1f313034cb
[InstCombine] Remove unnecessary one-use-check (#66419)
This removes a oneUse check, that is actually unnecessary.

Alive2: https://alive2.llvm.org/ce/z/qEkUEf
Original patch: https://reviews.llvm.org/D159380
2023-09-15 06:46:30 +02:00
Alexey Bataev
d2ab97b00c [SLP][NFC]Add a test with incorrect reduction of poisoned logical bool. 2023-09-14 17:11:44 -07:00
Alexey Bataev
c15c1e5dd5 [SLP]Do not account non-instructions for external use.
If the non-instruction gets vectorized, no need to account its extract
cost, it won't be removed and replaced by extractelement instruction.
2023-09-14 12:40:33 -07:00
Alexey Bataev
1034405486 [SLP][NFC]Add a test for non-instruction with external use. 2023-09-14 12:34:14 -07:00
Danila Malyutin
e80a8b4ab6 [NFC] Add test for #66382 2023-09-14 21:10:00 +03:00
Justin Bogner
71e3642619
[Transforms][DXIL] Wire up a basic DXILUpgrade pass (#66275)
This pass will upgrade DXIL-style llvm constructs (which are mostly
metadata) into the representations we use in LLVM for the same concepts.

For now we just strip the valver metadata, which we don't need. Later
changes will make this pass more useful, and then we should be able to
wire it into clang and possibly the DirectX backend's AsmParser.
2023-09-14 11:02:31 -07:00
Nuno Lopes
5eabb022d2 [test][NFC] fix call in test with mismatch in call/decl types 2023-09-14 13:59:02 +01:00
Paul Walker
c7d65e4466 [IR] Enable load/store/alloca for arrays of scalable vectors.
Differential Revision: https://reviews.llvm.org/D158517
2023-09-14 13:49:01 +00:00
Kohei Asano
fef8249220
[SimplifyCFG] handle monotonic wrapped case for D150943 (#65882) 2023-09-14 21:26:11 +09:00
khei4
7f3610ac69 Reapply "Revert "[MemCpyOpt] implement multi BB stack-move optimization"
This reverts commit efe8aa2e618122e8050af10cc5d6ad83f24ef557.

Differential Revision: https://reviews.llvm.org/D155406
2023-09-14 19:42:36 +09:00
Nikita Popov
1fc73cacb2 [InstCombine] Propagate nsw flag when negating
When pushing a sub nsw 0, %x negation into an expression, try to
preserve the nsw flag for the cases where this is possible. Do this
by passing the flag through recursive Negator::negate() calls.

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

Differential Revision: https://reviews.llvm.org/D158510
2023-09-14 09:09:45 +02:00
DianQK
19b664d352
[Coroutine][DebugInfo] Remove the memory attributes on coro-async-declaration.ll (NFC) (#66088)
According to @drodriguez's reminder in
https://github.com/apple/llvm-project/pull/7168#issuecomment-1710607896,
`memory` breaks the backport to the apple branch.

And this is irrelevant to that test. Delete to get better a test case.
2023-09-14 09:02:58 +08:00
Shilei Tian
22e1df7f5b
[LLVM][OpenMPOpt] Fix a crash when associated function is nullptr (#66274)
The associated function can be a nullptr if it is an indirect call.
This causes a crash in `CheckCallee` which always assumes the callee
is a valid pointer.

Fix #66904.
2023-09-13 20:22:59 -04:00
Noah Goldstein
119194ada6 [InstCombine] Transform (icmp ult/uge (and X, Y), X) -> (icmp ne/eq (and X, Y), X)
eq/ne are generally easier to reason about elsewhere.

ult -> ne: https://alive2.llvm.org/ce/z/5wxXGt
uge -> eq: https://alive2.llvm.org/ce/z/Dw6kqG

Reviewed By: nikic

Differential Revision: https://reviews.llvm.org/D145425
2023-09-13 15:50:17 -05:00
Noah Goldstein
67ba293808 [InstCombine] Add tests for transforming (icmp pred (and X, Y), X); NFC
Reviewed By: RKSimon

Differential Revision: https://reviews.llvm.org/D145424
2023-09-13 15:50:17 -05:00
Simon Pilgrim
e6b85c3027 [DAG] FoldSetCC - add missing icmp(X,undef) -> isTrueWhenEqual case (REAPPLIED)
Followup to D59363 which failed to handle the icmp(X,undef) -> isTrueWhenEqual case - similar to llvm::ConstantFoldCompareInstruction

As discussed on the review, this is affecting some previously reduced test cases, but will also prevent reductions from relying on this inconsistent behaviour in the future.

Reapplied after reversion at e1e3c75c7dad72 with a tweak to the pseudo-probe-peep.ll test

Differential Revision: https://reviews.llvm.org/D158068
2023-09-13 12:33:39 +01:00
Ben Shi
f3fbea2cac
[VectorCombine][test] Supplement tests of the load-extractelement sequence (#65442)
The newly added tests are all about scalable vector types.
2023-09-13 18:56:44 +08:00
Sergey Kachkov
4b14148d24
[GVN] Skip debug instructions in findDominatingValue function (#65977)
findDominatingValue has a search limit, and when it is reached, optimization is
not applied. This patch fixes the issue that this limit also takes into account
debug intrinsics, so the result of optimization can depend from the presence of
debug info.
2023-09-13 11:23:26 +03:00
Matt Arsenault
edecb60481 Reapply "AMDGPU: Drop and auto-upgrade llvm.amdgcn.ldexp to llvm.ldexp"
This reverts commit d9333e360a7c52587ab6e4328e7493b357fb2cf3.
2023-09-13 08:38:48 +03:00
Matt Arsenault
00061843bd InstSimplify: Simplifications for ldexp
Ported from old amdgcn intrinsic which will soon be deleted.

https://reviews.llvm.org/D149587
2023-09-13 08:38:48 +03:00
Matthias Braun
168c288af1
JumpThreading: Propagate branch weights in tryToUnfoldSelectInCurrBB (#66116)
Propagate "branch_weights" metadata whe turning a select into a
conditional branch in tryToUnfoldSelectInCurrBB
2023-09-12 13:36:49 -07:00
AdityaK
f061b13175 Statically analyze likely and unlikely blocks based on metadata
The builtin_expect(), and C++20's likely, unlikely attributes assign branch_weights to annotated branches.

This patch adds the the ability to query branch !prof metadata and improve static analysis based on that.

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

Reviewers: tejohnson, efriedma

Differential Revision: https://reviews.llvm.org/D159336
2023-09-12 11:28:15 -07:00
Aleksandr Popov
ec0f678744
[GuardWidening] Fix widening possibility check (#66064)
In the 0e0ff8573de69286536e4f49098226eda0c4c7f5 was introduced
inconsistency between condition widening and checking if it's possible
to widen. We check the possibility to hoist checks parsed from the
condition, but hoist entire condition.

This patch returns testing that a condition can be hoisted rather than
the checks parsed from that condition.

Co-authored-by: Aleksander Popov <apopov@azul.com>
2023-09-12 14:49:14 +02:00
Konstantina Mitropoulou
798f2465f3 [NewGVN] Decrement UseCount only if SSA copy has one use
Committing on behalf of @vladimirradosavljevic (Vladimir Radosavljevic)

Differential Revision : https: // reviews.llvm.org/D157267
2023-09-11 18:08:14 -07:00