Commit Graph

684 Commits

Author SHA1 Message Date
Vidhush Singhal
754b93e466 [Attributor] New attribute to identify what byte ranges are alive for an allocation (#66148)
Changes the size of allocations automatically.
For now, implements the case when a single range from start of the
allocation is alive and the allocation can be reduced.
2023-11-10 16:26:37 -08:00
Hans Wennborg
96a0d714d5 Revert "ValueTracking: Identify implied fp classes by general fcmp (#66505)"
This causes asserts to fire:

  llvm/lib/Analysis/ValueTracking.cpp:4262:
  std::tuple<Value *, FPClassTest, FPClassTest> llvm::fcmpImpliesClass(CmpInst::Predicate, const Function &, Value *, const APFloat *, bool):
  Assertion `(RHSClass == fcPosNormal || RHSClass == fcNegNormal || RHSClass == fcPosSubnormal || RHSClass == fcNegSubnormal) && "should have been recognized as an exact class test"' failed.

See comments on the PR.

> Previously we could recognize exact class tests performed by
> an fcmp with special values (0s, infs and smallest normal).
> Expand this to recognize the implied classes by a compare with a general
> constant. e.g. fcmp ogt x, 1 implies positive and non-0.
>
> The API should be better merged with fcmpToClassTest but that
> made the diff way bigger, will try to do that in a future
> patch.

This reverts commit dc3faf0ed0.
2023-11-10 14:45:52 +01:00
Matt Arsenault
dc3faf0ed0 ValueTracking: Identify implied fp classes by general fcmp (#66505)
Previously we could recognize exact class tests performed by
an fcmp with special values (0s, infs and smallest normal).
Expand this to recognize the implied classes by a compare with a general
constant. e.g. fcmp ogt x, 1 implies positive and non-0.
    
The API should be better merged with fcmpToClassTest but that
made the diff way bigger, will try to do that in a future
patch.
2023-11-10 11:39:19 +09:00
Johannes Doerfert
ba87fba806 [Attributor] Ignore different kernels for kernel lifetime objects
If a potential interfering access is in a different kernel and the
underlying object has kernel lifetime we can straight out ignore the
interfering access.
TODO: This should be made much stronger via "reaching kernels", which we
already track in AAKernelInfo.
2023-10-21 12:31:06 -07:00
Johannes Doerfert
bb96093ca6 [Attributor][NFC] Precommit test 2023-10-21 12:31:06 -07:00
Johannes Doerfert
499fb1b8d8 [Attributor][FIX] Interposable constants cannot be propagated 2023-10-20 19:28:09 -07:00
Nikita Popov
a3bbab1852 [IR] Don't mark experimental.guard as willreturn (#69433)
Control flow does not necessary continue past guard intrinsics, so don't
mark them as willreturn.

This fixes the miscompile in the sdiv-guard.ll test.
2023-10-19 09:01:48 +02:00
Matt Arsenault
bad5893c30 Attributor: Fix not propagating nofpclass arguments through transitive callers
Fixes #64867
2023-10-05 06:03:40 -07:00
Matt Arsenault
75a3cc9c92 Attributor: Add a few nofpclass tests 2023-10-05 06:03:39 -07:00
Matt Arsenault
1b235b087b ValueTracking: Add baseline tests for fcmp with non-0/inf constants
Currently assumes only do anything for fcmps that perform an exact
class test.
2023-09-11 20:03:03 +03:00
Shilei Tian
499f691be1 Revert "Reapply "[Attributor] Enable AAAddressSpace for OpenMPOpt (#65544)"""
This reverts commit c5525a6e8f.
AMD BB is not happy again.
2023-09-08 15:46:23 -04:00
Shilei Tian
c5525a6e8f Reapply "[Attributor] Enable AAAddressSpace for OpenMPOpt (#65544)""
This reverts commit e592c2dcf5 that
reverts e91e3cf.
2023-09-08 15:39:16 -04:00
Shilei Tian
a501d06fcb [Attributor] Only manifest pointer operand for StoreInst in AAAddressSpace (#65708)
`AAAddressSpace` currently only works for `LoadInst` and `StoreInst`
currently. For `StoreInst`, the corresponding use can be the pointer
operand, or value operand, or both. When it is used as value operand, it
can prevent `AMDGPUPromoteAlloca` from optimization in certain cases.
This patch changes the manifest method such that only pointer operand
will be rewritten.
2023-09-08 15:24:25 -04:00
Johannes Doerfert
73a836a464 [Attributor] Look through indirect calls (#65197)
Through the new `Attributor::checkForAllCallees` we can look through
indirect calls and visit all potential callees if they are known. Most
AAs will do that implicitly now via `AACalleeToCallSite`, thus, most AAs
are able to deal with missing callees for call site IR positions.

Differential Revision: https://reviews.llvm.org/D112290
2023-09-08 12:14:38 -07:00
Matt Arsenault
ae542d979d ValueTracking: Add baseline test for fcmp implying classes 2023-09-07 20:30:15 +03:00
Shilei Tian
e592c2dcf5 Revert "[Attributor] Enable AAAddressSpace for OpenMPOpt (#65544)"
This reverts commit e91e3cf074 because
AMD BB is not happy with it.
2023-09-07 12:31:11 -04:00
Shilei Tian
e91e3cf074 [Attributor] Enable AAAddressSpace for OpenMPOpt (#65544) 2023-09-07 12:23:52 -04:00
Johannes Doerfert
06e6ec0d09 [Attributor][NFC] Precommit test 2023-09-01 22:14:38 -07: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
Johannes Doerfert
37642714ed [Attributor][FIX] Support non-0 AS for function pointers 2023-09-01 17:17:51 -07:00
Johannes Doerfert
2544283597 [Core][FIX] Do not assume instruction users in DetermineUseCaptureKind 2023-09-01 17:17:51 -07:00
Matt Arsenault
af758d6531 ValueTracking: Add baseline test for exp10 computeKnownFPClass handling 2023-09-01 20:14:39 -04:00
Philip Reames
294ad08ecc Revert "Revert "InstSimplify: Use correct interested FP classes when simplifying fcmp""
This reverts commit 89f0314ee1.  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 0637b00041.
This reverts commit 239fb206de.
This reverts commit ddb3f12c42.

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
Johannes Doerfert
209496b766 [Core] Allow hasAddressTaken to ignore "casted direct calls"
A direct call to a function casted to a different type is still not
really an address taken event. We allow the user to opt out of these
now.

Reviewed By: arsenm

Differential Revision: https://reviews.llvm.org/D159149
2023-08-31 19:32:52 -07:00
Matt Arsenault
850ec7bbb1 Attributor: Try to propagate concrete denormal-fp-math{-f32}
Allow specialization of functions with "dynamic" denormal modes to a
known IEEE or DAZ mode based on callers. This should make it possible
to implement a is-denormal-flushing-enabled test using
llvm.canonicalize and have it be free after LTO.

https://reviews.llvm.org/D156129
2023-08-31 08:26:32 -04:00
Matt Arsenault
099410b736 Attributor: Add baseline test for inferring denormal-fp-math 2023-08-31 08:26:32 -04: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
6f0ca01c57 [Attributor] Introduce AAGlobalValueInfo to track global value uses
GlobalValues are often interesting, especially if they have local
linkage. We now track all uses of those and refine potential callees
with it. Effectively, if an internal function cannot reach an indirect
call site, it cannot be a potential callee, even if it has its address
taken.
2023-08-29 22:41:54 -07:00
Johannes Doerfert
498887ae8a [Attributor] Introduce the closed world flag
The Attributor user can now set the closed world flag
(`AttributorConfig.IsClosedWorldModule` or
`-attributor-assume-closed-world`) in order to specialize call edges
based only on available callees. That means, we assume all functions are
known and hence all potential callees must be declared/defined in the
module. We will use this for GPUs and LTO cases, but for now the user
has to set it via a flag.
2023-08-29 22:35:17 -07:00
Matt Arsenault
d2a06ef05a Attributor: Allow refining of callsite attributes that already have nofpclass
https://reviews.llvm.org/D158419
2023-08-28 13:54:49 -04:00
Matt Arsenault
46a4eae1fb Attributor: Add more tests for nofpclass 2023-08-28 13:54:49 -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
Johannes Doerfert
d0b5523632 [Attributor] Introduce limit for indirect call specialization
The user can now limit the number of indirect calls specialized for a
given call site with `-attributor-max-specializations-per-call-base=N`
or the AttributorConfig callback. We further attach the `!callee`
metadata if all remaining callees are known.
2023-08-25 14:36:42 -07:00
Johannes Doerfert
9a80ebe63c [Attributor] Simplify assumptions "stores"
When we add an assumption about memory to the AAPointerInfo bins, we
should simplify the assumed value, like we do for stores.
2023-08-23 15:14:14 -07:00
Johannes Doerfert
010e3b84f9 [Attributor][NFC] Precommit test 2023-08-23 15:14:14 -07:00
Johannes Doerfert
78b8f1f78f [Attributor][FIX] Remove the visited set from AAInterFnReachability
The visited set was used to not visit the same function twice, however,
the (new) algorithm requires we do since we start the queries at
different call sites.
2023-08-23 11:48:18 -07:00
Johannes Doerfert
81a02b0767 [Attributor][NFC] Precommit test 2023-08-23 11:48:18 -07:00
Johannes Doerfert
9c08e76f3e [Attributor] Introduce AAIndirectCallInfo
AAIndirectCallInfo will collect information and specialize indirect call
sites. It is similar to our IndirectCallPromotion but runs as part of
the Attributor (so with assumed callee information). It also expands
more calls and let's the rest of the pipeline figure out what is UB, for
now. We use existing call promotion logic to improve the result,
otherwise we rely on the (implicit) function pointer cast.

This effectively "fixes" #60327 as it will undo the type punning early
enough for the inliner to work with the (now specialized, thus direct)
call.

Fixes: https://github.com/llvm/llvm-project/issues/60327
2023-08-18 16:44:05 -07:00
Johannes Doerfert
5eb7a427b0 [Attributor][NFC] Precommit tests 2023-08-17 22:42:38 -07:00
Johannes Doerfert
361b536bbc [Attributor] Simplify switches with more than one potential condition
Before, we allowed the condition to be simplified to a simple constant
only, otherwise we assumed all successors are live. Now we allow
multiple constants, and mark the default successor as dead accordingly.
2023-08-17 22:42:38 -07:00
Matt Arsenault
a68b87df2b ValueTracking: Fix unintended nofpclass inference test
The name says it shouldn't be not inf, not eq inf.
2023-08-15 17:36:26 -04:00
Johannes Doerfert
5a406b63e9 [Attributor][FIX] Stores capture, even for readonly functions
If we end up visiting a store use, we couldn't follow to the "reloads".
The capture effect of a store is more than memory as the reloads are
unknown.

Fixes: https://github.com/llvm/llvm-project/issues/64613
2023-08-11 14:17:33 -07:00
Johannes Doerfert
3d53744b87 [Attributor][NFC] Precommit tests (#64613) 2023-08-11 14:17:33 -07:00
Matt Arsenault
25bc999d1f Intrinsics: Add type overload to stacksave and stackstore
This allows use with non-0 address space stacks. llvm_ptr_ty should
never be used. This could use some more percolation up through mlir,
but this is enough to fix existing tests.

https://reviews.llvm.org/D156666
2023-08-09 18:33:11 -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
Florian Hahn
400fde9296 [Attributor] Add lightweight version for attribute deduction only.
This patch adds a lightweight instance of Attributor that only deduces
attributes.

This is just an initial version with the goal to have a version that
only focuses on attributes to replace the function-attrs pass.

The initial version has a few open issues pending until default
enablement, the main one probably being compile time. The main
additional functionality this will provide in general is propagating
attributes to call sites.

Open issues:

* compile time
  The current version increase O3 +2.67% and ThinLTO +6.18% when replacing FunctionAttr
   https://llvm-compile-time-tracker.com/compare.php?from=c4bb3e073548cf436d5fa0406e3ae75e94684dec&to=d992630a69c79a2587d736e6a88f448850413bd1&stat=instructions%3Au
   Both are with an additional change to preserve more analysis, like FunctionAttrs CGSCC run.

* some missed attribute inference

Reviewed By: jdoerfert

Differential Revision: https://reviews.llvm.org/D152081
2023-08-05 11:47:28 +01:00
Johannes Doerfert
2a20c64a73 [Attributor][NFCI] Use DominatorTree to short circuit reachability queries
If we do not have exlusion blocks and the target is live, we only need
to reach a dominating block.
2023-08-03 00:12:46 -07:00
Johannes Doerfert
fa367d159a [IR] Mark llvm.assume as memory(inaccessiblemem: write)
It was `inaccessiblemem: readwrite` before, no need for the read.
No real benefit is expected but it can help debugging and other efforts.

Differential Revision: https://reviews.llvm.org/D156478
2023-07-31 13:44:52 -07:00
Johannes Doerfert
6fa8244eb6 [IR] Mark llvm.trap as memory(inaccessiblemem: write)
Traps will not read/write the program state but they need an effect for
preservation, similar to `llvm.assume`. We really want a new memory kind
for that (see TODO), but for now `inaccessiblemem: write` is better than
any possible effect.

Differential Revision: https://reviews.llvm.org/D156476
2023-07-31 13:44:52 -07:00