aboutsummaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2004-02-25My faith in programmers has been found to be totally misplaced. One wouldChris Lattner
assume that if they don't intend to write to a global variable, that they would mark it as constant. However, there are people that don't understand that the compiler can do nice things for them if they give it the information it needs. This pass looks for blatently obvious globals that are only ever read from. Though it uses a trivially simple "alias analysis" of sorts, it is still able to do amazing things to important benchmarks. 253.perlbmk, for example, contains several ***GIANT*** function pointer tables that are not marked constant and should be. Marking them constant allows the optimizer to turn a whole bunch of indirect calls into direct calls. Note that only a link-time optimizer can do this transformation, but perlbmk does have several strings and other minor globals that can be marked constant by this pass when run from GCCAS. 176.gcc has a ton of strings and large tables that are marked constant, both at compile time (38 of them) and at link time (48 more). Other benchmarks give similar results, though it seems like big ones have disproportionally more than small ones. This pass is extremely quick and does good things. I'm going to enable it in gccas & gccld. Not bad for 50 SLOC. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11836 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25SparcV8 regs are really 32-bit, not 64! Thanks, Chris.Misha Brukman
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11835 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Clean up the tablegen descriptions for SparcV8.Misha Brukman
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11834 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Fix the SparcV8 register definitions that were imported from PPC template.Misha Brukman
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11833 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25SparcV8 has different types of instructions, but F1 is only used for CALL.Misha Brukman
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11832 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Note that this test is currently expected to fail.Brian Gaeke
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11831 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Add an assertionChris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11830 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Fix failures in 099.go due to the cfgsimplify pass creating switch instructionsChris Lattner
where there did not used to be any before git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11829 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25SparcV8 skeletonBrian Gaeke
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11828 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Great renaming part II: Sparc --> SparcV9 (also includes command-line ↵Brian Gaeke
options and Makefiles) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11827 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Great renaming: Sparc --> SparcV9Brian Gaeke
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11826 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Add a bunch more functions used by perlbmkChris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11824 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Updated to use llc to generate CBE code.John Criswell
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11823 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Substantial improvements and cleanups for the release notes. We were missingChris Lattner
a bunch of stuff! :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11822 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Fix incorrect debug codeChris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11821 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Teach the instruction selector how to transform 'array' GEP computations ↵Chris Lattner
into X86 scaled indexes. This allows us to compile GEP's like this: int* %test([10 x { int, { int } }]* %X, int %Idx) { %Idx = cast int %Idx to long %X = getelementptr [10 x { int, { int } }]* %X, long 0, long %Idx, ubyte 1, ubyte 0 ret int* %X } Into a single address computation: test: mov %EAX, DWORD PTR [%ESP + 4] mov %ECX, DWORD PTR [%ESP + 8] lea %EAX, DWORD PTR [%EAX + 8*%ECX + 4] ret Before it generated: test: mov %EAX, DWORD PTR [%ESP + 4] mov %ECX, DWORD PTR [%ESP + 8] shl %ECX, 3 add %EAX, %ECX lea %EAX, DWORD PTR [%EAX + 4] ret This is useful for things like int/float/double arrays, as the indexing can be folded into the loads&stores, reducing register pressure and decreasing the pressure on the decode unit. With these changes, I expect our performance on 256.bzip2 and gzip to improve a lot. On bzip2 for example, we go from this: 10665 asm-printer - Number of machine instrs printed 40 ra-local - Number of loads/stores folded into instructions 1708 ra-local - Number of loads added 1532 ra-local - Number of stores added 1354 twoaddressinstruction - Number of instructions added 1354 twoaddressinstruction - Number of two-address instructions 2794 x86-peephole - Number of peephole optimization performed to this: 9873 asm-printer - Number of machine instrs printed 41 ra-local - Number of loads/stores folded into instructions 1710 ra-local - Number of loads added 1521 ra-local - Number of stores added 789 twoaddressinstruction - Number of instructions added 789 twoaddressinstruction - Number of two-address instructions 2142 x86-peephole - Number of peephole optimization performed ... and these types of instructions are often in tight loops. Linear scan is also helped, but not as much. It goes from: 8787 asm-printer - Number of machine instrs printed 2389 liveintervals - Number of identity moves eliminated after coalescing 2288 liveintervals - Number of interval joins performed 3522 liveintervals - Number of intervals after coalescing 5810 liveintervals - Number of original intervals 700 spiller - Number of loads added 487 spiller - Number of stores added 303 spiller - Number of register spills 1354 twoaddressinstruction - Number of instructions added 1354 twoaddressinstruction - Number of two-address instructions 363 x86-peephole - Number of peephole optimization performed to: 7982 asm-printer - Number of machine instrs printed 1759 liveintervals - Number of identity moves eliminated after coalescing 1658 liveintervals - Number of interval joins performed 3282 liveintervals - Number of intervals after coalescing 4940 liveintervals - Number of original intervals 635 spiller - Number of loads added 452 spiller - Number of stores added 288 spiller - Number of register spills 789 twoaddressinstruction - Number of instructions added 789 twoaddressinstruction - Number of two-address instructions 258 x86-peephole - Number of peephole optimization performed Though I'm not complaining about the drop in the number of intervals. :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11820 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25* Make the previous patch more efficient by not allocating a temporary ↵Chris Lattner
MachineInstr to do analysis. *** FOLD getelementptr instructions into loads and stores when possible, making use of some of the crazy X86 addressing modes. For example, the following C++ program fragment: struct complex { double re, im; complex(double r, double i) : re(r), im(i) {} }; inline complex operator+(const complex& a, const complex& b) { return complex(a.re+b.re, a.im+b.im); } complex addone(const complex& arg) { return arg + complex(1,0); } Used to be compiled to: _Z6addoneRK7complex: mov %EAX, DWORD PTR [%ESP + 4] mov %ECX, DWORD PTR [%ESP + 8] *** mov %EDX, %ECX fld QWORD PTR [%EDX] fld1 faddp %ST(1) *** add %ECX, 8 fld QWORD PTR [%ECX] fldz faddp %ST(1) *** mov %ECX, %EAX fxch %ST(1) fstp QWORD PTR [%ECX] *** add %EAX, 8 fstp QWORD PTR [%EAX] ret Now it is compiled to: _Z6addoneRK7complex: mov %EAX, DWORD PTR [%ESP + 4] mov %ECX, DWORD PTR [%ESP + 8] fld QWORD PTR [%ECX] fld1 faddp %ST(1) fld QWORD PTR [%ECX + 8] fldz faddp %ST(1) fxch %ST(1) fstp QWORD PTR [%EAX] fstp QWORD PTR [%EAX + 8] ret Other programs should see similar improvements, across the board. Note that in addition to reducing instruction count, this also reduces register pressure a lot, always a good thing on X86. :) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11819 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Add a helper to create an addressing mode given all of the pieces.Chris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11818 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25add an inefficient way of folding structure and constant array indexes togetherChris Lattner
into a single LEA instruction. This should improve the code generated for things like X->A.B.C[12].D. The bigger benefit is still coming though. Note that this uses an LEA instruction instead of an add, giving the register allocator more freedom. We should probably never generate ADDri32's. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11817 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Implement special case for storing an immediate into memory so that we don't ↵Chris Lattner
need an intermediate register. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11816 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-25Cygwin defines log2 as a macro. Undef it here IFF it has already been defined,Brian Gaeke
so that we always get the inline function instead. Remember, kids, like it says in the GCC manual, "An Inline Function is As Fast As a Macro." git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11815 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24small portability fix.Brian Gaeke
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11814 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Add support for 'rename'Chris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11813 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Make the verifier a little more explicit about this problem.Chris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11811 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Add support for remove, fwrite, and freadChris Lattner
Also fix problem where we didn't check to see if a node pointer was null. Though fclose(null) doesn't make a lot of sense, 300.twolf does it. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11810 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Added the VTune tests.John Criswell
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11809 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24FunctionLiveVarInfo.h moved: include/llvm/CodeGen -> lib/Target/Sparc/LiveVarBrian Gaeke
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11804 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Fix some unexpected fallout from the config.h changes. Because the CBE noChris Lattner
longer was getting this #include, it always fell back on the less precise floating point initializer values, causing some testsuite failures. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11803 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Fix a faulty optimization on FP valuesChris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11801 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Fixed minor typos.John Criswell
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11800 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24If a block is made dead, make sure to promptly remove it.Chris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11799 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Move machine code rewriter and spiller outside the registerAlkis Evlogimenos
allocator. The implementation is completely rewritten and now employs several optimizations not exercised before. For example for 164.gzip we have 997 loads and 699 stores vs the 1221 loads and 880 stores we have before. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11798 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Implement SimplifyCFG/switch_switch_fold.llChris Lattner
This case occurs many times in various benchmarks, especially when combined with the previous patch. This allows it to get stuff like: if (X == 4 || X == 3) if (X == 5 || X == 8) and switch (X) { case 4: case 5: case 6: if (X == 4 || X == 5) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11797 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24New testcase. Switch instructions that go to switch instructions should beChris Lattner
merged. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11796 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Add predicates for checking if a virtual register has a physicalAlkis Evlogimenos
register mapping or a stack slot mapping. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11795 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Add some helpful methods for dealing with switch instructionsChris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11794 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Rearrange code a bitChris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11793 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Implement: test/Regression/Transforms/SimplifyCFG/switch_create.llChris Lattner
This turns code like this: if (X == 4 | X == 7) and if (X != 4 & X != 7) into switch instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11792 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24The simplifycfg pass should be able to turn stuff like:Chris Lattner
if (X == 4 || X == 7) and if (X != 4 && X != 7) into switch instructions. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11791 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Wow, the description of the 'switch' instruction was out of date.Chris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11790 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24we no longer include boostChris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11789 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Hrm, my find must have been faulty. It didn't remove these as well.Chris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11788 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Boost is now unneeded, thanks to the fix for PR253, contributed by Reid Spencer!Chris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11787 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Now that's a new feature!Chris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11786 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Use the new LLVM is_class template instead of the boost one, allowing us toChris Lattner
remove our dependency on boost! Thanks to Reid Spencer for making this possible! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11785 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Check in a new type_traits header which provides the mysterious is_classChris Lattner
template. Thanks go out to Reid Spencer for skillfully extracting this from boost! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11784 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-24Noone cares about similarity to boostChris Lattner
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11783 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-23Make enum private as it is an implementation detail.Alkis Evlogimenos
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11782 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-23Remove '4Virt' from member function names as it is obvious.Alkis Evlogimenos
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11781 91177308-0d34-0410-b5e6-96231b3b80d8
2004-02-23Refactor VirtRegMap out of RegAllocLinearScan as the first part of bugAlkis Evlogimenos
251 (providing a generic machine code rewriter/spiller). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11780 91177308-0d34-0410-b5e6-96231b3b80d8