summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms
Commit message (Collapse)AuthorAgeFilesLines
* Don't try to create PHIs of struct types. FalloutDale Johannesen2008-05-011-8/+31
| | | | | | from x86-64 calling convention work. llvm-svn: 50545
* Fix an overaggressive SimplifyDemandedBits optimization on urem. ThisDan Gohman2008-05-011-4/+5
| | | | | | fixes the 254.gap regression on x86 and the 403.gcc regression on x86-64. llvm-svn: 50537
* 1) add '-debug' outputChris Lattner2008-05-011-11/+19
| | | | | | | 2) Return NULL instead of false in several places for tidiness. 3) fix a bug optimizing sprintf(p, "%c", x) llvm-svn: 50521
* Delete the IPO simplify-libcalls and completely reimplement it asChris Lattner2008-05-012-2214/+1437
| | | | | | | | a FunctionPass. This makes it simpler, fixes dozens of bugs, adds a couple of minor features, and shrinks is considerably: from 2214 to 1437 lines. llvm-svn: 50520
* This condition got inverted accidentally.Owen Anderson2008-04-301-1/+1
| | | | llvm-svn: 50473
* move lowering of llvm.memset -> store from simplify libcalls Chris Lattner2008-04-301-7/+49
| | | | | | to instcombine. llvm-svn: 50472
* use string length computation to generalize several xforms.Chris Lattner2008-04-301-36/+39
| | | | llvm-svn: 50464
* Revert r50441. The original code was correct. Add some more comments so ↵Owen Anderson2008-04-291-3/+9
| | | | | | that I don't make the same mistake in the future. llvm-svn: 50446
* Fix a bug in memcpyopt where the memcpy-memcpy transform was never being ↵Owen Anderson2008-04-291-4/+6
| | | | | | | | | applied because we were checking for it in the wrong order. This caused a miscompilation because the return slot optimization assumes that the call it is dealing with is NOT a memcpy. llvm-svn: 50444
* We should be returning true here since we've changed the function.Owen Anderson2008-04-291-1/+1
| | | | llvm-svn: 50442
* A lot of cleanups and documentation improvements, as well as a few corner ↵Owen Anderson2008-04-291-59/+76
| | | | | | | | case fixes. Most of this was suggested by Chris. llvm-svn: 50441
* Rename DeadLoopElimination to LoopDeletion, part 2.Owen Anderson2008-04-291-14/+12
| | | | llvm-svn: 50437
* Rename DeadLoopElimination to LoopDeletion, part one.Owen Anderson2008-04-291-0/+0
| | | | llvm-svn: 50436
* don't eliminate load from volatile value on paths where the load is dead.Chris Lattner2008-04-291-0/+9
| | | | | | This fixes the second half of PR2262 llvm-svn: 50430
* fix a subtle volatile handling bug.Chris Lattner2008-04-291-7/+12
| | | | llvm-svn: 50428
* Implement more aggressive support for analyzing string length. ThisChris Lattner2008-04-291-10/+136
| | | | | | | | | | generalizes the previous code to handle the case when the string is not an immediate to the strlen call (for example, crazy stuff like strlen(c ? "foo" : "bart"+1) -> 3). This implements gcc.c-torture/execute/builtins/strlen-2.c. I will generalize other cases in simplifylibcalls to use the same routine later. llvm-svn: 50408
* Clarify what we mean by a dead loop.Owen Anderson2008-04-291-0/+4
| | | | llvm-svn: 50406
* don't delete the last store to an alloca if the store is volatile.Chris Lattner2008-04-291-1/+1
| | | | llvm-svn: 50390
* Add some more comments.Owen Anderson2008-04-291-0/+21
| | | | llvm-svn: 50384
* Remove debugging code.Owen Anderson2008-04-291-4/+0
| | | | llvm-svn: 50383
* Add dead loop elimination, which removes dead loops for which we can computeOwen Anderson2008-04-291-0/+239
| | | | | | the trip count. llvm-svn: 50382
* Fix DSE to not eliminate volatile loads with no uses.Dan Gohman2008-04-281-3/+3
| | | | llvm-svn: 50370
* Teach InstCombine's ComputeMaskedBits what SelectionDAG'sDan Gohman2008-04-281-45/+100
| | | | | | | | | | | ComputeMaskedBits knows about cttz, ctlz, and ctpop. Teach SelectionDAG's ComputeMaskedBits what InstCombine's knows about SRem. And teach them both some things about high bits in Mul, UDiv, URem, and Sub. This allows instcombine and dagcombine to eliminate sign-extension operations in several new cases. llvm-svn: 50358
* Fix PR2256, yet another miscompilation in simplifycfg of iChris Lattner2008-04-281-3/+4
| | | | | | | | multiple return values. Bill, please pull this into Tak. llvm-svn: 50332
* Implement a signficant optimization for inline asm:Chris Lattner2008-04-271-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | When choosing between constraints with multiple options, like "ir", test to see if we can use the 'i' constraint and go with that if possible. This produces more optimal ASM in all cases (sparing a register and an instruction to load it), and fixes inline asm like this: void test () { asm volatile (" %c0 %1 " : : "imr" (42), "imr"(14)); } Previously we would dump "42" into a memory location (which is ok for the 'm' constraint) which would cause a problem because the 'c' modifier is not valid on memory operands. Isn't it great how inline asm turns 'missed optimization' into 'compile failed'?? Incidentally, this was the todo in PowerPC/2007-04-24-InlineAsm-I-Modifier.ll Please do NOT pull this into Tak. llvm-svn: 50315
* Move a bunch of inline asm code out of line.Chris Lattner2008-04-271-1/+1
| | | | llvm-svn: 50313
* When SRoA'ing a global variable, make sure the new globals get the Chris Lattner2008-04-261-5/+32
| | | | | | | | | appropriate alignment. This fixes a miscompilation of 252.eon on x86-64 (rdar://5891920). Bill, please pull this into Tak. llvm-svn: 50308
* change comments per reviewDale Johannesen2008-04-251-2/+2
| | | | llvm-svn: 50300
* Remove the code from CodeGenPrepare that moved getresult instructionsDan Gohman2008-04-251-9/+0
| | | | | | | | | | | to the block that defines their operands. This doesn't work in the case that the operand is an invoke, because invoke is a terminator and must be the last instruction in a block. Replace it with support in SelectionDAGISel for copying struct values into sequences of virtual registers. llvm-svn: 50279
* Feedback from chrisNate Begeman2008-04-251-2/+2
| | | | llvm-svn: 50271
* Remove 'unwinds to' support from mainline. This patch undoes r47802 r47989Nick Lewycky2008-04-2512-103/+21
| | | | | | r48047 r48084 r48085 r48086 r48088 r48096 r48099 r48109 and r48123. llvm-svn: 50265
* Teach the PruningFunctionCloner how to look through loads with Nate Begeman2008-04-251-4/+12
| | | | | | ConstantExpression GEPs pointing into constant globals. llvm-svn: 50256
* Don't infininitely thread branches when a threaded edgeChris Lattner2008-04-251-0/+22
| | | | | | | | | | | | | 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
* Adjust inline cost computation to be less aggressive.Evan Cheng2008-04-241-2/+2
| | | | llvm-svn: 50222
* code restructuring, not functionality change.Chris Lattner2008-04-241-22/+24
| | | | llvm-svn: 50203
* Don't replace multiple result of calls with undef, Chris Lattner2008-04-241-2/+4
| | | | | | | sccp tracks getresult values, not call values in this case. llvm-svn: 50202
* code cleanup, no functionality change.Chris Lattner2008-04-241-19/+21
| | | | llvm-svn: 50201
* Split some code out of the main SimplifyCFG loop into its own function.Chris Lattner2008-04-241-65/+103
| | | | | | | Fix said code to handle merging return instructions together correctly when handling multiple return values. llvm-svn: 50199
* Check type instead of no. of operands.Devang Patel2008-04-231-1/+1
| | | | llvm-svn: 50179
* Rewrite previous patch to suit Chris's preference.Dale Johannesen2008-04-231-21/+31
| | | | llvm-svn: 50174
* simplify code for propagation of constant arguments into Chris Lattner2008-04-231-46/+49
| | | | | | callees. llvm-svn: 50142
* Fix a number of bugs in ipconstantprop, simplify the code, fit in 80 cols,Chris Lattner2008-04-231-41/+39
| | | | | | fix read after free bug (PR2238). llvm-svn: 50141
* Rewrite multiple return value handling in SCCP. Before, the -sccp passChris Lattner2008-04-231-112/+114
| | | | | | | would turn every getresult instruction into undef. This helps with rdar://5778210 llvm-svn: 50140
* Do not change the type of a ByVal argument to aDale Johannesen2008-04-231-4/+17
| | | | | | type of a different size. llvm-svn: 50121
* Don't do: "(X & 4) >> 1 == 2 --> (X & 4) == 4" if there are more than one ↵Evan Cheng2008-04-231-2/+3
| | | | | | uses of the shift result. llvm-svn: 50118
* Start doing the significantly useful part of jump threading: handle casesChris Lattner2008-04-221-7/+83
| | | | | | | | | | | | | | | | | | | | | | | | 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
* Dig through multiple levels of AND to thread jumps if needed.Chris Lattner2008-04-221-14/+22
| | | | llvm-svn: 50106
* Teach jump threading to thread through blocks like:Chris Lattner2008-04-221-20/+106
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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
* refactor some code, no functionality change.Chris Lattner2008-04-221-2/+13
| | | | llvm-svn: 50094
* remove dead code.Chris Lattner2008-04-221-1/+0
| | | | llvm-svn: 50080
OpenPOWER on IntegriCloud