Chris Lattner 
							
						 
					 
					
						
						
							
						
						c3c8703c3b 
					 
					
						
						
							
							Move to the IPO library.  Utils shouldn't contain passes.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12372  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-14 02:32:27 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						a2dc727ac4 
					 
					
						
						
							
							DemoteRegToStack got moved from DemoteRegToStack.h to Local.h  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12368  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-14 02:13:38 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						0cea42a560 
					 
					
						
						
							
							Add some debugging output  
						
						... 
						
						
						
						Fix InstCombine/2004-03-13-InstCombineInfLoop.ll which caused an infinite
loop compiling (I think) povray.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12365  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-13 23:54:27 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						619d3544b1 
					 
					
						
						
							
							This change makes two big adjustments.  
						
						... 
						
						
						
						* Be a lot more accurate about what the effects will be when inlining a call
   to a function when an argument is an alloca.
 * Dramatically reduce the penalty for inlining a call in a large function.
   This heuristic made it almost impossible to inline a function into a large
   function, no matter how small the callee is.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12363  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-13 23:15:45 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						786c5646e9 
					 
					
						
						
							
							This little patch speeds up the loop used to update the dominator set analysis.  
						
						... 
						
						
						
						On the testcase from GCC PR12440, which has a LOT of loops (1392 of which require
preheaders to be inserted), this speeds up the loopsimplify pass from 1.931s to
0.1875s.  The loop in question goes from 1.65s -> 0.0097s, which isn't bad. All of
these times are a debug build.
This adds a dependency on DominatorTree analysis that was not there before, but
we always had dominatortree available anyway, because LICM requires both loop
simplify and DT, so this doesn't add any extra analysis in practice.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12362  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-13 22:01:26 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						bfe492b5c2 
					 
					
						
						
							
							Implement sub.ll:test14  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12355  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-13 00:11:49 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						9c2906744a 
					 
					
						
						
							
							Implement InstCombine/sub.ll:test12 & test13  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12353  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-12 23:53:13 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						17fd273512 
					 
					
						
						
							
							Add constant folding wrapper support for select instructions.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12319  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-12 05:53:03 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						6e32372fcd 
					 
					
						
						
							
							Add sccp support for select instructions  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12318  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-12 05:52:44 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						3d69f46d64 
					 
					
						
						
							
							Add trivial optimizations for select instructions  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12317  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-12 05:52:32 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						b2f12a2c38 
					 
					
						
						
							
							Initial support for edge profiling  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12225  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-08 17:54:34 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						467dd2ec61 
					 
					
						
						
							
							Split utility functions out of BlockProfiling.cpp  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12224  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-08 17:06:13 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						c51733c7b5 
					 
					
						
						
							
							finegrainify namespacification  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12221  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-08 16:45:53 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						9440db8866 
					 
					
						
						
							
							Implement ArgumentPromotion/aggregate-promote.ll  
						
						... 
						
						
						
						This allows pointers to aggregate objects, whose elements are only read, to
