summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils
Commit message (Collapse)AuthorAgeFilesLines
* Simplify the code a bit by making the collection of basic blocks to extractChris Lattner2004-03-141-57/+39
| | | | | | | a member of the class. While we're at it, turn the collection into a set instead of a vector to improve efficiency and make queries simpler. llvm-svn: 12400
* Minor random cleanupsChris Lattner2004-03-141-9/+7
| | | | llvm-svn: 12382
* Verify functions as they are produced if -debug is specified. ReduceChris Lattner2004-03-141-6/+5
| | | | | | curly braceage llvm-svn: 12378
* Move to the IPO library. Utils shouldn't contain passes.Chris Lattner2004-03-141-68/+0
| | | | llvm-svn: 12372
* DemoteRegToStack got moved from DemoteRegToStack.h to Local.hChris Lattner2004-03-141-1/+1
| | | | llvm-svn: 12368
* Add constant folding wrapper support for select instructions.Chris Lattner2004-03-121-0/+4
| | | | llvm-svn: 12319
* Implement ExtractCodeRegion()Misha Brukman2004-03-021-1/+9
| | | | llvm-svn: 12070
* Make a note that this is usually used via bugpoint.Misha Brukman2004-03-021-3/+2
| | | | llvm-svn: 12068
* * Add implementation of ExtractBasicBlock()Misha Brukman2004-03-011-0/+10
| | | | | | * Add comments to ExtractLoop() llvm-svn: 12053
* Fix bug: test/Regression/Transforms/LowerInvoke/2004-02-29-PHICrash.llxChris Lattner2004-02-291-2/+5
| | | | | | ... which tickled the lowerinvoke pass because it used the BCE routines. llvm-svn: 12012
* Implement switch->br and br->switch folding by ripping out the switch->switchChris Lattner2004-02-281-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
* Right, it's really Extractor, not Extraction.Misha Brukman2004-02-281-2/+2
| | | | llvm-svn: 11939
* A pass that uses the generic CodeExtractor to rip out *every* loop in everyMisha Brukman2004-02-281-0/+69
| | | | | | | function, as long as the loop isn't the only one in that function. This should help debugging passes easier with BugPoint. llvm-svn: 11936
* A generic code extractor: given a list of BasicBlocks, it will rip them out intoMisha Brukman2004-02-281-0/+573
| | | | | | a new function, taking care of inputs and outputs. llvm-svn: 11935
* turn things like:Chris Lattner2004-02-261-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 Lattner2004-02-241-0/+8
| | | | llvm-svn: 11799
* Implement SimplifyCFG/switch_switch_fold.llChris Lattner2004-02-241-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 bitChris Lattner2004-02-241-30/+27
| | | | llvm-svn: 11793
* Implement: test/Regression/Transforms/SimplifyCFG/switch_create.llChris Lattner2004-02-241-7/+140
| | | | | | | | | | This turns code like this: if (X == 4 | X == 7) and if (X != 4 & X != 7) into switch instructions. llvm-svn: 11792
* Fix PR245: Linking weak and strong global variables is dependent on link orderChris Lattner2004-02-171-1/+3
| | | | llvm-svn: 11565
* Implement test/Regression/Transforms/SimplifyCFG/UncondBranchToReturn.ll,Chris Lattner2004-02-161-0/+48
| | | | | | see the testcase for the reasoning. llvm-svn: 11496
* Adjustments to support the new ConstantAggregateZero classChris Lattner2004-02-152-8/+21
| | | | llvm-svn: 11474
* Fix compilation of 126.gcc: intrinsic functions cannot throw, so they are notChris Lattner2004-02-131-28/+33
| | | | | | | allowed in invoke instructions. Thus, if we are inlining a call to an intrinsic function into an invoke site, we don't need to turn the call into an invoke! llvm-svn: 11384
* Implement SimplifyCFG/PhiEliminate.llChris Lattner2004-02-111-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 Lattner2004-02-111-52/+49
| | | | llvm-svn: 11301
* rename the "exceptional" destination of an invoke instruction to the ↵Chris Lattner2004-02-082-2/+2
| | | | | | 'unwind' dest llvm-svn: 11202
* Minor speedup, don't query ValueMap each time through the loopChris Lattner2004-02-041-6/+3
| | | | llvm-svn: 11123
* Two changes:Chris Lattner2004-02-041-5/+12
| | | | | | | | | | | | | 1. Don't scan to the end of alloca instructions in the caller function to insert inlined allocas, just insert at the top. This saves a lot of time inlining into functions with a lot of allocas. 2. Use splice to move the alloca instructions over, instead of remove/insert. This allows us to transfer a block at a time, and eliminates a bunch of silly symbol table manipulations. This speeds up the inliner on the testcase in PR209 from 1.73s -> 1.04s (67%) llvm-svn: 11118
* Optimize the case where we are inlining a function that contains only one ↵Chris Lattner2004-02-041-37/+67
| | | | | | | | | | | basic block, and that basic block ends with a return instruction. In this case, we can just splice the cloned "body" of the function directly into the source basic block, avoiding a lot of rearrangement and splitBasicBlock's linear scan over the split block. This speeds up the inliner on the testcase in PR209 from 2.3s to 1.7s, a 35% reduction. llvm-svn: 11116
* More refactoring. Move alloca instructions and handle invoke instructionsChris Lattner2004-02-041-129/+132
| | | | | | | before we delete the original call site, allowing slight simplifications of code, but nothing exciting. llvm-svn: 11109
* Move the cloning of the function body much earlier in the inlinefunctionChris Lattner2004-02-041-52/+54
| | | | | | | | | | process. The only optimization we did so far is to avoid creating a PHI node, then immediately destroying it in the common case where the callee has one return statement. Instead, we just don't create the return value. This has no noticable performance impact, but paves the way for future improvements. llvm-svn: 11108
* Give CloneBasicBlock an optional function argument to specify which functionChris Lattner2004-02-042-13/+10
| | | | | | | | to add the cloned block to. This allows the block to be added to the function immediately, and all of the instructions to be immediately added to the function symbol table, which speeds up the inliner from 3.7 -> 3.38s on the PR209. llvm-svn: 11107
* Bunch up all locally used allocas by the block they are allocated in, andChris Lattner2004-02-031-13/+74
| | | | | | | process them all as a group. This speeds up SRoA/mem2reg from 28.46s to 0.62s on the testcase from PR209. llvm-svn: 11100
* Handle extremely trivial cases extremely efficiently. This speeds upChris Lattner2004-02-031-17/+30
| | | | | | SRoA/mem2reg from 41.2s to 27.5s on the testcase in PR209. llvm-svn: 11099
* Clean up #includesChris Lattner2004-01-121-3/+1
| | | | llvm-svn: 10799
* Remove use of ConstantExpr::getShiftChris Lattner2004-01-123-16/+1
| | | | llvm-svn: 10792
* Remove use of ConstantHandlingChris Lattner2004-01-121-1/+1
| | | | llvm-svn: 10789
* Move llvm::ConstantFoldInstruction from VMCore to here, next to ↵Chris Lattner2004-01-121-0/+58
| | | | | | ConstantFoldTerminator llvm-svn: 10785
* Implement Transforms/ScalarRepl/phinodepromote.ll, which is an importantChris Lattner2004-01-121-17/+86
| | | | | | case that the C/C++ front-end generates. llvm-svn: 10761
* Finegrainify namespacificationChris Lattner2004-01-0912-82/+48
| | | | llvm-svn: 10727
* Add new functionChris Lattner2003-12-191-10/+41
| | | | llvm-svn: 10529
* Minor cleanups and simplificationsChris Lattner2003-11-212-11/+5
| | | | llvm-svn: 10127
* Start using the nicer terminator auto-insertion APIChris Lattner2003-11-203-8/+7
| | | | llvm-svn: 10111
* Spew symbolic types!Chris Lattner2003-11-201-3/+8
| | | | llvm-svn: 10110
* Put all LLVM code into the llvm namespace, as per bug 109.Brian Gaeke2003-11-1114-0/+55
| | | | llvm-svn: 9903
* Reorganize code for locality, improve commentsChris Lattner2003-11-101-19/+23
| | | | llvm-svn: 9857
* Adjust to new critical edge interfaceChris Lattner2003-11-101-9/+11
| | | | llvm-svn: 9853
* Various cleanups and efficiency improvementsChris Lattner2003-11-061-38/+24
| | | | llvm-svn: 9753
* Yet more fixes for constant expr shiftsChris Lattner2003-11-051-0/+6
| | | | llvm-svn: 9739
* Further fixes for PR93Chris Lattner2003-11-051-1/+7
| | | | llvm-svn: 9738
OpenPOWER on IntegriCloud