summaryrefslogtreecommitdiffstats
path: root/llvm/lib
Commit message (Collapse)AuthorAgeFilesLines
...
* Remove linux/solaris specific stuff.Chris Lattner2004-07-251-1/+3
| | | | llvm-svn: 15195
* This patch makes use of the infrastructure implemented before to safely andChris Lattner2004-07-251-1/+43
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | aggressively coallesce live ranges even if they overlap. Consider this LLVM code for example: int %test(int %X) { %Y = mul int %X, 1 ;; Codegens to Y = X %Z = add int %X, %Y ret int %Z } The mul is just there to get a copy into the code stream. This produces this machine code: (0x869e5a8, LLVM BB @0x869b9a0): %reg1024 = mov <fi#-2>, 1, %NOREG, 0 ;; "X" %reg1025 = mov %reg1024 ;; "Y" (subsumed by X) %reg1026 = add %reg1024, %reg1025 %EAX = mov %reg1026 ret Note that the life times of reg1024 and reg1025 overlap, even though they contain the same value. This results in this machine code: test: mov %EAX, DWORD PTR [%ESP + 4] mov %ECX, %EAX add %EAX, %ECX ret Another, worse case involves loops and PHI nodes. Consider this trivial loop: testcase: int %test2(int %X) { entry: br label %Loop Loop: %Y = phi int [%X, %entry], [%Z, %Loop] %Z = add int %Y, 1 %cond = seteq int %Z, 100 br bool %cond, label %Out, label %Loop Out: ret int %Z } Because of interactions between the PHI elimination pass and the register allocator, this got compiled to this code: test2: mov %ECX, DWORD PTR [%ESP + 4] .LBBtest2_1: *** mov %EAX, %ECX inc %EAX cmp %EAX, 100 *** mov %ECX, %EAX jne .LBBtest2_1 ret Or on powerpc, this code: _test2: mflr r0 stw r0, 8(r1) stwu r1, -60(r1) .LBB_test2_1: addi r2, r3, 1 cmpwi cr0, r2, 100 *** or r3, r2, r2 bne cr0, .LBB_test2_1 *** or r3, r2, r2 lwz r0, 68(r1) mtlr r0 addi r1, r1, 60 blr 0 With this improvement in place, we now generate this code for these two testcases, which is what we want: test: mov %EAX, DWORD PTR [%ESP + 4] add %EAX, %EAX ret test2: mov %EAX, DWORD PTR [%ESP + 4] .LBBtest2_1: inc %EAX cmp %EAX, 100 jne .LBBtest2_1 # Loop ret Or on PPC: _test2: mflr r0 stw r0, 8(r1) stwu r1, -60(r1) .LBB_test2_1: addi r3, r3, 1 cmpwi cr0, r3, 100 bne cr0, .LBB_test2_1 lwz r0, 68(r1) mtlr r0 addi r1, r1, 60 blr 0 Static numbers for spill code loads/stores/reg-reg copies (smaller is better): em3d: before: 47/25/26 after: 44/22/24 164.gzip: before: 433/245/310 after: 403/231/278 175.vpr: before: 3721/2189/1581 after: 4144/2081/1423 176.gcc: before: 26195/8866/9235 after: 25942/8082/8275 186.crafty: before: 4295/2587/3079 after: 4119/2519/2916 252.eon: before: 12754/7585/5803 after: 12508/7425/5643 256.bzip2: before: 463/226/315 after: 482:241/309 Runtime perf number samples on X86: gzip: before: 41.09 after: 39.86 bzip2: runtime: before: 56.71s after: 57.07s gcc: before: 6.16 after: 6.12 eon: before: 2.03s after: 2.00s llvm-svn: 15194
* Make a method const, no functionality changesChris Lattner2004-07-252-6/+6
| | | | llvm-svn: 15193
* I think that V8 should coallesce registers, don't you?Chris Lattner2004-07-252-0/+25
| | | | llvm-svn: 15192
* Use name.empty() instead of testing against equality with the emptyAlkis Evlogimenos2004-07-251-1/+1
| | | | | | string. llvm-svn: 15191
* Disallow creation of named values of type void.Alkis Evlogimenos2004-07-251-0/+2
| | | | llvm-svn: 15190
* Fix a bug where we incorrectly value numbered the first PHI definition theChris Lattner2004-07-251-3/+26
| | | | | | | | same as the PHI use. This is not correct as the PHI use value is different depending on which branch is taken. This fixes espresso with aggressive coallescing, and perhaps others. llvm-svn: 15189
* Fix a bug in the range removerChris Lattner2004-07-251-1/+1
| | | | llvm-svn: 15188
* Add debugging output for joining assignmentsChris Lattner2004-07-251-0/+5
| | | | llvm-svn: 15187
* Remove implementation of operator= and make it private so that it isAlkis Evlogimenos2004-07-241-8/+1
| | | | | | not used accidentally. llvm-svn: 15172
* Change std::map<unsigned, LiveInterval*> into a std::map<unsigned,Alkis Evlogimenos2004-07-246-35/+49
| | | | | | | LiveInterval>. This saves some space and removes the pointer indirection caused by following the pointer. llvm-svn: 15167
* obvious fixChris Lattner2004-07-241-0/+1
| | | | llvm-svn: 15162
* Get rid of the printout from the low-level system interfaceChris Lattner2004-07-241-24/+13
| | | | llvm-svn: 15161
* Pass timeouts into the low level "execute program with timeout" functionChris Lattner2004-07-241-12/+18
| | | | llvm-svn: 15160
* Add support for killing the program if it executes for too long.Chris Lattner2004-07-241-12/+42
| | | | llvm-svn: 15158
* whoops, didn't mean to remove thisChris Lattner2004-07-241-1/+3
| | | | llvm-svn: 15157
* In the joiner, merge the small interval into the large interval. This restoresChris Lattner2004-07-241-0/+9
| | | | | | | | us back to taking about 10.5s on gcc, instead of taking 15.6s! The net result is that my big patches have hand no significant effect on compile time or code quality. heh. llvm-svn: 15156
* Completely eliminate the intervals_ list. instead, the r2iMap_ maintainsChris Lattner2004-07-244-78/+70
| | | | | | ownership of the intervals. llvm-svn: 15155
* Big change to compute logical value numbers for each LiveRange added to anChris Lattner2004-07-241-125/+151
| | | | | | | | | | | | | | | | | | | | | | | | | Interval. This generalizes the isDefinedOnce mechanism that we used before to help us coallesce ranges that overlap. As part of this, every logical range with a different value is assigned a different number in the interval. For example, for code that looks like this: 0 X = ... 4 X += ... ... N = X We now generate a live interval that contains two ranges: [2,6:0),[6,?:1) reflecting the fact that there are two different values in the range at different positions in the code. Currently we are not using this information at all, so this just slows down liveintervals. In the future, this will change. Note that this change also substantially refactors the joinIntervalsInMachineBB method to merge the cases for virt-virt and phys-virt joining into a single case, adds comments, and makes the code a bit easier to follow. llvm-svn: 15154
* Add a new differingRegisterClasses methodChris Lattner2004-07-241-4/+8
| | | | | | | make overlapsAliases take pointers instead of references fix indentation llvm-svn: 15153
* Little stuff:Chris Lattner2004-07-242-27/+167
| | | | | | | | | | | | | | | | | | | * Fix comment typeo * add dump() methods * add a few new methods like getLiveRangeContaining, removeRange & joinable (which is currently the same as overlaps) * Remove the unused operator== Bigger change: * In LiveInterval, instead of using a boolean isDefinedOnce to keep track of if there are > 1 definitions in a particular interval, keep a counter, NumValues to keep track of exactly how many there are. * In LiveRange, add a new ValId element to indicate which of the numbered values each LiveRange belongs to. We now no longer merge LiveRanges if they are of differing value ID's even if they are neighbors. llvm-svn: 15152
* Running list of bugs, unimplemented features, currently broken tests, until weMisha Brukman2004-07-231-0/+41
| | | | | | have a nightly tester set up for PowerPC. llvm-svn: 15147
* Eliminate spurious empty space; make code easier to page through.Misha Brukman2004-07-232-42/+24
| | | | llvm-svn: 15146
* Simplify boolean test.Misha Brukman2004-07-232-2/+2
| | | | llvm-svn: 15145
* More minor changes:Chris Lattner2004-07-232-44/+31
| | | | | | | | | * Inline some functions * Eliminate some comparisons from the release build This is good for another .3 on gcc. llvm-svn: 15144
* Implement casting a floating point to 32-bit unsigned valueMisha Brukman2004-07-232-4/+122
| | | | llvm-svn: 15143
* Change addRange and join to be a little bit smarter. In particular, we don'tChris Lattner2004-07-232-36/+85
| | | | | | | | | | | | | | want to insert a new range into the middle of the vector, then delete ranges one at a time next to the inserted one as they are merged. Instead, if the inserted interval overlaps, just start merging. The only time we insert into the middle of the vector is when we don't overlap at all. Also delete blocks of live ranges if we overlap with many of them. This patch speeds up joining by .7 seconds on a large testcase, but more importantly gets all of the range adding code into addRangeFrom. llvm-svn: 15141
* Fix problem with inserting FunctionPasses that depend on ImmutablePassesBrian Gaeke2004-07-231-4/+12
| | | | | | | | | | (e.g., LICM) into FunctionPassManagers. The problem is that we were using a C-style cast to cast required analysis passes to PassClass*, but if it's a FunctionPassManager, and the required analysis pass is an ImmutablePass, the types aren't really compatible, so the C-style cast causes a crash. llvm-svn: 15140
* Search by the start point, not by the whole interval. This saves someChris Lattner2004-07-231-11/+12
| | | | | | comparisons, reducing linscan by another .1 seconds :) llvm-svn: 15139
* New helper methodChris Lattner2004-07-231-1/+7
| | | | llvm-svn: 15138
* Speedup debug builds a bitChris Lattner2004-07-231-2/+3
| | | | llvm-svn: 15137
* Instead of searching for a live interval pair, search for a location. This ↵Chris Lattner2004-07-232-6/+9
| | | | | | | | gives a very modest speedup of .3 seconds compiling 176.gcc (out of 20s). llvm-svn: 15136
* Rename LiveIntervals.(cpp|h) -> LiveIntervalAnalysis.(cpp|h)Chris Lattner2004-07-234-7/+7
| | | | llvm-svn: 15135
* Pull the LiveRange and LiveInterval classes out of LiveIntervals.h (whichChris Lattner2004-07-234-239/+286
| | | | | | | | | | | | will soon be renamed) into their own file. The new file should not emit DEBUG output or have other side effects. The LiveInterval class also now doesn't know whether its working on registers or some other thing. In the future we will want to use the LiveInterval class and friends to do stack packing. In addition to a code simplification, this will allow us to do it more easily. llvm-svn: 15134
* * Codegen of GEPs dramatically improved by folding multiplies and addsMisha Brukman2004-07-235-152/+338
| | | | | | | | * Function pointers implemented correctly using appropriate stubs Contributed by Nate Begeman. llvm-svn: 15133
* Improve comments a bitChris Lattner2004-07-232-55/+73
| | | | | | | | | | | | | | | | | | | | | | | | | Use an explicit LiveRange class to represent ranges instead of an std::pair. This is a minor cleanup, but is really intended to make a future patch simpler and less invasive. Alkis, could you please take a look at LiveInterval::liveAt? I suspect that you can add an operator<(unsigned) to LiveRange, allowing us to speed up the upper_bound call by quite a bit (this would also apply to other callers of upper/lower_bound). I would do it myself, but I still don't understand that crazy liveAt function, despite the comment. :) Basically I would like to see this: LiveRange dummy(index, index+1); Ranges::const_iterator r = std::upper_bound(ranges.begin(), ranges.end(), dummy); Turn into: Ranges::const_iterator r = std::upper_bound(ranges.begin(), ranges.end(), index); llvm-svn: 15130
* Update live intervals more accurately for PHI elim. This slightly reducesChris Lattner2004-07-231-10/+6
| | | | | | the live intervals for some registers. llvm-svn: 15125
* Force coallescing of live ranges that have a single definition, even if theyChris Lattner2004-07-232-9/+30
| | | | | | | | | | | | | | | | | | | | | | | | interfere. Because these intervals have a single definition, and one of them is a copy instruction, they are always safe to merge even if their lifetimes interfere. This slightly reduces the amount of spill code, for example on 252.eon, from: 12837 spiller - Number of loads added 7604 spiller - Number of stores added 5842 spiller - Number of register spills 18155 liveintervals - Number of identity moves eliminated after coalescing to: 12754 spiller - Number of loads added 7585 spiller - Number of stores added 5803 spiller - Number of register spills 18262 liveintervals - Number of identity moves eliminated after coalescing The much much bigger win would be to merge intervals with multiple definitions (aka phi nodes) but this is not that day. llvm-svn: 15124
* Bool alignment on MacOSX/PowerPC is 4 bytes.Misha Brukman2004-07-231-1/+1
| | | | llvm-svn: 15122
* * Change class of BoolTy back to cIntMisha Brukman2004-07-232-38/+38
| | | | | | * Fix indentation back to 2 spaces llvm-svn: 15121
* * Add BoolAlignment to TargetData, default is 1 byte, size 1 byteMisha Brukman2004-07-232-8/+11
| | | | | | * Convert tabs to spaces llvm-svn: 15120
* costmetic changesChris Lattner2004-07-221-14/+14
| | | | llvm-svn: 15118
* Fix broken -debug printingChris Lattner2004-07-221-0/+1
| | | | llvm-svn: 15115
* The default has not been 'simple' for AGES!Chris Lattner2004-07-221-1/+1
| | | | llvm-svn: 15114
* Remove some (LARGE) abandoned code for the release. If this is ever neededChris Lattner2004-07-224-2843/+2
| | | | | | again in the future, it can be resurrected out of CVS llvm-svn: 15112
* Make linear scan the defaultChris Lattner2004-07-221-1/+1
| | | | llvm-svn: 15111
* * Change bool from cInt to cByte (for now)Misha Brukman2004-07-222-134/+180
| | | | | | | | | | | | | * Don't allow negative immediates to users of unsigned immediates * Fix long compares * Support <const int>, op as a potential immediate candidate * Fix sign extension of short and byte loads * Fix and improve integer casts * Fix passing of doubles as vararg functions Patch contributed by Nate Begeman. llvm-svn: 15109
* Put variable name to a separate line.Alkis Evlogimenos2004-07-221-1/+2
| | | | llvm-svn: 15108
* Fix indentation and wrap code at 80 colsMisha Brukman2004-07-221-110/+100
| | | | llvm-svn: 15107
* Sorting is now handled by both linearscan and iterative scan so liveAlkis Evlogimenos2004-07-221-10/+0
| | | | | | | intervals need not be sorted anymore. Removing this redundant step improves LiveIntervals running time by 5% on 176.gcc. llvm-svn: 15106
OpenPOWER on IntegriCloud