be promoted and passed in by element instead of by reference.  This can
enable a LOT of subsequent optimizations in the caller function.
It's worth pointing out that this stuff happens a LOT of C++ programs, because
objects in templates are generally passed around by reference.  When these
templates are instantiated on small aggregate or scalar types, however, it is
more efficient to pass them in by value than by reference.
This transformation triggers most on C++ codes (e.g. 334 times on eon), but
does happen on C codes as well.  For example, on mesa it triggers 72 times,
and on gcc it triggers 35 times.  this is amazingly good considering that
we are using 'basicaa' so far.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12202  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-08 01:04:36 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						86a734bd40 
					 
					
						
						
							
							Implement: ArgumentPromotion/chained.ll  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12200  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-07 22:52:53 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						7db5a6df78 
					 
					
						
						
							
							Fix another minor bug, exposed by perlbmk  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12198  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-07 22:43:27 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						c76d80342e 
					 
					
						
						
							
							Since 'load null' is undefined, we can make it do whatever we want.  Returning  
						
						... 
						
						
						
						a zero value is the most likely way to cause further simplification, so we do it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12197  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-07 22:16:24 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						7e6f5090af 
					 
					
						
						
							
							Fix a minor bug and turn debug output into, well, debug output.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12195  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-07 21:54:50 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						ed570a7dca 
					 
					
						
						
							
							New LLVM pass: argument promotion.  This version only handles simple scalar  
						
						... 
						
						
						
						variables.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12193  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-07 21:29:54 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						0a94348fb9 
					 
					
						
						
							
							Don't emit things like malloc(16*1).  Allocation instructions are fixed arity now.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12086  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-03 01:40:53 +00:00 
						 
				 
			
				
					
						
							
							
								Misha Brukman 
							
						 
					 
					
						
						
							
						
						0256e4bbf9 
					 
					
						
						
							
							Implement ExtractCodeRegion()  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12070  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-02 00:20:57 +00:00 
						 
				 
			
				
					
						
							
							
								Misha Brukman 
							
						 
					 
					
						
						
							
						
						38b8fd1078 
					 
					
						
						
							
							Make a note that this is usually used via bugpoint.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12068  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-02 00:19:09 +00:00 
						 
				 
			
				
					
						
							
							
								Misha Brukman 
							
						 
					 
					
						
						
							
						
						b97fce5252 
					 
					
						
						
							
							* Add implementation of ExtractBasicBlock()  
						
						... 
						
						
						
						* Add comments to ExtractLoop()
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12053  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-01 18:28:34 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						99cca7d3aa 
					 
					
						
						
							
							Disable tail duplication in a case that breaks on Olden/tsp  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12021  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-03-01 01:12:13 +00:00 
						 
				 
			
				
					
						
							
							
								Misha Brukman 
							
						 
					 
					
						
						
							
						
						99cc88bb64 
					 
					
						
						
							
							* Remove function to find "main" in a Module, there's a method for that  
						
						... 
						
						
						
						* Removing extraneous empty space and empty comment lines
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12014  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-29 23:09:10 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						06887c9a2a 
					 
					
						
						
							
							Fix bug: test/Regression/Transforms/LowerInvoke/2004-02-29-PHICrash.llx  
						
						... 
						
						
						
						... which tickled the lowerinvoke pass because it used the BCE routines.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@12012  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-29 22:24:41 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						4279f3c984 
					 
					
						
						
							
							Fix PR255: [tailduplication] Single basic block loops are very rare  
						
						... 
						
						
						
						Note that this is a band-aid put over a band-aid.  This just undisables
tail duplication in on very specific case that it seems to work in.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11989  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-29 06:41:20 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						542f149f00 
					 
					
						
						
							
							Implement switch->br and br->switch folding by ripping out the switch->switch  
						
						... 
						
						
						
						and br->br code and generalizing it.  This allows us to compile code like this:
