#
aea60846 |
| 31-Dec-2016 |
Sanjay Patel <spatel@rotateright.com> |
[Inliner] remove unnecessary null checks from AddAlignmentAssumptions(); NFCI
We bail out on the 1st line if the assumption cache is not set, so there's no need to check it after that.
llvm-svn: 29
[Inliner] remove unnecessary null checks from AddAlignmentAssumptions(); NFCI
We bail out on the 1st line if the assumption cache is not set, so there's no need to check it after that.
llvm-svn: 290787
show more ...
|
#
0ee8bb11 |
| 27-Dec-2016 |
Chandler Carruth <chandlerc@gmail.com> |
[PM] Move the collection of call sites to a more appropriate place inside of `InlineFunction`. Prior to this, call instructions are specifically being rewritten and replaced within the inlined region
[PM] Move the collection of call sites to a more appropriate place inside of `InlineFunction`. Prior to this, call instructions are specifically being rewritten and replaced within the inlined region, invalidating some of the call sites.
Several of these regions are using the same technique to walk the inlined region so this seems clearly safe up to this point.
I've also added a short circuit to the scan for call sites based on what other code is doing.
With this, the most common crash I've found in the new inliner code is fixed. I've turned it on for another test case that covers this scenario.
I'll make my way through most of the other inliner test cases just to get some easy coverage next.
llvm-svn: 290562
show more ...
|
#
1d963114 |
| 20-Dec-2016 |
Chandler Carruth <chandlerc@gmail.com> |
[PM] Provide an initial, minimal port of the inliner to the new pass manager.
This doesn't implement *every* feature of the existing inliner, but tries to implement the most important ones for build
[PM] Provide an initial, minimal port of the inliner to the new pass manager.
This doesn't implement *every* feature of the existing inliner, but tries to implement the most important ones for building a functional optimization pipeline and beginning to sort out bugs, regressions, and other problems.
Notable, but intentional omissions: - No alloca merging support. Why? Because it isn't clear we want to do this at all. Active discussion and investigation is going on to remove it, so for simplicity I omitted it. - No support for trying to iterate on "internally" devirtualized calls. Why? Because it adds what I suspect is inappropriate coupling for little or no benefit. We will have an outer iteration system that tracks devirtualization including that from function passes and iterates already. We should improve that rather than approximate it here. - Optimization remarks. Why? Purely to make the patch smaller, no other reason at all.
The last one I'll probably work on almost immediately. But I wanted to skip it in the initial patch to try to focus the change as much as possible as there is already a lot of code moving around and both of these *could* be skipped without really disrupting the core logic.
A summary of the different things happening here:
1) Adding the usual new PM class and rigging.
2) Fixing minor underlying assumptions in the inline cost analysis or inline logic that don't generally hold in the new PM world.
3) Adding the core pass logic which is in essence a loop over the calls in the nodes in the call graph. This is a bit duplicated from the old inliner, but only a handful of lines could realistically be shared. (I tried at first, and it really didn't help anything.) All told, this is only about 100 lines of code, and most of that is the mechanics of wiring up analyses from the new PM world.
4) Updating the LazyCallGraph (in the new PM) based on the *newly inlined* calls and references. This is very minimal because we cannot form cycles.
5) When inlining removes the last use of a function, eagerly nuking the body of the function so that any "one use remaining" inline cost heuristics are immediately refined, and queuing these functions to be completely deleted once inlining is complete and the call graph updated to reflect that they have become dead.
6) After all the inlining for a particular function, updating the LazyCallGraph and the CGSCC pass manager to reflect the function-local simplifications that are done immediately and internally by the inline utilties. These are the exact same fundamental set of CG updates done by arbitrary function passes.
7) Adding a bunch of test cases to specifically target CGSCC and other subtle aspects in the new PM world.
Many thanks to the careful review from Easwaran and Sanjoy and others!
Differential Revision: https://reviews.llvm.org/D24226
llvm-svn: 290161
show more ...
|
#
aec2fa35 |
| 19-Dec-2016 |
Daniel Jasper <djasper@google.com> |
Revert @llvm.assume with operator bundles (r289755-r289757)
This creates non-linear behavior in the inliner (see more details in r289755's commit thread).
llvm-svn: 290086
|
#
3ca4a6bc |
| 15-Dec-2016 |
Hal Finkel <hfinkel@anl.gov> |
Remove the AssumptionCache
After r289755, the AssumptionCache is no longer needed. Variables affected by assumptions are now found by using the new operand-bundle-based scheme. This new scheme is mo
Remove the AssumptionCache
After r289755, the AssumptionCache is no longer needed. Variables affected by assumptions are now found by using the new operand-bundle-based scheme. This new scheme is more computationally efficient, and also we need much less code...
llvm-svn: 289756
show more ...
|
#
eff22832 |
| 07-Dec-2016 |
Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> |
[InlineFunction] Refactor code in function `fixupLineNumbers' as suggested by David in D27462. NFC
llvm-svn: 288901
|
#
32d5aedd |
| 07-Dec-2016 |
Andrea Di Biagio <Andrea_DiBiagio@sn.scee.net> |
[InlineFunction] Do not propagate the callsite debug location to instructions inlined from functions with debug info.
When a function F is inlined, InlineFunction extends the debug location of every
[InlineFunction] Do not propagate the callsite debug location to instructions inlined from functions with debug info.
When a function F is inlined, InlineFunction extends the debug location of every instruction inlined from F by adding an InlinedAt.
However, if an instruction has a 'null' debug location, InlineFunction would propagate the callsite debug location to it. This behavior existed since revision 210459.
Revision 210459 was originally committed specifically to workaround the lack of debug information for instructions inlined from intrinsic functions (which are usually declared with attributes `__always_inline__, __nodebug__`).
The problem with revision 210459 is that it doesn't make any sort of distinction between instructions inlined from a 'nodebug' function and instructions which are inlined from a function built with debug info. This issue may lead to incorrect stepping in the debugger.
This patch works under the assumption that a nodebug function does not have a DISubprogram. When a function F is inlined into another function G, InlineFunction checks if F has debug info associated with it.
For nodebug functions, the InlineFunction logic is unchanged (i.e. it would still propagate the callsite debugloc to the inlined instructions). Otherwise, InlineFunction no longer propagates the callsite debug location.
Differential Revision: https://reviews.llvm.org/D27462
llvm-svn: 288895
show more ...
|
Revision tags: llvmorg-3.9.1, llvmorg-3.9.1-rc3, llvmorg-3.9.1-rc2, llvmorg-3.9.1-rc1 |
|
#
ddfdba3b |
| 14-Nov-2016 |
Kuba Brecka <kuba.brecka@gmail.com> |
[tsan] Add support for C++ exceptions into TSan (call __tsan_func_exit during unwinding), LLVM part
This adds support for TSan C++ exception handling, where we need to add extra calls to __tsan_func
[tsan] Add support for C++ exceptions into TSan (call __tsan_func_exit during unwinding), LLVM part
This adds support for TSan C++ exception handling, where we need to add extra calls to __tsan_func_exit when a function is exitted via exception mechanisms. Otherwise the shadow stack gets corrupted (leaked). This patch moves and enhances the existing implementation of EscapeEnumerator that finds all possible function exit points, and adds extra EH cleanup blocks where needed.
Differential Revision: https://reviews.llvm.org/D26177
llvm-svn: 286893
show more ...
|
#
c9277f40 |
| 09-Sep-2016 |
Arnold Schwaighofer <aschwaighofer@apple.com> |
Inliner: Don't mark swifterror allocas with lifetime markers
This would create a bitcast use which fails the verifier: swifterror values may only be used by loads, stores, and as function arguments.
Inliner: Don't mark swifterror allocas with lifetime markers
This would create a bitcast use which fails the verifier: swifterror values may only be used by loads, stores, and as function arguments.
rdar://28233244
llvm-svn: 281114
show more ...
|
#
e92e0a90 |
| 04-Sep-2016 |
Joseph Tremoulet <jotrem@microsoft.com> |
Fix inliner funclet unwind memoization
Summary: The inliner may need to determine where a given funclet unwinds to, and this determination may depend on other funclets throughout the funclet tree.
Fix inliner funclet unwind memoization
Summary: The inliner may need to determine where a given funclet unwinds to, and this determination may depend on other funclets throughout the funclet tree. The code that performs this walk in getUnwindDestToken memoizes results to avoid redundant computations. In the case that a funclet's unwind destination is derived from its ancestor, there's code to walk back down the tree from the ancestor updating the memo map of its descendants to record the unwind destination. This change fixes that code to account for the case that some descendant has a different unwind destination, which can happen if that unwind dest is a descendant of the EHPad being queried and thus didn't determine its unwind destination.
Also update test inline-funclets.ll, which is supposed to cover such scenarios, to include a case that fails an assertion without this fix but passes with it.
Fixes PR29151.
Reviewers: majnemer
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D24117
llvm-svn: 280610
show more ...
|
Revision tags: llvmorg-3.9.0, llvmorg-3.9.0-rc3, llvmorg-3.9.0-rc2 |
|
#
67fc52f0 |
| 17-Aug-2016 |
Chandler Carruth <chandlerc@gmail.com> |
[PM] Port the always inliner to the new pass manager in a much more minimal and boring form than the old pass manager's version.
This pass does the very minimal amount of work necessary to inline fu
[PM] Port the always inliner to the new pass manager in a much more minimal and boring form than the old pass manager's version.
This pass does the very minimal amount of work necessary to inline functions declared as always-inline. It doesn't support a wide array of things that the legacy pass manager did support, but is alse ... about 20 lines of code. So it has that going for it. Notably things this doesn't support:
- Array alloca merging - To support the above, bottom-up inlining with careful history tracking and call graph updates - DCE of the functions that become dead after this inlining. - Inlining through call instructions with the always_inline attribute. Instead, it focuses on inlining functions with that attribute.
The first I've omitted because I'm hoping to just turn it off for the primary pass manager. If that doesn't pan out, I can add it here but it will be reasonably expensive to do so.
The second should really be handled by running global-dce after the inliner. I don't want to re-implement the non-trivial logic necessary to do comdat-correct DCE of functions. This means the -O0 pipeline will have to be at least 'always-inline,global-dce', but that seems reasonable to me. If others are seriously worried about this I'd like to hear about it and understand why. Again, this is all solveable by factoring that logic into a utility and calling it here, but I'd like to wait to do that until there is a clear reason why the existing pass-based factoring won't work.
The final point is a serious one. I can fairly easily add support for this, but it seems both costly and a confusing construct for the use case of the always inliner running at -O0. This attribute can of course still impact the normal inliner easily (although I find that a questionable re-use of the same attribute). I've started a discussion to sort out what semantics we want here and based on that can figure out if it makes sense ta have this complexity at O0 or not.
One other advantage of this design is that it should be quite a bit faster due to checking for whether the function is a viable candidate for inlining exactly once per function instead of doing it for each call site.
Anyways, hopefully a reasonable starting point for this pass.
Differential Revision: https://reviews.llvm.org/D23299
llvm-svn: 278896
show more ...
|
#
744a8753 |
| 16-Aug-2016 |
David Majnemer <david.majnemer@gmail.com> |
Preserve the assumption cache more often
We were clearing it out in LoopUnswitch and InlineFunction instead of attempting to preserve it.
llvm-svn: 278860
|
#
6ee00a26 |
| 12-Aug-2016 |
Reid Kleckner <rnk@google.com> |
[Inliner] Don't treat inalloca allocas as static
They aren't static, and moving them to the entry block across something else will only result in tears.
Root cause of http://crbug.com/636558.
llvm
[Inliner] Don't treat inalloca allocas as static
They aren't static, and moving them to the entry block across something else will only result in tears.
Root cause of http://crbug.com/636558.
llvm-svn: 278571
show more ...
|
Revision tags: llvmorg-3.9.0-rc1 |
|
#
ab6a6837 |
| 23-Jul-2016 |
Sean Silva <chisophugis@gmail.com> |
Avoid using a raw AssumptionCacheTracker in various inliner functions.
This unblocks the new PM part of River's patch in https://reviews.llvm.org/D22706
Conveniently, this same change was needed fo
Avoid using a raw AssumptionCacheTracker in various inliner functions.
This unblocks the new PM part of River's patch in https://reviews.llvm.org/D22706
Conveniently, this same change was needed for D21921 and so these changes are just spun out from there.
llvm-svn: 276515
show more ...
|
#
135f735a |
| 26-Jun-2016 |
Benjamin Kramer <benny.kra@googlemail.com> |
Apply clang-tidy's modernize-loop-convert to most of lib/Transforms.
Only minor manual fixes. No functionality change intended.
llvm-svn: 273808
|
#
e14e7bc4 |
| 25-Jun-2016 |
David Majnemer <david.majnemer@gmail.com> |
Revert "[SimplifyCFG] Stop inserting calls to llvm.trap for UB"
This reverts commit r273778, it seems to break UBSan :/
llvm-svn: 273779
|
#
d346a377 |
| 25-Jun-2016 |
David Majnemer <david.majnemer@gmail.com> |
[SimplifyCFG] Stop inserting calls to llvm.trap for UB
SimplifyCFG had logic to insert calls to llvm.trap for two very particular IR patterns: stores and invokes of undef/null.
While InstCombine ca
[SimplifyCFG] Stop inserting calls to llvm.trap for UB
SimplifyCFG had logic to insert calls to llvm.trap for two very particular IR patterns: stores and invokes of undef/null.
While InstCombine canonicalizes certain undefined behavior IR patterns to stores of undef, phase ordering means that this cannot be relied upon in general.
There are much better tools than llvm.trap: UBSan and ASan.
N.B. I could be argued into reverting this change if a clear argument as to why it is important that we synthesize llvm.trap for stores, I'd be hard pressed to see why it'd be useful for invokes...
llvm-svn: 273778
show more ...
|
#
d7708773 |
| 24-Jun-2016 |
David Majnemer <david.majnemer@gmail.com> |
Switch more loops to be range-based
This makes the code a little more concise, no functional change is intended.
llvm-svn: 273644
|
#
4ca41fd0 |
| 12-Jun-2016 |
Benjamin Kramer <benny.kra@googlemail.com> |
Run clang-tidy's performance-unnecessary-copy-initialization over LLVM.
No functionality change intended.
llvm-svn: 272516
|
#
bdc4956b |
| 12-Jun-2016 |
Benjamin Kramer <benny.kra@googlemail.com> |
Pass DebugLoc and SDLoc by const ref.
This used to be free, copying and moving DebugLocs became expensive after the metadata rewrite. Passing by reference eliminates a ton of track/untrack operation
Pass DebugLoc and SDLoc by const ref.
This used to be free, copying and moving DebugLocs became expensive after the metadata rewrite. Passing by reference eliminates a ton of track/untrack operations. No functionality change intended.
llvm-svn: 272512
show more ...
|
Revision tags: llvmorg-3.8.1, llvmorg-3.8.1-rc1 |
|
#
e0aa414a |
| 12-May-2016 |
Sanjoy Das <sanjoy@playingwithpointers.com> |
All llvm.deoptimize declarations must use the same calling convention
This new verifier rule lets us unambigously pick a calling convention when creating a new declaration for `@llvm.experimental.de
All llvm.deoptimize declarations must use the same calling convention
This new verifier rule lets us unambigously pick a calling convention when creating a new declaration for `@llvm.experimental.deoptimize.<ty>`. It is also congruent with our lowering strategy -- since all calls to `@llvm.experimental.deoptimize` are lowered to calls to `__llvm_deoptimize`, it is reasonable to enforce a unique calling convention.
Some of the tests that were breaking this verifier rule have had to be split up into different .ll files.
The inliner was violating this rule as well, and has been fixed to avoid producing invalid IR.
llvm-svn: 269261
show more ...
|
#
50316d95 |
| 28-Apr-2016 |
Hal Finkel <hfinkel@anl.gov> |
[Inliner] Preserve llvm.mem.parallel_loop_access metadata
When inlining a call site with llvm.mem.parallel_loop_access metadata, this metadata needs to be propagated to all cloned memory-accessing i
[Inliner] Preserve llvm.mem.parallel_loop_access metadata
When inlining a call site with llvm.mem.parallel_loop_access metadata, this metadata needs to be propagated to all cloned memory-accessing instructions. Otherwise, inlining parts of the loop body will invalidate the annotation.
With this functionality, we now vectorize the following as expected:
void Body(int *res, int *c, int *d, int *p, int i) { res[i] = (p[i] == 0) ? res[i] : res[i] + d[i]; }
void Test(int *res, int *c, int *d, int *p, int n) { int i;
#pragma clang loop vectorize(assume_safety) for (i = 0; i < 1600; i++) { Body(res, c, d, p, i); } }
llvm-svn: 267949
show more ...
|
#
dd77e1e6 |
| 09-Apr-2016 |
Sanjoy Das <sanjoy@playingwithpointers.com> |
Maintain calling convention when inling calls to llvm.deoptimize
The behavior here was buggy -- we'd forget the calling convention after inlining a callsite calling llvm.deoptimize.
llvm-svn: 265867
|
#
f83ab6de |
| 01-Apr-2016 |
Sanjoy Das <sanjoy@playingwithpointers.com> |
Don't insert stackrestore on deoptimizing returns
They're not necessary (since the stack pointer is trivially restored on return), and the way LLVM inserts the stackrestore calls breaks the IR (we g
Don't insert stackrestore on deoptimizing returns
They're not necessary (since the stack pointer is trivially restored on return), and the way LLVM inserts the stackrestore calls breaks the IR (we get a stackrestore between the deoptimize call and the return).
llvm-svn: 265101
show more ...
|
#
18b92968 |
| 01-Apr-2016 |
Sanjoy Das <sanjoy@playingwithpointers.com> |
Don't insert lifetime end markers on deoptimizing returns
They're not necessary (since the lifetime of the alloca is trivially over due to the return), and the way LLVM inserts the lifetime.end mark
Don't insert lifetime end markers on deoptimizing returns
They're not necessary (since the lifetime of the alloca is trivially over due to the return), and the way LLVM inserts the lifetime.end markers breaks the IR (we get a lifetime end marker between the deoptimize call and the return).
llvm-svn: 265100
show more ...
|