6f34e317e9 
								
							 
						 
						
							
							
								
								Fix PR3353, infinitely jump threading an infinite loop make from switches.  
							
							... 
							
							
							
							llvm-svn: 62529 
							
						 
						
							2009-01-19 21:20:34 +00:00  
				
					
						
							
							
								 
						
							
								482eb70a10 
								
							 
						 
						
							
							
								
								Fix PR3298, a crash in Jump Threading.  Apparently even  
							
							... 
							
							
							
							jump threading can have bugs, who knew? ;-)
llvm-svn: 61983 
							
						 
						
							2009-01-09 06:08:12 +00:00  
				
					
						
							
							
								 
						
							
								e598370ae9 
								
							 
						 
						
							
							
								
								remove DebugIterations option.  Despite the accusations,  
							
							... 
							
							
							
							jump threading has been shown to only expose problems not
have bugs itself.  I'm sure it's completely bug free! ;-)
llvm-svn: 60725 
							
						 
						
							2008-12-08 22:44:07 +00:00  
				
					
						
							
							
								 
						
							
								8f723670ce 
								
							 
						 
						
							
							
								
								Start simplifying a switch that has a successor that is a switch.  
							
							... 
							
							
							
							llvm-svn: 60534 
							
						 
						
							2008-12-04 06:31:07 +00:00  
				
					
						
							
							
								 
						
							
								75c2661d24 
								
							 
						 
						
							
							
								
								add a debugging option to help track down j-t problems.  
							
							... 
							
							
							
							llvm-svn: 60514 
							
						 
						
							2008-12-04 00:07:59 +00:00  
				
					
						
							
							
								 
						
							
								595c7279bd 
								
							 
						 
						
							
							
								
								Teach jump threading some more simple tricks:  
							
							... 
							
							
							
							1) have it fold "br undef", which does occur with
   surprising frequency as jump threading iterates.
2) teach j-t to delete dead blocks.  This removes the successor
   edges, reducing the in-edges of other blocks, allowing 
   recursive simplification.
3) Fold things like:
     br COND, BBX, BBY
  BBX:
     br COND, BBZ, BBW
   which also happens because jump threading iterates.
llvm-svn: 60470 
							
						 
						
							2008-12-03 07:48:08 +00:00  
				
					
						
							
							
								 
						
							
								2b07d3ccde 
								
							 
						 
						
							
							
								
								switch a couple more calls to use array_pod_sort.  
							
							... 
							
							
							
							llvm-svn: 60337 
							
						 
						
							2008-12-01 06:52:57 +00:00  
				
					
						
							
							
								 
						
							
								88a1f0213d 
								
							 
						 
						
							
							
								
								Teach jump threading to clean up after itself, DCE and constfolding the  
							
							... 
							
							
							
							new instructions it simplifies.  Because we're threading jumps on edges
with constants coming in from PHI's, we inherently are exposing a lot more
constants to the new block.  Folding them and deleting dead conditions
allows the cost model in jump threading to be more accurate as it iterates.
llvm-svn: 60327 
							
						 
						
							2008-12-01 04:48:07 +00:00  
				
					
						
							
							
								 
						
							
								8a172daa55 
								
							 
						 
						
							
							
								
								don't call MergeBasicBlockIntoOnlyPred on a block whose only  
							
							... 
							
							
							
							predecessor is itself.  This doesn't make sense, and this is
a dead infinite loop anyway.
llvm-svn: 60210 
							
						 
						
							2008-11-28 19:54:49 +00:00  
				
					
						
							
							
								 
						
							
								5dfbfcd80d 
								
							 
						 
						
							
							
								
								Fix PR3138: if we merge the entry block into another block, make sure to  
							
							... 
							
							
							
							move the other block back up into the entry position!
llvm-svn: 60179 
							
						 
						
							2008-11-27 19:25:19 +00:00  
				
					
						
							
							
								 
						
							
								72f16e70f0 
								
							 
						 
						
							
							
								
								move FindAvailableLoadedValue from JumpThreading to Transforms/Utils.  
							
							... 
							
							
							
							llvm-svn: 60166 
							
						 
						
							2008-11-27 08:10:05 +00:00  
				
					
						
							
							
								 
						
							
								99d6809ac1 
								
							 
						 
						
							
							
								
								move MergeBasicBlockIntoOnlyPred to Transforms/Utils.  
							
							... 
							
							
							
							llvm-svn: 60162 
							
						 
						
							2008-11-27 07:43:12 +00:00  
				
					
						
							
							
								 
						
							
								240051aace 
								
							 
						 
						
							
							
								
								rename ThreadBlock to ProcessBlock, since it does other things than  
							
							... 
							
							
							
							just simple threading.