int test(Instruction *I) {
  if (isa<CastInst>(I))
    return foo(7);
  else if (isa<BranchInst>(I))
    return foo(123);
  else if (isa<UnwindInst>(I))
    return foo(1241);
  else if (isa<SetCondInst>(I))
    return foo(1);
  else if (isa<VAArgInst>(I))
    return foo(42);
  return foo(-1);
}
into:
int %_Z4testPN4llvm11InstructionE("struct.llvm::Instruction"* %I) {
entry:
        %tmp.1.i.i.i.i.i.i.i = getelementptr "struct.llvm::Instruction"* %I, long 0, ubyte 4            ; <uint*> [#uses=1]
        %tmp.2.i.i.i.i.i.i.i = load uint* %tmp.1.i.i.i.i.i.i.i          ; <uint> [#uses=2]
        %tmp.2.i.i.i.i.i.i = seteq uint %tmp.2.i.i.i.i.i.i.i, 27                ; <bool> [#uses=0]
        switch uint %tmp.2.i.i.i.i.i.i.i, label %endif.0 [
                 uint 27, label %then.0
                 uint 2, label %then.1
                 uint 5, label %then.2
                 uint 14, label %then.3
                 uint 15, label %then.3
                 uint 16, label %then.3
                 uint 17, label %then.3
                 uint 18, label %then.3
                 uint 19, label %then.3
                 uint 32, label %then.4
        ]
...
As well as handling the cases in 176.gcc and many other programs more effectively.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11964  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-28 21:28:10 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						b99df4f8c2 
					 
					
						
						
							
							if there is already a prototype for malloc/free, use it, even if it's incorrect.  
						
						... 
						
						
						
						Do not just inject a new prototype.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11951  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-28 18:51:45 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						7bcc0e7fff 
					 
					
						
						
							
							Rename AddUsesToWorkList -> AddUsersToWorkList, as that is what it does.  
						
						... 
						
						
						
						Create a new AddUsesToWorkList method
optimize memmove/set/cpy of zero bytes to a noop.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11941  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-28 05:22:00 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						6160e85201 
					 
					
						
						
							
							Turn 'free null' into nothing  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11940  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-28 04:57:37 +00:00 
						 
				 
			
				
					
						
							
							
								Misha Brukman 
							
						 
					 
					
						
						
							
						
						9e4a642c03 
					 
					
						
						
							
							Right, it's really Extractor, not Extraction.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11939  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-28 03:37:58 +00:00 
						 
				 
			
				
					
						
							
							
								Misha Brukman 
							
						 
					 
					
						
						
							
						
						9401deb320 
					 
					
						
						
							
							A pass that uses the generic CodeExtractor to rip out *every* loop in every  
						
						... 
						
						
						
						function, as long as the loop isn't the only one in that function. This should
help debugging passes easier with BugPoint.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11936  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-28 03:33:01 +00:00 
						 
				 
			
				
					
						
							
							
								Misha Brukman 
							
						 
					 
					
						
						
							
						
						e6336031b8 
					 
					
						
						
							
							A generic code extractor: given a list of BasicBlocks, it will rip them out into  
						
						... 
						
						
						
						a new function, taking care of inputs and outputs.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11935  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-28 03:26:20 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						7d90a2738e 
					 
					
						
						
							
							setcond instructions don't have aliasing implications.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11919  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-27 18:09:25 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						a0ebcebc06 
					 
					
						
						
							
							Implement test/Regression/Transforms/InstCombine/canonicalize_branch.ll  
						
						... 
						
						
						
						This is a really minor thing, but might help out the 'switch statement induction'
code in simplifycfg.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11900  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-27 06:27:46 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						4f77caaa3d 
					 
					
						
						
							
							Since LLVM uses structure type equivalence, it isn't useful to keep around  
						
						... 
						
						
						
						multiple type names for the same structural type.  Make DTE eliminate all
but one of the type names
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11879  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-26 20:02:23 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						f2dbf50efa 
					 
					
						
						
							
							turn things like:  
						
						... 
						
						
						
						if (X == 0 || X == 2)
...where the comparisons and branches are in different blocks... into a switch
instruction.  This comes up a lot in various programs, and works well with
the switch/switch merging code I checked earlier.  For example, this testcase:
int switchtest(int C) {
  return C == 0 ? f(123) :
         C == 1 ? f(3123) :
         C == 4 ? f(312) :
         C == 5 ? f(1234): f(444);
}
is converted into this:
        switch int %C, label %cond_false.3 [
                 int 0, label %cond_true.0
                 int 1, label %cond_true.1
                 int 4, label %cond_true.2
                 int 5, label %cond_true.3
        ]
instead of a whole bunch of conditional branches.
Admittedly the code is ugly, and incomplete.  To be complete, we need to add
br -> switch merging and switch -> br merging.  For example, this testcase:
struct foo { int Q, R, Z; };
#define A (X->Q+X->R * 123)
int test(struct foo *X) {
  return A  == 123 ? X1() :
        A == 12321 ? X2():
        (A == 111 || A == 222) ? X3() :
        A == 875 ? X4() : X5();
}
Gets compiled to this:
        switch int %tmp.7, label %cond_false.2 [
                 int 123, label %cond_true.0
                 int 12321, label %cond_true.1
                 int 111, label %cond_true.2
                 int 222, label %cond_true.2
        ]
...
cond_false.2:           ; preds = %entry
        %tmp.52 = seteq int %tmp.7, 875         ; <bool> [#uses=1]
        br bool %tmp.52, label %cond_true.3, label %cond_false.3
where the branch could be folded into the switch.
This kind of thing occurs *ALL OF THE TIME*, especially in programs like
176.gcc, which is a horrible mess of code.  It contains stuff like *shudder*:
#define SWITCH_TAKES_ARG(CHAR) \
  (   (CHAR) == 'D' \
   || (CHAR) == 'U' \
   || (CHAR) == 'o' \
   || (CHAR) == 'e' \
   || (CHAR) == 'u' \
   || (CHAR) == 'I' \
   || (CHAR) == 'm' \
   || (CHAR) == 'L' \
   || (CHAR) == 'A' \
   || (CHAR) == 'h' \
   || (CHAR) == 'z')
and
#define CONST_OK_FOR_LETTER_P(VALUE, C)                 \
  ((C) == 'I' ? SMALL_INTVAL (VALUE)                    \
   : (C) == 'J' ? SMALL_INTVAL (-(VALUE))               \
   : (C) == 'K' ? (unsigned)(VALUE) < 32                \
   : (C) == 'L' ? ((VALUE) & 0xffff) == 0               \
   : (C) == 'M' ? integer_ok_for_set (VALUE)            \
   : (C) == 'N' ? (VALUE) < 0                           \
   : (C) == 'O' ? (VALUE) == 0                          \
   : (C) == 'P' ? (VALUE) >= 0                          \
   : 0)
and
#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN)                     \
{                                                               \
  if (GET_CODE (X) == PLUS && CONSTANT_ADDRESS_P (XEXP (X, 1))) \
    (X) = gen_rtx (PLUS, SImode, XEXP (X, 0),                   \
                   copy_to_mode_reg (SImode, XEXP (X, 1)));     \
  if (GET_CODE (X) == PLUS && CONSTANT_ADDRESS_P (XEXP (X, 0))) \
    (X) = gen_rtx (PLUS, SImode, XEXP (X, 1),                   \
                   copy_to_mode_reg (SImode, XEXP (X, 0)));     \
  if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 0)) == MULT)   \
    (X) = gen_rtx (PLUS, SImode, XEXP (X, 1),                   \
                   force_operand (XEXP (X, 0), 0));             \
  if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == MULT)   \
    (X) = gen_rtx (PLUS, SImode, XEXP (X, 0),                   \
                   force_operand (XEXP (X, 1), 0));             \
  if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 0)) == PLUS)   \
    (X) = gen_rtx (PLUS, Pmode, force_operand (XEXP (X, 0), NULL_RTX),\
                   XEXP (X, 1));                                \
  if (GET_CODE (X) == PLUS && GET_CODE (XEXP (X, 1)) == PLUS)   \
    (X) = gen_rtx (PLUS, Pmode, XEXP (X, 0),                    \
                   force_operand (XEXP (X, 1), NULL_RTX));      \
  if (GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == CONST       \
           || GET_CODE (X) == LABEL_REF)                        \
    (X) = legitimize_address (flag_pic, X, 0, 0);               \
  if (memory_address_p (MODE, X))                               \
    goto WIN; }
