summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
Commit message (Collapse)AuthorAgeFilesLines
...
* Dont' merge terminators that are needed to select PHI node values.Chris Lattner2004-05-021-1/+1
| | | | llvm-svn: 13312
* Implement SimplifyCFG/branch-cond-merge.llChris Lattner2004-05-011-10/+64
| | | | | | Turning "if (A < B && B < C)" into "if (A < B & B < C)" llvm-svn: 13311
* Make sure to reprocess instructions used by deleted instructions to avoidChris Lattner2004-05-011-5/+12
| | | | | | missing opportunities for combination. llvm-svn: 13309
* Make sure the instruction combiner doesn't lose track of instructionsChris Lattner2004-05-011-3/+6
| | | | | | when replacing them, missing the opportunity to do simplifications llvm-svn: 13308
* Fix my missing parensChris Lattner2004-05-011-1/+1
| | | | llvm-svn: 13307
* Implement SimplifyCFG/branch-cond-prop.llChris Lattner2004-05-011-2/+30
| | | | llvm-svn: 13306
* Fix a major pessimization in the instcombiner. If an allocation instructionChris Lattner2004-04-301-1/+1
| | | | | | | | | | | | | | | is only used by a cast, and the casted type is the same size as the original allocation, it would eliminate the cast by folding it into the allocation. Unfortunately, it was placing the new allocation instruction right before the cast, which could pull (for example) alloca instructions into the body of a function. This turns statically allocatable allocas into expensive dynamically allocated allocas, which is bad bad bad. This fixes the problem by placing the new allocation instruction at the same place the old one was, duh. :) llvm-svn: 13289
* Changes to fix up the inst_iterator to pass to boost iterator checks. ThisChris Lattner2004-04-273-3/+12
| | | | | | patch was graciously contributed by Vladimir Prus. llvm-svn: 13185
* Instcombine X/-1 --> 0-XChris Lattner2004-04-261-1/+5
| | | | llvm-svn: 13172
* * Allow aggregating extracted function arguments (controlled by flag)Misha Brukman2004-04-231-45/+197
| | | | | | * Commandline option (for now) controls that flag that is passed in llvm-svn: 13141
* Move the scev expansion code into this pass, where it belongs. There isChris Lattner2004-04-231-12/+252
| | | | | | | still room for cleanup, but at least the code modification is out of the analysis now. llvm-svn: 13135
* Clarify the logic: the flag is renamed to `deleteFn' to signify it will deleteMisha Brukman2004-04-221-11/+11
| | | | | | the function instead of isolating it. This also means the condition is reversed. llvm-svn: 13112
* Add a flag to choose between isolating a function or deleting the function fromMisha Brukman2004-04-221-6/+29
| | | | | | | the Module. The default behavior keeps functionality as before: the chosen function is the one that remains. llvm-svn: 13111
* Disable a previous patch that was causing indvars to loop infinitely :(Chris Lattner2004-04-221-0/+2
| | | | llvm-svn: 13108
* Fix an extremely serious thinko I made in revision 1.60 of this file.Chris Lattner2004-04-221-16/+25
| | | | llvm-svn: 13106
* Implement a todo, rewriting all possible scev expressions inside of theChris Lattner2004-04-211-8/+18
| | | | | | | | loop. This eliminates the extra add from the previous case, but it's not clear that this will be a performance win overall. Tommorows test results will tell. :) llvm-svn: 13103
* This code really wants to iterate over the OPERANDS of an instruction, notChris Lattner2004-04-211-3/+2
| | | | | | | | over its USES. If it's dead it doesn't have any uses! :) Thanks to the fabulous and mysterious Bill Wendling for pointing this out. :) llvm-svn: 13102
* Implement a fixme. The helps loops that have induction variables of differentChris Lattner2004-04-211-17/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | types in them. Instead of creating an induction variable for all types, it creates a single induction variable and casts to the other sizes. This generates this code: no_exit: ; preds = %entry, %no_exit %indvar = phi uint [ %indvar.next, %no_exit ], [ 0, %entry ] ; <uint> [#uses=4] *** %j.0.0 = cast uint %indvar to short ; <short> [#uses=1] %indvar = cast uint %indvar to int ; <int> [#uses=1] %tmp.7 = getelementptr short* %P, uint %indvar ; <short*> [#uses=1] store short %j.0.0, short* %tmp.7 %inc.0 = add int %indvar, 1 ; <int> [#uses=2] %tmp.2 = setlt int %inc.0, %N ; <bool> [#uses=1] %indvar.next = add uint %indvar, 1 ; <uint> [#uses=1] br bool %tmp.2, label %no_exit, label %loopexit instead of: no_exit: ; preds = %entry, %no_exit %indvar = phi ushort [ %indvar.next, %no_exit ], [ 0, %entry ] ; <ushort> [#uses=2] *** %indvar = phi uint [ %indvar.next, %no_exit ], [ 0, %entry ] ; <uint> [#uses=3] %indvar = cast uint %indvar to int ; <int> [#uses=1] %indvar = cast ushort %indvar to short ; <short> [#uses=1] %tmp.7 = getelementptr short* %P, uint %indvar ; <short*> [#uses=1] store short %indvar, short* %tmp.7 %inc.0 = add int %indvar, 1 ; <int> [#uses=2] %tmp.2 = setlt int %inc.0, %N ; <bool> [#uses=1] %indvar.next = add uint %indvar, 1 *** %indvar.next = add ushort %indvar, 1 br bool %tmp.2, label %no_exit, label %loopexit This is an improvement in register pressure, but probably doesn't happen that often. The more important fix will be to get rid of the redundant add. llvm-svn: 13101
* Fix an incredibly nasty iterator invalidation problem. I am too spoiled by ↵Chris Lattner2004-04-211-18/+38
| | | | | | | | | ilists :) Eventually it would be nice if CallGraph maintained an ilist of CallGraphNode's instead of a vector of pointers to them, but today is not that day. llvm-svn: 13100
* Include cerrno (gcc-3.4 fix)Alkis Evlogimenos2004-04-211-0/+1
| | | | llvm-svn: 13091
* Fix typeoChris Lattner2004-04-211-1/+1
| | | | llvm-svn: 13089
* REALLY fix PR324: don't delete linkonce functions until after the SCC traversalChris Lattner2004-04-202-7/+33
| | | | | | is done, which avoids invalidating iterators in the SCC traversal routines llvm-svn: 13088
* Fix PR325Chris Lattner2004-04-201-1/+1
| | | | llvm-svn: 13081
* Fix PR324 and testcase: Inline/2004-04-20-InlineLinkOnce.llxChris Lattner2004-04-201-3/+7
| | | | llvm-svn: 13080
* Initial checkin of a simple loop unswitching pass. It still needs work,Chris Lattner2004-04-191-0/+357
| | | | | | but it's a start, and seems to do it's basic job. llvm-svn: 13068
* Add #includeChris Lattner2004-04-191-0/+1
| | | | llvm-svn: 13057
* Move isLoopInvariant to the Loop classChris Lattner2004-04-181-10/+2
| | | | llvm-svn: 13051
* Correct rewriting of exit blocks after my last patchChris Lattner2004-04-181-3/+8
| | | | llvm-svn: 13048
* Loop exit sets are no longer explicitly held, they are dynamically computed ↵Chris Lattner2004-04-181-3/+6
| | | | | | on demand. llvm-svn: 13046
* Change the ExitBlocks list from being explicitly contained in the LoopChris Lattner2004-04-184-107/+17
| | | | | | | structure to being dynamically computed on demand. This makes updating loop information MUCH easier. llvm-svn: 13045
* Reduce the unrolling limitChris Lattner2004-04-181-1/+1
| | | | llvm-svn: 13040
* If the preheader of the loop was the entry block of the function, make sureChris Lattner2004-04-181-2/+7
| | | | | | | | that the exit block of the loop becomes the new entry block of the function. This was causing a verifier assertion on 252.eon. llvm-svn: 13039
* Be much more careful about how we update instructions outside of the loopChris Lattner2004-04-181-9/+15
| | | | | | | using instructions inside of the loop. This should fix the MishaTest failure from last night. llvm-svn: 13038
* After unrolling our single basic block loop, fold it into the preheader and exitChris Lattner2004-04-181-2/+43
| | | | | | | | | | | | | block. The primary motivation for doing this is that we can now unroll nested loops. This makes a pretty big difference in some cases. For example, in 183.equake, we are now beating the native compiler with the CBE, and we are a lot closer with LLC. I'm now going to play around a bit with the unroll factor and see what effect it really has. llvm-svn: 13034
* Fix a bug: this does not preserve the CFG!Chris Lattner2004-04-181-4/+20
| | | | | | While we're at it, add support for updating loop information correctly. llvm-svn: 13033
* Initial checkin of a simple loop unroller. This pass is extremely basic andChris Lattner2004-04-181-0/+247
| | | | | | | | limited. Even in it's extremely simple state (it can only *fully* unroll single basic block loops that execute a constant number of times), it already helps improve performance a LOT on some benchmarks, particularly with the native code generators. llvm-svn: 13028
* Make the tail duplication threshold accessible from the command line instead ↵Chris Lattner2004-04-181-1/+5
| | | | | | of hardcoded llvm-svn: 13025
* If the loop executes a constant number of times, try a bit harder to replaceChris Lattner2004-04-171-2/+5
| | | | | | exit values. llvm-svn: 13018
* Fix a HUGE pessimization on X86. The indvars pass was taking thisChris Lattner2004-04-171-1/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (familiar) function: int _strlen(const char *str) { int len = 0; while (*str++) len++; return len; } And transforming it to use a ulong induction variable, because the type of the pointer index was left as a constant long. This is obviously very bad. The fix is to shrink long constants in getelementptr instructions to intptr_t, making the indvars pass insert a uint induction variable, which is much more efficient. Here's the before code for this function: int %_strlen(sbyte* %str) { entry: %tmp.13 = load sbyte* %str ; <sbyte> [#uses=1] %tmp.24 = seteq sbyte %tmp.13, 0 ; <bool> [#uses=1] br bool %tmp.24, label %loopexit, label %no_exit no_exit: ; preds = %entry, %no_exit *** %indvar = phi uint [ %indvar.next, %no_exit ], [ 0, %entry ] ; <uint> [#uses=2] *** %indvar = phi ulong [ %indvar.next, %no_exit ], [ 0, %entry ] ; <ulong> [#uses=2] %indvar1 = cast ulong %indvar to uint ; <uint> [#uses=1] %inc.02.sum = add uint %indvar1, 1 ; <uint> [#uses=1] %inc.0.0 = getelementptr sbyte* %str, uint %inc.02.sum ; <sbyte*> [#uses=1] %tmp.1 = load sbyte* %inc.0.0 ; <sbyte> [#uses=1] %tmp.2 = seteq sbyte %tmp.1, 0 ; <bool> [#uses=1] %indvar.next = add ulong %indvar, 1 ; <ulong> [#uses=1] %indvar.next = add uint %indvar, 1 ; <uint> [#uses=1] br bool %tmp.2, label %loopexit.loopexit, label %no_exit loopexit.loopexit: ; preds = %no_exit %indvar = cast uint %indvar to int ; <int> [#uses=1] %inc.1 = add int %indvar, 1 ; <int> [#uses=1] ret int %inc.1 loopexit: ; preds = %entry ret int 0 } Here's the after code: int %_strlen(sbyte* %str) { entry: %inc.02 = getelementptr sbyte* %str, uint 1 ; <sbyte*> [#uses=1] %tmp.13 = load sbyte* %str ; <sbyte> [#uses=1] %tmp.24 = seteq sbyte %tmp.13, 0 ; <bool> [#uses=1] br bool %tmp.24, label %loopexit, label %no_exit no_exit: ; preds = %entry, %no_exit *** %indvar = phi uint [ %indvar.next, %no_exit ], [ 0, %entry ] ; <uint> [#uses=3] %indvar = cast uint %indvar to int ; <int> [#uses=1] %inc.0.0 = getelementptr sbyte* %inc.02, uint %indvar ; <sbyte*> [#uses=1] %inc.1 = add int %indvar, 1 ; <int> [#uses=1] %tmp.1 = load sbyte* %inc.0.0 ; <sbyte> [#uses=1] %tmp.2 = seteq sbyte %tmp.1, 0 ; <bool> [#uses=1] %indvar.next = add uint %indvar, 1 ; <uint> [#uses=1] br bool %tmp.2, label %loopexit, label %no_exit loopexit: ; preds = %entry, %no_exit %len.0.1 = phi int [ 0, %entry ], [ %inc.1, %no_exit ] ; <int> [#uses=1] ret int %len.0.1 } llvm-svn: 13016
* Even if there are not any induction variables in the loop, if we can computeChris Lattner2004-04-171-1/+11
| | | | | | | the trip count for the loop, insert one so that we can canonicalize the exit condition. llvm-svn: 13015
* Add support for evaluation of exp/log/log10/powChris Lattner2004-04-161-1/+25
| | | | llvm-svn: 13011
* Fix some really nasty dominance bugs that were exposed by my patch toChris Lattner2004-04-161-29/+12
| | | | | | make the verifier more strict. This fixes building zlib llvm-svn: 13002
* Include <cmath> for compatibility with gcc 3.0.x (the system compiler onBrian Gaeke2004-04-161-0/+1
| | | | | | Debian.) llvm-svn: 12986
* Fix some of the strange CBE-only failures that happened last night.Chris Lattner2004-04-161-0/+1
| | | | llvm-svn: 12980
* Fix Inline/2004-04-15-InlineDeletesCall.llChris Lattner2004-04-161-12/+20
| | | | | | | | Basically we were using SimplifyCFG as a huge sledgehammer for a simple optimization. Because simplifycfg does so many things, we can't use it for this purpose. llvm-svn: 12977
* Fix a bug in the previous checkin: if the exit block is not the same asChris Lattner2004-04-151-7/+23
| | | | | | the back-edge block, we must check the preincremented value. llvm-svn: 12968
* Change the canonical induction variable that we insert.Chris Lattner2004-04-151-10/+17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Instead of producing code like this: Loop: X = phi 0, X2 ... X2 = X + 1 if (X != N-1) goto Loop We now generate code that looks like this: Loop: X = phi 0, X2 ... X2 = X + 1 if (X2 != N) goto Loop This has two big advantages: 1. The trip count of the loop is now explicit in the code, allowing the direct implementation of Loop::getTripCount() 2. This reduces register pressure in the loop, and allows X and X2 to be put into the same register. As a consequence of the second point, the code we generate for loops went from: .LBB2: # no_exit.1 ... mov %EDI, %ESI inc %EDI cmp %ESI, 2 mov %ESI, %EDI jne .LBB2 # PC rel: no_exit.1 To: .LBB2: # no_exit.1 ... inc %ESI cmp %ESI, 3 jne .LBB2 # PC rel: no_exit.1 ... which has two fewer moves, and uses one less register. llvm-svn: 12961
* ADd a trivial instcombine: load null -> nullChris Lattner2004-04-141-2/+5
| | | | llvm-svn: 12940
* Add SCCP support for constant folding calls, implementing:Chris Lattner2004-04-131-1/+33
| | | | | | test/Regression/Transforms/SCCP/calltest.ll llvm-svn: 12921
* Add a simple call constant propagation interface.Chris Lattner2004-04-131-0/+51
| | | | llvm-svn: 12919
OpenPOWER on IntegriCloud