llvm-svn: 60157 
							
						 
						
							2008-11-27 07:20:04 +00:00  
				
					
						
							
							
								 
						
							
								98d89d1b1b 
								
							 
						 
						
							
							
								
								Make jump threading substantially more powerful, in the following ways:  
							
							... 
							
							
							
							1. Make it fold blocks separated by an unconditional branch.  This enables
   jump threading to see a broader scope.
2. Make jump threading able to eliminate locally redundant loads when they
   feed the branch condition of a block.  This frequently occurs due to
   reg2mem running.
3. Make jump threading able to eliminate *partially redundant* loads when
   they feed the branch condition of a block.  This is common in code with
   lots of loads and stores like C++ code and 255.vortex.
This implements thread-loads.ll and rdar://6402033.
Per the fixme's, several pieces of this should be moved into Transforms/Utils.
llvm-svn: 60148 
							
						 
						
							2008-11-27 05:07:53 +00:00  
				
					
						
							
							
								 
						
							
								a79db30d28 
								
							 
						 
						
							
							
								
								Tidy up several unbeseeming casts from pointer to intptr_t.  
							
							... 
							
							
							
							llvm-svn: 55779 
							
						 
						
							2008-09-04 17:05:41 +00:00  
				
					
						
							
							
								 
						
							
								fa1211f69b 
								
							 
						 
						
							
							
								
								Enable first-class aggregates support.  
							
							... 
							
							
							
							Remove the GetResultInst instruction. It is still accepted in LLVM assembly
and bitcode, where it is now auto-upgraded to ExtractValueInst. Also, remove
support for return instructions with multiple values. These are auto-upgraded
to use InsertValueInst instructions.
The IRBuilder still accepts multiple-value returns, and auto-upgrades them
to InsertValueInst instructions.
llvm-svn: 53941 
							
						 
						
							2008-07-23 00:34:11 +00:00  
				
					
						
							
							
								 
						
							
								698348dfac 
								
							 
						 
						
							
							
								
								Fix some constructs that gcc-4.4 warns about.  
							
							... 
							
							
							
							llvm-svn: 51591 
							
						 
						
							2008-05-27 11:50:51 +00:00  
				
					
						
							
							
								 
						
							
								f96e1371e8 
								
							 
						 
						
							
							
								
								Tidy up BasicBlock::getFirstNonPHI, and change a bunch of places to  
							
							... 
							
							
							
							use it instead of duplicating its functionality.
llvm-svn: 51499 
							
						 
						
							2008-05-23 21:05:58 +00:00  
				
					
						
							
							
								 
						
							
								5148a4ba66 
								
							 
						 
						
							
							
								
								Fix typo.  
							
							... 
							
							
							
							llvm-svn: 51303 
							
						 
						
							2008-05-20 07:26:45 +00:00  
				
					
						
							
							
								 
						
							
								d78c400b5b 
								
							 
						 
						
							
							
								
								Clean up the use of static and anonymous namespaces. This turned up  
							
							... 
							
							
							
							several things that were neither in an anonymous namespace nor static
but not intended to be global.
llvm-svn: 51017 
							
						 
						
							2008-05-13 00:00:25 +00:00  
				
					
						
							
							
								 
						
							
								e7f0afe168 
								
							 
						 
						
							
							
								
								restore doxygen comment.  
							
							... 
							
							
							
							llvm-svn: 50881 
							
						 
						
							2008-05-09 04:43:13 +00:00  
				
					
						
							
							
								 
						
							
								829046b0b4 
								
							 
						 
						
							
							
								
								Improve pass documentation and comments.  
							
							... 
							
							
							
							Patch by Matthijs Kooijman!
llvm-svn: 50861 
							
						 
						
							2008-05-08 17:46:35 +00:00  
				
					
						
							
							
								 
						
							
								de68fabb35 
								
							 
						 
						
							
							
								
								fix typo Duncan noticed  
							
							... 
							
							
							
							llvm-svn: 50699 
							
						 
						
							2008-05-06 02:31:18 +00:00  
				
					
						
							
							
								 
						
							
								8ed8e3d0e6 
								
							 
						 
						
							
							
								
								Fix a crash when threading a block that includes a MRV call result.  
							
							... 
							
							
							
							DemoteRegToStack doesn't work with MRVs yet, because it relies on the
