Go to file
Philip Reames 971dc3a82a [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
clang Revert "Implement poisoning of only class members in dtor, as opposed to also poisoning fields inherited from base classes." 2015-08-12 22:07:24 +00:00
clang-tools-extra [clang-tidy] Make FileOptionsProvider fields protected to make extending it easier 2015-08-12 19:29:57 +00:00
compiler-rt Removed xfail, since test is passing in line with expanded dtor sanitizing functionality 2015-08-12 21:31:27 +00:00
debuginfo-tests New round of fixes for "Always compile debuginfo-tests for the host triple" 2014-10-18 23:47:59 +00:00
libclc Require LLVM >=3.7 and bump version to 0.2.0 2015-08-07 08:31:37 +00:00
libcxx Fix CMake error whet llvm-config reports a non-existent source directory. 2015-08-12 06:36:19 +00:00
libcxxabi Update to new lists.llvm.org 2015-08-05 04:01:26 +00:00
libunwind Revert test commit. 2015-08-06 23:31:37 +00:00
lld [ELF] Remove TargetLayout::getCustomSegments methods 2015-08-12 13:27:27 +00:00
lldb Fix process_events.py to auto continue the process if we attached so the process doesn't just sit there suspended. 2015-08-12 20:04:01 +00:00
llgo Update to new lists.llvm.org 2015-08-05 04:03:05 +00:00
llvm [RewriteStatepointsForGC] Avoid using unrelocated pointers after safepoints 2015-08-12 22:11:45 +00:00
openmp Fix two typos in documentation 2015-08-12 21:05:22 +00:00
polly Make sure we increment the reference counter when passing out the isl_pw_aff 2015-08-12 15:45:41 +00:00