a62b01dc37 
								
							 
						 
						
							
							
								
								restructure this a bit.  Initialize the WeakVH with "I", the  
							
							... 
							
							
							
							instruction *after* the store.  The store will always be deleted
if the transformation kicks in, so we'd do an N^2 scan of every
loop block.  Whoops.
llvm-svn: 122805 
							
						 
						
							2011-01-04 07:27:30 +00:00  
				
					
						
							
							
								 
						
							
								0ba473c218 
								
							 
						 
						
							
							
								
								use the very-handy getTruncateOrZeroExtend helper function, and  
							
							... 
							
							
							
							stop setting NSW: signed overflow is possible.  Thanks to Dan
for pointing these out.
llvm-svn: 122790 
							
						 
						
							2011-01-04 00:06:55 +00:00  
				
					
						
							
							
								 
						
							
								0839d3930a 
								
							 
						 
						
							
							
								
								Fix comment.  
							
							... 
							
							
							
							llvm-svn: 122788 
							
						 
						
							2011-01-03 23:51:56 +00:00  
				
					
						
							
							
								 
						
							
								02a9776b64 
								
							 
						 
						
							
							
								
								reduce redundancy in the hashing code and other misc cleanups.  
							
							... 
							
							
							
							llvm-svn: 122720 
							
						 
						
							2011-01-03 01:10:08 +00:00  
				
					
						
							
							
								 
						
							
								8fac5db251 
								
							 
						 
						
							
							
								
								add DEBUG and -stats output to earlycse.  
							
							... 
							
							
							
							Teach it to CSE the rest of the non-side-effecting instructions.
llvm-svn: 122716 
							
						 
						
							2011-01-02 23:19:45 +00:00  
				
					
						
							
							
								 
						
							
								9c69406f2b 
								
							 
						 
						
							
							
								
								fix a miscompilation of tramp3d-v4: when forming a memcpy, we have to make  
							
							... 
							
							
							
							sure that the loop we're promoting into a memcpy doesn't mutate the input
of the memcpy.  Before we were just checking that the dest of the memcpy
wasn't mod/ref'd by the loop.
llvm-svn: 122712 
							
						 
						
							2011-01-02 21:14:18 +00:00  
				
					
						
							
							
								 
						
							
								5702a43c09 
								
							 
						 
						
							
							
								
								If a loop iterates exactly once (has backedge count = 0) then don't  
							
							... 
							
							
							
							mess with it.  We'd rather peel/unroll it than convert all of its 
stores into memsets.
llvm-svn: 122711 
							
						 
						
							2011-01-02 20:24:21 +00:00  
				
					
						
							
							
								 
						
							
								8455b6e45e 
								
							 
						 
						
							
							
								
								enhance loop idiom recognition to scan *all* unconditionally executed  
							
							... 
							
							
							
							blocks in a loop, instead of just the header block.  This makes it more
aggressive, able to handle Duncan's Ada examples.
llvm-svn: 122704 
							
						 
						
							2011-01-02 19:01:03 +00:00  
				
					
						
							
							
								 
						
							
								0469e01c02 
								
							 
						 
						
							
							
								
								add a list of opportunities for future improvement.  
							
							... 
							
							
							
							llvm-svn: 122701 
							
						 
						
							2011-01-02 18:32:09 +00:00  
				
					
						
							
							
								 
						
							
								ddf58010bd 
								
							 
						 
						
							
							
								
								Allow loop-idiom to run on multiple BB loops, but still only scan the loop  
							
							... 
							
							
							
							header for now for memset/memcpy opportunities.  It turns out that loop-rotate
is successfully rotating loops, but *DOESN'T MERGE THE BLOCKS*, turning "for 
loops" into 2 basic block loops that loop-idiom was ignoring.
With this fix, we form many *many* more memcpy and memsets than before, including
on the "history" loops in the viterbi benchmark, which look like this:
        for (j=0; j<MAX_history; ++j) {
          history_new[i][j+1] = history[2*i][j];
        }
Transforming these loops into memcpy's speeds up the viterbi benchmark from
11.98s to 3.55s on my machine.  Woo.
llvm-svn: 122685 
							
						 
						
							2011-01-02 07:58:36 +00:00  
				
					
						
							
							
								 
						
							
								5b5a043d82 
								
							 
						 
						
							
							
								
								remove debugging code.  
							
							... 
							
							
							
							llvm-svn: 122683 
							
						 
						
							2011-01-02 07:37:13 +00:00  
				
					
						
							
							
								 
						
							
								12f91befce 
								
							 
						 
						
							
							
								
								add some -stats output.  
							
							... 
							
							
							
							llvm-svn: 122682 
							
						 
						
							2011-01-02 07:36:44 +00:00  
				
					
						
							
							
								 
						
							
								85b6d81d41 
								
							 
						 
						
							
							
								
								teach loop idiom recognition to form memcpy's from simple loops.  
							
							... 
							
							
							
							llvm-svn: 122678 
							
						 
						
							2011-01-02 03:37:56 +00:00  
				
					
						
							
							
								 
						
							
								a3514441e0 
								
							 
						 
						
							
							
								
								add a validity check that was missed, fixing a crash on the  
							
							... 
							
							
							
							new testcase.
