5edb2f32d0 
								
							 
						 
						
							
							
								
								Simplify code by deleting instructions that preceed unreachable instructions.  
							
							... 
							
							
							
							Simplify code by simplifying terminators that branch to blocks that start
with an unreachable instruction.
llvm-svn: 17116 
							
						 
						
							2004-10-18 04:07:22 +00:00  
				
					
						
							
							
								 
						
							
								45c35b1d1f 
								
							 
						 
						
							
							
								
								When converting phi nodes into select instructions, we shouldn't promote PHI  
							
							... 
							
							
							
							nodes unless we KNOW that we are able to promote all of them.
This fixes: test/Regression/Transforms/SimplifyCFG/PhiNoEliminate.ll
llvm-svn: 16973 
							
						 
						
							2004-10-14 05:13:36 +00:00  
				
					
						
							
							
								 
						
							
								879ce7894c 
								
							 
						 
						
							
							
								
								Do not insert trivially dead select instructions, which allows us to  
							
							... 
							
							
							
							potentially fold more in one pass.
llvm-svn: 16583 
							
						 
						
							2004-09-29 05:43:32 +00:00  
				
					
						
							
							
								 
						
							
								6614946443 
								
							 
						 
						
							
							
								
								Convert code to compile with vc7.1.  
							
							... 
							
							
							
							Patch contributed by Paolo Invernizzi. Thanks Paolo!
llvm-svn: 16368 
							
						 
						
							2004-09-15 17:06:42 +00:00  
				
					
						
							
							
								 
						
							
								a5c04ee50f 
								
							 
						 
						
							
							
								
								Fixes to make LLVM compile with vc7.1.  
							
							... 
							
							
							
							Patch contributed by Paolo Invernizzi!
llvm-svn: 16152 
							
						 
						
							2004-09-03 18:19:51 +00:00  
				
					
						
							
							
								 
						
							
								7c16caa336 
								
							 
						 
						
							
							
								
								Changes For Bug 352  
							
							... 
							
							
							
							Move include/Config and include/Support into include/llvm/Config,
include/llvm/ADT and include/llvm/Support. From here on out, all LLVM
public header files must be under include/llvm/.
llvm-svn: 16137 
							
						 
						
							2004-09-01 22:55:40 +00:00  
				
					
						
							
							
								 
						
							
								902dcf0729 
								
							 
						 
						
							
							
								
								These files don't need to include <iostream> since they include "Support/Debug.h".  
							
							... 
							
							
							
							llvm-svn: 15089 
							
						 
						
							2004-07-21 20:50:33 +00:00  
				
					
						
							
							
								 
						
							
								5823ac1c21 
								
							 
						 
						
							
							
								
								Implement SimplifyCFG/BrUnwind.ll  
							
							... 
							
							
							
							llvm-svn: 15022 
							
						 
						
							2004-07-20 01:17:38 +00:00  
				
					
						
							
							
								 
						
							
								ef784f01dd 
								
							 
						 
						
							
							
								
								bug 122:  
							
							... 
							
							
							
							- Minimize redundant isa<GlobalValue> usage
llvm-svn: 14948 
							
						 
						
							2004-07-18 00:32:14 +00:00  
				
					
						
							
							
								 
						
							
								32c518e526 
								
							 
						 
						
							
							
								
								Progress on PR341  
							
							... 
							
							
							
							llvm-svn: 14840 
							
						 
						
							2004-07-15 02:06:12 +00:00  
				
					
						
							
							
								 
						
							
								eb04d9bcb4 
								
							 
						 
						
							
							
								
								Add #include <iostream> since Value.h does not #include it any more.  
							
							... 
							
							
							
							llvm-svn: 14622 
							
						 
						
							2004-07-04 12:19:56 +00:00  
				
					
						
							
							
								 
						
							
								f12c4a3d37 
								
							 
						 
						
							
							
								
								*FINALLY* Fix a really nasty nondeterministic bug that has been haunting us  
							
							... 
							
							
							
							since May 1st.  In this code, the pred iterator was being invalidated sometimes
causing the wrong entries to be added to PHI nodes.
The fix for this is to defererence and safe the *PI value before we hack on
branch instructions, which changes use/def chains, which SOMETIMES invalidates
the iterator.
llvm-svn: 14278 
							
						 
						
							2004-06-21 07:19:01 +00:00  
				
					
						
							
							
								 
						
							
								9734fd0980 
								
							 
						 
						
							
							
								
								Add some DEBUG output to the simplifycfg routines  
							
							... 
							
							
							
							Fix another non-deterministic behavior, this one should actually speed up the