ability to load/store things.
This fixes PR2285.
llvm-svn: 50667 
							
						 
						
							2008-05-05 20:21:22 +00:00  
				
					
						
							
							
								 
						
							
								f7de528463 
								
							 
						 
						
							
							
								
								Don't infininitely thread branches when a threaded edge  
							
							... 
							
							
							
							goes back to the block, e.g.:
  Threading edge through bool from 'bb37.us.thread3829' to 'bb37.us' with cost: 1, across block:
bb37.us:		; preds = %bb37.us.thread3829, %bb37.us, %bb33
	%D1361.1.us = phi i32 [ %tmp36, %bb33 ], [ %D1361.1.us, %bb37.us ], [ 0, %bb37.us.thread3829 ]		; <i32> [#uses=2]
	%tmp39.us = icmp eq i32 %D1361.1.us, 0		; <i1> [#uses=1]
	br i1 %tmp39.us, label %bb37.us, label %bb42.us
llvm-svn: 50251 
							
						 
						
							2008-04-25 04:12:29 +00:00  
				
					
						
							
							
								 
						
							
								37e9c187b0 
								
							 
						 
						
							
							
								
								Start doing the significantly useful part of jump threading: handle cases  
							
							... 
							
							
							
							where a comparison has a phi input and that phi is a constant.  For example,
stuff like:
  Threading edge through bool from 'bb2149' to 'bb2231' with cost: 1, across block:
bb2237:		; preds = %bb2231, %bb2149
	%tmp2328.rle = phi i32 [ %tmp2232, %bb2231 ], [ %tmp2232439, %bb2149 ]		; <i32> [#uses=2]
	%done.0 = phi i32 [ %done.2, %bb2231 ], [ 0, %bb2149 ]		; <i32> [#uses=1]
	%tmp2239 = icmp eq i32 %done.0, 0		; <i1> [#uses=1]
	br i1 %tmp2239, label %bb2231, label %bb2327
or
bb38.i298:		; preds = %bb33.i295, %bb1693
	%tmp39.i296.rle = phi %struct.ibox* [ null, %bb1693 ], [ %tmp39.i296.rle1109, %bb33.i295 ]		; <%struct.ibox*> [#uses=2]
	%minspan.1.i291.reg2mem.1 = phi i32 [ 32000, %bb1693 ], [ %minspan.0.i288, %bb33.i295 ]		; <i32> [#uses=1]
	%tmp40.i297 = icmp eq %struct.ibox* %tmp39.i296.rle, null		; <i1> [#uses=1]
	br i1 %tmp40.i297, label %implfeeds.exit311, label %bb43.i301
This triggers thousands of times in spec.
llvm-svn: 50110 
							
						 
						
							2008-04-22 21:40:39 +00:00  
				
					
						
							
							
								 
						
							
								d5425e8f8d 
								
							 
						 
						
							
							
								
								Dig through multiple levels of AND to thread jumps if needed.  
							
							... 
							
							
							
							llvm-svn: 50106 
							
						 
						
							2008-04-22 20:46:09 +00:00  
				
					
						
							
							
								 
						
							
								3df4c15dc7 
								
							 
						 
						
							
							
								
								Teach jump threading to thread through blocks like:  
							
							... 
							
							
							
							br (and X, phi(Y, Z, false)), label L1, label L2
This triggers once on 252.eon and 6 times on 176.gcc.  Blocks 
in question often look like this:
bb262:		; preds = %bb261, %bb248
	%iftmp.251.0 = phi i1 [ true, %bb261 ], [ false, %bb248 ]		; <i1> [#uses=4]
	%tmp270 = icmp eq %struct.rtx_def* %tmp.0.i, null		; <i1> [#uses=1]
	%bothcond = or i1 %iftmp.251.0, %tmp270		; <i1> [#uses=1]
	br i1 %bothcond, label %bb288, label %bb273
In this case, it is clear that it doesn't matter if tmp.0.i is null when coming from bb261.  When coming from bb248, it is all that matters.
Another random example:
check_asm_operands.exit:		; preds = %check_asm_operands.exit.thr_comm, %bb30.i, %bb12.i, %bb6.i413
	%tmp.0.i420 = phi i1 [ true, %bb6.i413 ], [ true, %bb12.i ], [ true, %bb30.i ], [ false, %check_asm_operands.exit.thr_comm ; <i1> [#uses=1]
	call void @llvm.stackrestore( i8* %savedstack ) nounwind 
	%tmp4389 = icmp eq i32 %added_sets_1.0, 0		; <i1> [#uses=1]
	%tmp4394 = icmp eq i32 %added_sets_2.0, 0		; <i1> [#uses=1]
	%bothcond80 = and i1 %tmp4389, %tmp4394		; <i1> [#uses=1]
	%bothcond81 = and i1 %bothcond80, %tmp.0.i420		; <i1> [#uses=1]
	br i1 %bothcond81, label %bb4398, label %bb4397
Here is the case from 252.eon:
bb290.i.i:		; preds = %bb23.i57.i.i, %bb8.i39.i.i, %bb100.i.i, %bb100.i.i, %bb85.i.i110
	%myEOF.1.i.i = phi i1 [ true, %bb100.i.i ], [ true, %bb100.i.i ], [ true, %bb85.i.i110 ], [ true, %bb8.i39.i.i ], [ false, %bb23.i57.i.i ]		; <i1> [#uses=2]
	%i.4.i.i = phi i32 [ %i.1.i.i, %bb85.i.i110 ], [ %i.0.i.i, %bb100.i.i ], [ %i.0.i.i, %bb100.i.i ], [ %i.3.i.i, %bb8.i39.i.i ], [ %i.3.i.i, %bb23.i57.i.i ]		; <i32> [#uses=3]
	%tmp292.i.i = load i8* %tmp16.i.i100, align 1		; <i8> [#uses=1]
	%tmp293.not.i.i = icmp ne i8 %tmp292.i.i, 0		; <i1> [#uses=1]
	%bothcond.i.i = and i1 %tmp293.not.i.i, %myEOF.1.i.i		; <i1> [#uses=1]
	br i1 %bothcond.i.i, label %bb202.i.i, label %bb301.i.i
  Factoring out 3 common predecessors.
On the path from any blocks other than bb23.i57.i.i, the load and compare 
are dead.
llvm-svn: 50096 
							
						 
						
							2008-04-22 07:05:46 +00:00  
				
					
						
							
							
								 
						
							
								e369c35a84 
								
							 
						 
						
							
							
								
								refactor some code, no functionality change.  
							
							... 
							
							
							
							llvm-svn: 50094 
							
						 
						
							2008-04-22 06:36:15 +00:00  
				
					
						
							
							
								 
						
							
								bab7bec9c8 
								
							 
						 
						
							
							
								
								fix grammar-o, thanks to Duncan for noticing.  
							
							... 
							
							
							
							llvm-svn: 50047 
							
						 
						
							2008-04-21 18:25:01 +00:00  
				
					
						
							
							
								 
						
							
								f6236cc2e9 
								
							 
						 
						
							
							
								
								Use the new SplitBlockPredecessors to implement a todo.  
							
							... 
							
							
							
							llvm-svn: 50022 
							
						 
						
							2008-04-21 02:57:57 +00:00  
				
					
						
							
							
								 
						
							
								ff1c6e388c 
								
							 
						 
						
							
							
								
								finish the first cut of a jump threading pass implementation.  
							
							... 
							
							
							
							llvm-svn: 50006 
							
						 
						
							2008-04-20 22:39:42 +00:00  
				
					
						
							
							
								 
						
							
								9c1f1a82bf 
								
							 
						 
						
							
							
								
								we can only thread blocks when there is a pred we can determine the succ of.  
							
							... 
							
							
							
							llvm-svn: 50003 
							
						 
						
							2008-04-20 21:18:09 +00:00  
				
					
						
							
							
								 
						
							
								2115722ffa 
								
							 
						 
						
							
							
								
								improve comments, infrastructure, and add some validity checks for threading.  
							
							... 
							
							
							
							Add a cost function.
llvm-svn: 50002 
							
						 
						
							2008-04-20 21:13:06 +00:00  
				
					
						
							
							
								 
						
							
								b3b6007c8b 
								
							 
						 
						
							
							
								
								Add a new Jump Threading pass, which will handle cases  
							
							... 
							
							
							
							such as those in PR2235.  Right now the pass is not very
effective. :)
llvm-svn: 50000 
							
						 
						
							2008-04-20 20:35:01 +00:00