llvm-svn: 122662 
							
						 
						
							2011-01-01 20:12:04 +00:00  
				
					
						
							
							
								 
						
							
								91a4435875 
								
							 
						 
						
							
							
								
								improve validity check to handle constant-trip-count loops more  
							
							... 
							
							
							
							aggressively.  In practice, this doesn't help anything though,
see the todo.
llvm-svn: 122660 
							
						 
						
							2011-01-01 19:54:22 +00:00  
				
					
						
							
							
								 
						
							
								8b3baf6d75 
								
							 
						 
						
							
							
								
								implement the "no aliasing accesses in loop" safety check.  This pass  
							
							... 
							
							
							
							should be correct now.
llvm-svn: 122659 
							
						 
						
							2011-01-01 19:39:01 +00:00  
				
					
						
							
							
								 
						
							
								65a699d4d0 
								
							 
						 
						
							
							
								
								simplify this, isBytewiseValue handles the extra check.  We still  
							
							... 
							
							
							
							check for "multiple of a byte" in size to make it clear that the
>> 3 below is safe.
llvm-svn: 122604 
							
						 
						
							2010-12-28 18:53:48 +00:00  
				
					
						
							
							
								 
						
							
								5cf10e691b 
								
							 
						 
						
							
							
								
								Silence gcc warning about an unused variable when doing a release build.  
							
							... 
							
							
							
							llvm-svn: 122593 
							
						 
						
							2010-12-28 09:41:15 +00:00  
				
					
						
							
							
								 
						
							
								cb18bfa3d2 
								
							 
						 
						
							
							
								
								fix some issues Frits noticed, add AliasAnalysis as a dependency  
							
							... 
							
							
							
							llvm-svn: 122585 
							
						 
						
							2010-12-27 18:39:08 +00:00  
				
					
						
							
							
								 
						
							
								b9fe685b9a 
								
							 
						 
						
							
							
								
								have loop-idiom nuke instructions that feed stores that get removed.  
							
							... 
							
							
							
							llvm-svn: 122574 
							
						 
						
							2010-12-27 00:03:23 +00:00  
				
					
						
							
							
								 
						
							
								29e14edc8d 
								
							 
						 
						
							
							
								
								implement enough of the memset inference algorithm to recognize and insert  
							
							... 
							
							
							
							memsets.  This is still missing one important validity check, but this is enough
to compile stuff like this:
void test0(std::vector<char> &X) {
  for (std::vector<char>::iterator I = X.begin(), E = X.end(); I != E; ++I)
    *I = 0;
}
void test1(std::vector<int> &X) {
  for (long i = 0, e = X.size(); i != e; ++i)
    X[i] = 0x01010101;
}
With:
 $ clang t.cpp -S -o - -O2 -emit-llvm | opt -loop-idiom | opt -O3 | llc 
to:
__Z5test0RSt6vectorIcSaIcEE:            ## @_Z5test0RSt6vectorIcSaIcEE
## BB#0:                                ## %entry
	subq	$8, %rsp
	movq	(%rdi), %rax
	movq	8(%rdi), %rsi
	cmpq	%rsi, %rax
	je	LBB0_2
## BB#1:                                ## %bb.nph
	subq	%rax, %rsi
	movq	%rax, %rdi
	callq	___bzero
LBB0_2:                                 ## %for.end
	addq	$8, %rsp
	ret
...
__Z5test1RSt6vectorIiSaIiEE:            ## @_Z5test1RSt6vectorIiSaIiEE
## BB#0:                                ## %entry
	subq	$8, %rsp
	movq	(%rdi), %rax
	movq	8(%rdi), %rdx
	subq	%rax, %rdx
	cmpq	$4, %rdx
	jb	LBB1_2
## BB#1:                                ## %for.body.preheader
	andq	$-4, %rdx
	movl	$1, %esi
	movq	%rax, %rdi
	callq	_memset
LBB1_2:                                 ## %for.end
	addq	$8, %rsp
	ret
llvm-svn: 122573 
							
						 
						
							2010-12-26 23:42:51 +00:00  
				
					
						
							
							
								 
						
							
								7c5f9c35d1 
								
							 
						 
						
							
							
								
								sketch more of this out.  
							
							... 
							
							
							
							llvm-svn: 122567 
							
						 
						
							2010-12-26 20:45:45 +00:00  
				
					
						
							
							
								 
						
							
								81ae3f299a 
								
							 
						 
						
							
							
								
								actually add the file...  
							
							... 
							
							
							
							llvm-svn: 122563 
							
						 
						
							2010-12-26 19:39:38 +00:00