code though as it was doing silly things.
llvm-svn: 14258 
							
						 
						
							2004-06-20 01:13:18 +00:00  
				
					
						
							
							
								 
						
							
								b2b151d297 
								
							 
						 
						
							
							
								
								Do not sort by the address of LLVM ConstantInt* objects.  This produces  
							
							... 
							
							
							
							nondeterministic results that depend on where these objects land in memory.
Instead, sort by the value of the constant, which is stable.
Before this patch, the -simplifycfg pass run from two different compilers
could cause different code to be generated, though it was semantically the
same:
@@ -12258,8 +12258,8 @@
        %s_addr.1 = phi sbyte* [ %s, %entry ], [ %inc.0, %no_exit ]             ; <sbyte*> [#uses=5]
        %tmp.1 = load sbyte* %s_addr.1          ; <sbyte> [#uses=1]
        switch sbyte %tmp.1, label %no_exit [
-                sbyte 0, label %loopexit
                 sbyte 46, label %loopexit
+                sbyte 0, label %loopexit
        ]
We need to stomp all of this stuff out.
llvm-svn: 14243 
							
						 
						
							2004-06-19 07:02:14 +00:00  
				
					
						
							
							
								 
						
							
								be6f06818c 
								
							 
						 
						
							
							
								
								Do not clone arbitrary condition instructions.  
							
							... 
							
							
							
							llvm-svn: 13316 
							
						 
						
							2004-05-02 05:19:36 +00:00  
				
					
						
							
							
								 
						
							
								51a6dbcb65 
								
							 
						 
						
							
							
								
								Do not infinitely "unroll" single BB loops.  
							
							... 
							
							
							
							llvm-svn: 13315 
							
						 
						
							2004-05-02 05:02:03 +00:00  
				
					
						
							
							
								 
						
							
								1e94ed606e 
								
							 
						 
						
							
							
								
								Dont' merge terminators that are needed to select PHI node values.  
							
							... 
							
							
							
							llvm-svn: 13312 
							
						 
						
							2004-05-02 01:00:44 +00:00  
				
					
						
							
							
								 
						
							
								2e93c4275e 
								
							 
						 
						
							
							
								
								Implement SimplifyCFG/branch-cond-merge.ll  
							
							... 
							
							
							
							Turning "if (A < B && B < C)" into "if (A < B & B < C)"
llvm-svn: 13311 
							
						 
						
							2004-05-01 23:35:43 +00:00  
				
					
						
							
							
								 
						
							
								4cbd160b45 
								
							 
						 
						
							
							
								
								Fix my missing parens  
							
							... 
							
							
							
							llvm-svn: 13307 
							
						 
						
							2004-05-01 22:41:51 +00:00  
				
					
						
							
							
								 
						
							
								88da6f7b52 
								
							 
						 
						
							
							
								
								Implement SimplifyCFG/branch-cond-prop.ll  
							
							... 
							
							
							
							llvm-svn: 13306 
							
						 
						
							2004-05-01 22:36:37 +00:00  
				
					
						
							
							
								 
						
							
								0aa565647c 
								
							 
						 
						
							
							
								
								Fold code like:  
							
							... 
							
							
							
							if (C)
    V1 |= V2;
into:
  Vx = V1 | V2;
  V1 = select C, V1, Vx
when the expression can be evaluated unconditionally and is *cheap* to
execute.  This limited form of if conversion is quite handy in lots of cases.
For example, it turns this testcase into straight-line code:
int in0 ; int in1 ; int in2 ; int in3 ;
int in4 ; int in5 ; int in6 ; int in7 ;
int in8 ; int in9 ; int in10; int in11;
int in12; int in13; int in14; int in15;
long output;
void mux(void) {
  output =
      (in0   ?  0x00000001 : 0) | (in1   ?  0x00000002 : 0) |
      (in2   ?  0x00000004 : 0) | (in3   ?  0x00000008 : 0) |
      (in4   ?  0x00000010 : 0) | (in5   ?  0x00000020 : 0) |
      (in6   ?  0x00000040 : 0) | (in7   ?  0x00000080 : 0) |
      (in8   ?  0x00000100 : 0) | (in9   ?  0x00000200 : 0) |
      (in10  ?  0x00000400 : 0) | (in11  ?  0x00000800 : 0) |
      (in12  ?  0x00001000 : 0) | (in13  ?  0x00002000 : 0) |
      (in14  ?  0x00004000 : 0) | (in15  ?  0x00008000 : 0) ;
}
llvm-svn: 12798 
							
						 
						
							2004-04-09 22:50:22 +00:00  
				
					
						
							
							
								 
						
							
								eed034bcd3 
								
							 
						 
						
							
							
								
								Fix the obvious bug in my previous checkin  
							
							... 
							
							
							
							llvm-svn: 12618 
							
						 
						
							2004-04-02 18:15:10 +00:00  
				
					
						
							
							
								 
						
							
								9f0db32625 
								
							 
						 
						
							
							
								
								Implement Transforms/SimplifyCFG/return-merge.ll  
							
							... 
							
							
							
							This actually causes us to turn code like:
  return C ? A : B;
into a select instruction.
llvm-svn: 12617 
							
						 
						
							2004-04-02 18:13:43 +00:00  
				
					
						
							
							
								 
						
							
								81bdcb90ce 
								
							 
						 
						
							
							
								
								Now that all the code generators support the select instruction, and the instcombine  
							
							... 
							
							
							
							pass can eliminate many nasty cases of them, start generating them in the optimizers
llvm-svn: 12545 
							
						 
						
							2004-03-30 19:44:05 +00:00  
				
					
						
							
							
								 
						
							
								a078f47b39 
								
							 
						 
						
							
							
								
								Fix compilation of mesa, which I broke earlier today  
							
							... 
							
							
							
							llvm-svn: 12465 
							
						 
						
							2004-03-17 02:02:47 +00:00  
				
					
						
							
							
								 
						
							
								a64923ad26 
								
							 
						 
						
							
							
								
								Do not copy gigantic switch instructions  
							
							... 
							
							
							
							llvm-svn: 12441 
							
						 
						
							2004-03-16 19:45:22 +00:00  
				
					
						
							
							
								 
						
							
								d3e6ae263c 
								
							 
						 
						
							
							
								
								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.
llvm-svn: 11964 
							
						 
						
							2004-02-28 21:28:10 +00:00  
				
					
						
							
							
								 
						
							
								21e941fbfd 
								
							 
						 
						
							
							
								
								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.
llvm-svn: 11870 
							
						 
						
							2004-02-26 07:13:46 +00:00  
				
					
						
							
							
								 
						
							
								90ea78edba 
								
							 
						 
						
							
							
								
								If a block is made dead, make sure to promptly remove it.  
							
							... 
							
							
							
							llvm-svn: 11799 
							
						 
						
							2004-02-24 16:09:21 +00:00  
				
					
						
							
							
								 
						
							
								a2ab489135 
								
							 
						 
						
							
							
								
								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)
llvm-svn: 11797 
							
						 
						
							2004-02-24 07:23:58 +00:00  
				
					
						
							
							
								 
						
							
								3cd98f054a 
								
							 
						 
						
							
							
								
								Rearrange code a bit  
							
							... 
							
							
							
							llvm-svn: 11793 
							
						 
						
							2004-02-24 05:54:22 +00:00  
				
					
						
							
							
								 
						
							
								6f4b45acf5 
								
							 
						 
						
							
							
								
								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.
llvm-svn: 11792 
							
						 
						
							2004-02-24 05:38:11 +00:00  
				
					
						
							
							
								 
						
							
								e42732e75f 
								
							 
						 
						
							
							
								
								Implement test/Regression/Transforms/SimplifyCFG/UncondBranchToReturn.ll,  
							
							... 
							
							
							
							see the testcase for the reasoning.
llvm-svn: 11496 
							
						 
						
							2004-02-16 06:35:48 +00:00  
				
					
						
							
							
								 
						
							
								18d1f19fba 
								
							 
						 
						
							
							
								
								Implement SimplifyCFG/PhiEliminate.ll  
							
							... 
							
							
							
							Having a proper 'select' instruction would allow the elimination of a lot
of the special case cruft in this patch, but we don't have one yet.
llvm-svn: 11307 
							
						 
						
							2004-02-11 03:36:04 +00:00  
				
					
						
							
							
								 
						
							
								838b845781 
								
							 
						 
						
							
							
								
								The hasConstantReferences predicate always returns false.  
							
							... 
							
							
							
							llvm-svn: 11301 
							
						 
						
							2004-02-11 01:17:07 +00:00  
				
					
						
							
							
								 
						
							
								fae8ab3088 
								
							 
						 
						
							
							
								
								rename the "exceptional" destination of an invoke instruction to the 'unwind' dest  
							
							... 
							
							
							
							llvm-svn: 11202 
							
						 
						
							2004-02-08 21:44:31 +00:00  
				
					
						
							
							
								 
						
							
								df3c342a4c 
								
							 
						 
						
							
							
								
								Finegrainify namespacification  
							
							... 
							
							
							
							llvm-svn: 10727 
							
						 
						
							2004-01-09 06:12:26 +00:00  
				
					
						
							
							
								 
						
							
								960707c335 
								
							 
						 
						
							
							
								
								Put all LLVM code into the llvm namespace, as per bug 109.  
							
							... 
							
							
							
							llvm-svn: 9903 
							
						 
						
							2003-11-11 22:41:34 +00:00  
				
					
						
							
							
								 
						
							
								482202a601 
								
							 
						 
						
							
							
								
								Added LLVM project notice to the top of every C++ source file.  
							
							... 
							
							
							
							Header files will be on the way.
llvm-svn: 9298 
							
						 
						
							2003-10-20 19:43:21 +00:00  
				
					
						
							
							
								 
						
							
								8b2bd4ed47 
								
							 
						 
						
							
							
								
								Fix spelling.  
							
							... 
							
							
							
							llvm-svn: 9027 
							
						 
						
							2003-10-10 17:57:28 +00:00  
				
					
						
							
							
								 
						
							
								04ecefe232 
								
							 
						 
						
							
							
								
								Eliminate support for the llvm.unwind intrinisic, using the Unwind instruction instead  
							
							... 
							
							
							
							llvm-svn: 8411 
							
						 
						
							2003-09-08 19:44:26 +00:00  
				
					
						
							
							
								 
						
							
								3f5823f131 
								
							 
						 
						
							
							
								
								Implement SimplifyCFG/InvokeEliminate.ll  
							
							... 
							
							
							
							llvm-svn: 8126 
							
						 
						
							2003-08-24 18:36:16 +00:00  
				
					
						
							
							
								 
						
							
								031340a551 
								
							 
						 
						
							
							
								
								Fix bug: SimplifyCFG/2003-08-17-BranchFoldOrdering.ll  
							
							... 
							
							
							
							llvm-svn: 7921 
							
						 
						
							2003-08-17 19:41:53 +00:00  
				
					
						
							
							
								 
						
							
								edc8c54e16 
								
							 
						 
						
							
							
								
								Fix bug: SimplifyCFG/2003-08-05-InvokeCrash.ll  
							
							... 
							
							
							
							Fix bug: SimplifyCFG/2003-08-05-MishandleInvoke.ll
llvm-svn: 7599 
							
						 
						
							2003-08-05 16:27:44 +00:00  
				
					
						
							
							
								 
						
							
								889f620841 
								
							 
						 
						
							
							
								
								Remove unnecesary &*'s  
							
							... 
							
							
							
							llvm-svn: 5872 
							
						 
						
							2003-04-23 16:37:45 +00:00  
				
					
						
							
							
								 
						
							
								569a57f9ff 
								
							 
						 
						
							
							
								
								Fix bug: SimplifyCFG/2003-03-07-DominateProblem.ll  
							
							... 
							
							
							
							llvm-svn: 5722 
							
						 
						
							2003-03-07 18:13:41 +00:00  
				
					
						
							
							
								 
						
							
								e54d214fcb 
								
							 
						 
						
							
							
								
								Implement CFGSimplify/PhiBlockMerge*.ll  
							
							... 
							
							
							
							llvm-svn: 5702 
							
						 
						
							2003-03-05 21:36:33 +00:00  
				
					
						
							
							
								 
						
							
								31116bafed 
								
							 
						 
						
							
							
								
								Implement testcase CFGSimplify/EqualPHIEdgeBlockMerge.ll  
							
							... 
							
							
							
							llvm-svn: 5699 
							
						 
						
							2003-03-05 21:01:52 +00:00  
				
					
						
							
							
								 
						
							
								632df28deb 
								
							 
						 
						
							
							
								
								Fix spelling of `propagate'.  
							
							... 
							
							
							
							llvm-svn: 4423 
							
						 
						
							2002-10-29 23:06:16 +00:00  
				
					
						
							
							
								 
						
							
								a704ac8a66 
								
							 
						 
						
							
							
								
								Changes to support PHINode::removeIncoming changes  
							
							... 
							
							
							
							llvm-svn: 4079 
							
						 
						
							2002-10-08 21:36:33 +00:00