aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/CodeGen/InterferenceCache.cpp
AgeCommit message (Collapse)AuthorFilesLines
2015-10-09CodeGen: Remove more ilist iterator implicit conversions, NFCDuncan P. N. Exon Smith1-1/+2
llvm-svn: 249879
2015-03-08Make static variables const if possible. Makes them go into a read-only section.Benjamin Kramer1-1/+2
Or fold them into a initializer list which has the same effect. NFC. llvm-svn: 231598
2014-04-22[Modules] Remove potential ODR violations by sinking the DEBUG_TYPEChandler Carruth1-1/+2
define below all header includes in the lib/CodeGen/... tree. While the current modules implementation doesn't check for this kind of ODR violation yet, it is likely to grow support for it in the future. It also removes one layer of macro pollution across all the included headers. Other sub-trees will follow. llvm-svn: 206837
2014-03-02[C++11] Replace llvm::tie with std::tie.Benjamin Kramer1-2/+2
The old implementation is no longer needed in C++11. llvm-svn: 202644
2014-02-06The following patch' purpose is to reduce compile time for compilation of smallPuyan Lotfi1-1/+17
programs on targets with large register files. The root of the compile time overhead was in the use of llvm::SmallVector to hold PhysRegEntries, which resulted in slow-down from calling llvm::SmallVector::assign(N, 0). In contrast std::vector uses the faster __platform_bzero to zero out primitive buffers when assign is called, while SmallVector uses an iterator. The fix for this was simply to replace the SmallVector with a dynamically allocated buffer and to initialize or reinitialize the buffer based on the total registers that the target architecture requires. The changes support cases where a pass manager may be reused for different targets, and note that the PhysRegEntries is allocated using calloc mainly for good for, and also to quite tools like Valgrind (see comments for more info on this). There is an rdar to track the fact that SmallVector doesn't have platform specific speedup optimizations inside of it for things like this, and I'll create a bugzilla entry at some point soon as well. TL;DR: This fix replaces the expensive llvm::SmallVector<unsigned char>::assign(N, 0) with a call to calloc for N bytes which is much faster because SmallVector's assign uses iterators. llvm-svn: 200917
2013-10-10Represent RegUnit liveness with LiveRange instanceMatthias Braun1-4/+4
Previously LiveInterval has been used, but having a spill weight and register number is unnecessary for a register unit. llvm-svn: 192397
2012-12-03Use the new script to sort the includes of every file under lib.Chandler Carruth1-2/+2
Sooooo many of these had incorrect or strange main module includes. I have manually inspected all of these, and fixed the main module include to be the nearest plausible thing I could find. If you own or care about any of these source files, I encourage you to take some time and check that these edits were sensible. I can't have broken anything (I strictly added headers, and reordered them, never removed), but they may not be the headers you'd really like to identify as containing the API being implemented. Many forward declarations and missing includes were added to a header files to allow them to parse cleanly when included first. The main module rule does in fact have its merits. =] llvm-svn: 169131
2012-06-20Convert RAGreedy to LiveRegMatrix interference checking.Jakob Stoklund Olesen1-29/+64
Stop depending on the LiveIntervalUnions in RegAllocBase, they are about to be removed. The changes are mostly replacing register alias iterators with regunit iterators, and querying LiveRegMatrix instrad of RegAllocBase. InterferenceCache is converted to work with per-regunit LiveIntervalUnions, and it checks fixed regunit interference separately, using the fixed live intervals provided by LiveIntervalAnalysis. The local splitting helper calcGapWeights() is also considering fixed regunit interference which is kept on the side now. llvm-svn: 158867
2012-06-01Switch all register list clients to the new MC*Iterator interface.Jakob Stoklund Olesen1-4/+4
No functional change intended. Sorry for the churn. The iterator classes are supposed to help avoid giant commits like this one in the future. The TableGen-produced register lists are getting quite large, and it may be necessary to change the table representation. This makes it possible to do so without changing all clients (again). llvm-svn: 157854
2012-03-04Use uint16_t to store register overlaps to reduce static data.Craig Topper1-2/+2
llvm-svn: 152001
2012-02-14Fix global live range splitting regmask accuracy.Jakob Stoklund Olesen1-1/+2
Pretend that regmask interference ends at the 'dead' slot, even when there is other interference ending at the 'reg' slot of the same instruction. llvm-svn: 150531
2012-02-10Add a static MachineOperand::clobbersPhysReg().Jakob Stoklund Olesen1-7/+2
It can be necessary to detach a register mask pointer from its MachineOperand. This method is convenient for checking clobbered physregs on a detached bitmask pointer. llvm-svn: 150261
2012-02-10Add register mask support to InterferenceCache.Jakob Stoklund Olesen1-1/+32
This makes global live range splitting behave identically with and without register mask operands. This is not necessarily the best way of using register masks for live range splitting. It would be more efficient to first split global live ranges around calls (i.e., register masks), and reserve the fine grained per-physreg interference guidance for global live ranges that do not cross calls. For now the goal is to produce identical assembly when enabling register masks. llvm-svn: 150259
2012-01-13Remove pointless mode line in .cpp file.Andrew Trick1-1/+1
llvm-svn: 148143
2012-01-13wrong filenameAndrew Trick1-1/+1
llvm-svn: 148103
2011-07-23Allow null interference cursors to be queried.Jakob Stoklund Olesen1-1/+4
They always report 'no interference'. llvm-svn: 135843
2011-07-14Reapply r135121 with a fixed copy constructor.Jakob Stoklund Olesen1-3/+14
Original commit message: Count references to interference cache entries. Each InterferenceCache::Cursor instance references a cache entry. A non-zero reference count guarantees that the entry won't be reused for a new register. This makes it possible to have multiple live cursors examining interference for different physregs. The total number of live cursors into a cache must be kept below InterferenceCache::getMaxCursors(). Code generation should be unaffected by this change, and it doesn't seem to affect the cache replacement strategy either. llvm-svn: 135130
2011-07-14Revert r135121 which broke a gcc-4.2 builder.Jakob Stoklund Olesen1-14/+3
llvm-svn: 135122
2011-07-14Count references to interference cache entries.Jakob Stoklund Olesen1-3/+14
Each InterferenceCache::Cursor instance references a cache entry. A non-zero reference count guarantees that the entry won't be reused for a new register. This makes it possible to have multiple live cursors examining interference for different physregs. The total number of live cursors into a cache must be kept below InterferenceCache::getMaxCursors(). Code generation should be unaffected by this change, and it doesn't seem to affect the cache replacement strategy either. llvm-svn: 135121
2011-04-09Precompute interference for neighbor blocks as long as there is no interference.Jakob Stoklund Olesen1-21/+32
This doesn't require seeking in the live interval union, so it is very cheap. llvm-svn: 129187
2011-04-07Avoid moving iterators when the previous block was just visited.Jakob Stoklund Olesen1-8/+13
llvm-svn: 129081
2011-04-02Add an InterferenceCache class for caching per-block interference ranges.Jakob Stoklund Olesen1-0/+139
When the greedy register allocator is splitting multiple global live ranges, it tends to look at the same interference data many times. The InterferenceCache class caches queries for unaltered LiveIntervalUnions. llvm-svn: 128764