| Commit message (Collapse) | Author | Age | Files | Lines | |
|---|---|---|---|---|---|
| * | Do not clone arbitrary condition instructions. | Chris Lattner | 2004-05-02 | 1 | -1/+1 |
| | | | | | llvm-svn: 13316 | ||||
| * | Do not infinitely "unroll" single BB loops. | Chris Lattner | 2004-05-02 | 1 | -5/+4 |
| | | | | | llvm-svn: 13315 | ||||
| * | Dont' merge terminators that are needed to select PHI node values. | Chris Lattner | 2004-05-02 | 1 | -1/+1 |
| | | | | | llvm-svn: 13312 | ||||
| * | Implement SimplifyCFG/branch-cond-merge.ll | Chris Lattner | 2004-05-01 | 1 | -10/+64 |
| | | | | | | | Turning "if (A < B && B < C)" into "if (A < B & B < C)" llvm-svn: 13311 | ||||
| * | Fix my missing parens | Chris Lattner | 2004-05-01 | 1 | -1/+1 |
| | | | | | llvm-svn: 13307 | ||||
| * | Implement SimplifyCFG/branch-cond-prop.ll | Chris Lattner | 2004-05-01 | 1 | -2/+30 |
| | | | | | llvm-svn: 13306 | ||||
| * | Fold code like: | Chris Lattner | 2004-04-09 | 1 | -18/+72 |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 | ||||
| * | Fix the obvious bug in my previous checkin | Chris Lattner | 2004-04-02 | 1 | -0/+3 |
| | | | | | llvm-svn: 12618 | ||||
| * | Implement Transforms/SimplifyCFG/return-merge.ll | Chris Lattner | 2004-04-02 | 1 | -1/+57 |
| | | | | | | | | | | | This actually causes us to turn code like: return C ? A : B; into a select instruction. llvm-svn: 12617 | ||||
| * | Now that all the code generators support the select instruction, and the ↵ | Chris Lattner | 2004-03-30 | 1 | -78/+9 |
| | | | | | | | | | instcombine pass can eliminate many nasty cases of them, start generating them in the optimizers llvm-svn: 12545 | ||||
| * | Fix compilation of mesa, which I broke earlier today | Chris Lattner | 2004-03-17 | 1 | -2/+3 |
| | | | | | llvm-svn: 12465 | ||||
| * | Do not copy gigantic switch instructions | Chris Lattner | 2004-03-16 | 1 | -1/+8 |
| | | | | | llvm-svn: 12441 | ||||
| * | Implement switch->br and br->switch folding by ripping out the switch->switch | Chris Lattner | 2004-02-28 | 1 | -178/+174 |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 | ||||
| * | turn things like: | Chris Lattner | 2004-02-26 | 1 | -0/+74 |
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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 | ||||
| * | If a block is made dead, make sure to promptly remove it. | Chris Lattner | 2004-02-24 | 1 | -0/+8 |
| | | | | | llvm-svn: 11799 | ||||
| * | Implement SimplifyCFG/switch_switch_fold.ll | Chris Lattner | 2004-02-24 | 1 | -2/+150 |
| | | | | | | | | | | | | | | | | 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 | ||||
| * | Rearrange code a bit | Chris Lattner | 2004-02-24 | 1 | -30/+27 |
| | | | | | llvm-svn: 11793 | ||||
| * | Implement: test/Regression/Transforms/SimplifyCFG/switch_create.ll | Chris Lattner | 2004-02-24 | 1 | -7/+140 |
| | | | | | | | | | | | This turns code like this: if (X == 4 | X == 7) and if (X != 4 & X != 7) into switch instructions. llvm-svn: 11792 | ||||
| * | Implement test/Regression/Transforms/SimplifyCFG/UncondBranchToReturn.ll, | Chris Lattner | 2004-02-16 | 1 | -0/+48 |
| | | | | | | | see the testcase for the reasoning. llvm-svn: 11496 | ||||
| * | Implement SimplifyCFG/PhiEliminate.ll | Chris Lattner | 2004-02-11 | 1 | -5/+234 |
| | | | | | | | | 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 | ||||
| * | The hasConstantReferences predicate always returns false. | Chris Lattner | 2004-02-11 | 1 | -52/+49 |
| | | | | | llvm-svn: 11301 | ||||
| * | rename the "exceptional" destination of an invoke instruction to the ↵ | Chris Lattner | 2004-02-08 | 1 | -1/+1 |
| | | | | | | | 'unwind' dest llvm-svn: 11202 | ||||
| * | Finegrainify namespacification | Chris Lattner | 2004-01-09 | 1 | -5/+2 |
| | | | | | llvm-svn: 10727 | ||||
| * | Put all LLVM code into the llvm namespace, as per bug 109. | Brian Gaeke | 2003-11-11 | 1 | -0/+4 |
| | | | | | llvm-svn: 9903 | ||||
| * | Added LLVM project notice to the top of every C++ source file. | John Criswell | 2003-10-20 | 1 | -0/+7 |
| | | | | | | | Header files will be on the way. llvm-svn: 9298 | ||||
| * | Fix spelling. | Misha Brukman | 2003-10-10 | 1 | -3/+3 |
| | | | | | llvm-svn: 9027 | ||||
| * | Eliminate support for the llvm.unwind intrinisic, using the Unwind ↵ | Chris Lattner | 2003-09-08 | 1 | -25/+24 |
| | | | | | | | instruction instead llvm-svn: 8411 | ||||
| * | Implement SimplifyCFG/InvokeEliminate.ll | Chris Lattner | 2003-08-24 | 1 | -1/+36 |
| | | | | | llvm-svn: 8126 | ||||
| * | Fix bug: SimplifyCFG/2003-08-17-BranchFoldOrdering.ll | Chris Lattner | 2003-08-17 | 1 | -1/+5 |
| | | | | | llvm-svn: 7921 | ||||
| * | Fix bug: SimplifyCFG/2003-08-05-InvokeCrash.ll | Chris Lattner | 2003-08-05 | 1 | -1/+2 |
| | | | | | | | Fix bug: SimplifyCFG/2003-08-05-MishandleInvoke.ll llvm-svn: 7599 | ||||
| * | Remove unnecesary &*'s | Chris Lattner | 2003-04-23 | 1 | -2/+2 |
| | | | | | llvm-svn: 5872 | ||||
| * | Fix bug: SimplifyCFG/2003-03-07-DominateProblem.ll | Chris Lattner | 2003-03-07 | 1 | -2/+19 |
| | | | | | llvm-svn: 5722 | ||||
| * | Implement CFGSimplify/PhiBlockMerge*.ll | Chris Lattner | 2003-03-05 | 1 | -10/+36 |
| | | | | | llvm-svn: 5702 | ||||
| * | Implement testcase CFGSimplify/EqualPHIEdgeBlockMerge.ll | Chris Lattner | 2003-03-05 | 1 | -10/+24 |
| | | | | | llvm-svn: 5699 | ||||
| * | Fix spelling of `propagate'. | Misha Brukman | 2002-10-29 | 1 | -3/+3 |
| | | | | | llvm-svn: 4423 | ||||
| * | Changes to support PHINode::removeIncoming changes | Chris Lattner | 2002-10-08 | 1 | -9/+2 |
| | | | | | llvm-svn: 4079 | ||||
| * | Fix bug: SimplifyCFG/2002-09-24-PHIAssertion.ll | Chris Lattner | 2002-09-24 | 1 | -3/+4 |
| | | | | | llvm-svn: 3913 | ||||
| * | Minor cleanups | Chris Lattner | 2002-09-24 | 1 | -7/+5 |
| | | | | | llvm-svn: 3904 | ||||
| * | Allow folding of basic blocks that have PHI nodes in them, fixing "bug": | Chris Lattner | 2002-07-29 | 1 | -1/+11 |
| | | | | | | | test/Regression/Transforms/SimplifyCFG/2002-06-24-PHINode.ll llvm-svn: 3128 | ||||
| * | *** empty log message *** | Chris Lattner | 2002-06-25 | 1 | -29/+26 |
| | | | | | llvm-svn: 2777 | ||||
| * | Add implementation of SimplifyCFG | Chris Lattner | 2002-05-21 | 1 | -0/+198 |
| llvm-svn: 2701 | |||||

