1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 03:23:01 +02:00
llvm-mirror/test/Transforms/RewriteStatepointsForGC
Philip Reames b755be339a [RewriteStatepointsForGC] Avoid using unrelocated pointers after safepoints
To be clear: this is an *optimization* not a correctness change.

CodeGenPrep likes to duplicate icmps feeding branch instructions to take advantage of x86's ability to fuze many comparison/branch patterns into a single micro-op and to reduce the need for materializing i1s into general registers. PlaceSafepoints likes to place safepoint polls right at the end of basic blocks (immediately before terminators) when inserting entry and backedge safepoints. These two heuristics interact in a somewhat unfortunate way where the branch terminating the original block will be controlled by a condition driven by unrelocated pointers. This forces the register allocator to keep both the relocated and unrelocated values of the pointers feeding the icmp alive over the safepoint poll.

One simple fix would have been to just adjust PlaceSafepoints to move one back in the basic block, but you can reach similar cases as a result of LICM or other hoisting passes. As a result, doing a post insertion fixup seems to be more robust.

I considered doing this in CodeGenPrep itself, but having to update the live sets of already rewritten safepoints gets complicated fast. In particular, you can't just use def/use information because by moving the icmp, we're extending the live range of it's inputs potentially.

Instead, this patch teaches RewriteStatepointsForGC to make the required adjustments before making the relocations explicit in the IR. This change really highlights the fact that RSForGC is a CodeGenPrep-like pass which is performing target specific lowering. In the long run, we may even want to combine the two though this would require a lot more smarts to be integrated into RSForGC first. We currently rely on being able to run a set of cleanup passes post rewriting because the IR RSForGC generates is pretty damn ugly.

Differential Revision: http://reviews.llvm.org/D11819

llvm-svn: 244821
2015-08-12 22:11:45 +00:00
..
base-pointers-1.ll [RewriteStatepointsForGC] Adjust naming scheme to be more stable 2015-07-24 19:01:39 +00:00
base-pointers-2.ll [Statepoints] Support for "patchable" statepoints. 2015-05-12 23:52:24 +00:00
base-pointers-3.ll [Statepoints] Support for "patchable" statepoints. 2015-05-12 23:52:24 +00:00
base-pointers-4.ll [RewriteStatepointsForGC] Adjust naming scheme to be more stable 2015-07-24 19:01:39 +00:00
base-pointers-5.ll [RewriteStatepointsForGC] Adjust naming scheme to be more stable 2015-07-24 19:01:39 +00:00
base-pointers-6.ll [RewriteStatepointsForGC] Adjust naming scheme to be more stable 2015-07-24 19:01:39 +00:00
base-pointers-7.ll [RewriteStatepointsForGC] Adjust naming scheme to be more stable 2015-07-24 19:01:39 +00:00
base-pointers-8.ll [Statepoints] Support for "patchable" statepoints. 2015-05-12 23:52:24 +00:00
base-pointers-9.ll [Statepoints] Support for "patchable" statepoints. 2015-05-12 23:52:24 +00:00
base-pointers-10.ll [RewriteStatepointsForGC] Adjust naming scheme to be more stable 2015-07-24 19:01:39 +00:00
base-pointers-11.ll [Statepoints] Support for "patchable" statepoints. 2015-05-12 23:52:24 +00:00
base-pointers.ll [RewriteStatepointsForGC] Adjust naming scheme to be more stable 2015-07-24 19:01:39 +00:00
base-vector.ll [RewriteStatepointsForGC] Handle extractelement fully in the base pointer algorithm 2015-08-12 21:00:20 +00:00
basics.ll [RewriteStatepointsForGC] For some values (like gep's and bitcasts) it's cheaper to clone them after statepoint than to emit proper relocates for them. This change implements this logic. There is alredy similar optimization in CodeGenPrepare, but doing so during RewriteStatepointsForGC allows to capture more opprtunities such as relocates in loops and longer instruction chains. 2015-05-19 15:59:05 +00:00
codegen-cond.ll [RewriteStatepointsForGC] Avoid using unrelocated pointers after safepoints 2015-08-12 22:11:45 +00:00
constants.ll [Statepoints] Support for "patchable" statepoints. 2015-05-12 23:52:24 +00:00
deref-pointers.ll [RewriteStatepointsForGC] Strip deref info after rewriting. 2015-06-02 22:33:37 +00:00
gc_relocate_creation.ll [Statepoints] Support for "patchable" statepoints. 2015-05-12 23:52:24 +00:00
live-vector.ll [RewriteStatepointsForGC] Generalized vector phi/select handling for base pointers 2015-06-26 22:47:37 +00:00
liveness-basics.ll [RewriteStatepointsForGC] For some values (like gep's and bitcasts) it's cheaper to clone them after statepoint than to emit proper relocates for them. This change implements this logic. There is alredy similar optimization in CodeGenPrepare, but doing so during RewriteStatepointsForGC allows to capture more opprtunities such as relocates in loops and longer instruction chains. 2015-05-19 15:59:05 +00:00
preprocess.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
relocate_invoke_result.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00
relocation.ll Fix a bunch of trivial cases of 'CHECK[^:]*$' in the tests. NFCI 2015-08-10 19:01:27 +00:00
rematerialize-derived-pointers.ll Move the personality function from LandingPadInst to Function 2015-06-17 20:52:32 +00:00