and others.  These macros get used multiple times of course.  These are such
lovely candidates for macros, aren't they?  :)
This code also nicely handles LLVM constructs that look like this:
  if (isa<CastInst>(I))
   ...
  else if (isa<BranchInst>(I))
   ...
  else if (isa<SetCondInst>(I))
   ...
  else if (isa<UnwindInst>(I))
   ...
  else if (isa<VAArgInst>(I))
   ...
where the isa can obviously be a dyn_cast as well.  Switch instructions are a
good thing.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11870  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-26 07:13:46 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						079236d1c9 
					 
					
						
						
							
							My faith in programmers has been found to be totally misplaced.  One would  
						
						... 
						
						
						
						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-25 21:34:36 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						940ff563f7 
					 
					
						
						
							
							Fix incorrect debug code  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11821  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-25 15:15:04 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						d38f208cd9 
					 
					
						
						
							
							Fix a faulty optimization on FP values  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11801  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-24 18:10:14 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						8e509dd5e8 
					 
					
						
						
							
							If a block is made dead, make sure to promptly remove it.  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11799  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-24 16:09:21 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						d52c261cf8 
					 
					
						
						
							
							Implement SimplifyCFG/switch_switch_fold.ll  
						
						... 
						
						
						
						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-24 07:23:58 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						e14ea0804a 
					 
					
						
						
							
							Rearrange code a bit  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11793  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-24 05:54:22 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						0d56008f53 
					 
					
						
						
							
							Implement: test/Regression/Transforms/SimplifyCFG/switch_create.ll  
						
						... 
						
						
						
						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-24 05:38:11 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						d8864ce766 
					 
					
						
						
							
							Generate much more efficient code in programs like pifft  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11775  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-23 21:46:58 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						077a373791 
					 
					
						
						
							
							Fix a small typeo in my checkin last night that broke vortex and other programs :(  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11774  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-23 21:46:42 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						8adac75298 
					 
					
						
						
							
							Fix InstCombine/2004-02-23-ShiftShiftOverflow.ll  
						
						... 
						
						
						
						Also, turn 'shr int %X, 1234' into 'shr int %X, 31'
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11768  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-23 20:30:06 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						c5943fb186 
					 
					
						
						
							
							Implement cast.ll::test14/15  
						
						... 
						
						
						
						git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11742  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-23 07:16:20 +00:00 
						 
				 
			
				
					
						
							
							
								Chris Lattner 
							
						 
					 
					
						
						
							
						
						4cb170cc6e 
					 
					
						
						
							
							Refactor some code.  In the mul - setcc folding case, we really care about  
						
						... 
						
						
						
						whether this is the sign bit or not, so check unsigned comparisons as well.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@11740  91177308-0d34-0410-b5e6-96231b3b80d8 
						
						
					 
					
						2004-02-23 06:38:22 +00:00