summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/InstructionCombining.cpp
Commit message (Collapse)AuthorAgeFilesLines
* g++-4.3 build-fix: CHAR_BIT requires <climits>.Torok Edwin2008-04-201-0/+1
| | | | llvm-svn: 49989
* Switch to using Simplified ConstantFP::get API.Chris Lattner2008-04-201-5/+4
| | | | llvm-svn: 49977
* Teach InstCombine's ComputeMaskedBits to handle pointer expressionsDan Gohman2008-04-101-140/+299
| | | | | | | | | | | | | | | in addition to integer expressions. Rewrite GetOrEnforceKnownAlignment as a ComputeMaskedBits problem, moving all of its special alignment knowledge to ComputeMaskedBits as low-zero-bits knowledge. Also, teach ComputeMaskedBits a few basic things about Mul and PHI instructions. This improves ComputeMaskedBits-based simplifications in a few cases, but more noticeably it significantly improves instcombine's alignment detection for loads, stores, and memory intrinsics. llvm-svn: 49492
* API changes for class Use size reduction, wave 1.Gabor Greif2008-04-061-54/+54
| | | | | | | | Specifically, introduction of XXX::Create methods for Users that have a potentially variable number of Uses. llvm-svn: 49277
* Don't eliminate bitcast instructions that change the type of a pointerNate Begeman2008-03-311-0/+5
| | | | llvm-svn: 48971
* Handle a special case xor undef, undef -> 0. Technically this should be ↵Evan Cheng2008-03-251-1/+6
| | | | | | transformed to undef. But this is such a common idiom (misuse) we are going to handle it. llvm-svn: 48791
* Transform (zext (or (icmp), (icmp))) to (or (zext (cimp), (zext icmp))) if ↵Evan Cheng2008-03-241-96/+129
| | | | | | at least one of the (zext icmp) can be transformed to eliminate an icmp. llvm-svn: 48715
* Fix the build for gcc-4.2.Duncan Sands2008-03-211-1/+2
| | | | llvm-svn: 48639
* Teach masked value is zero about add and sub, and use MVIZ toChris Lattner2008-03-211-34/+87
| | | | | | | | simplify things like (X & 4) >> 1 == 2 --> (X & 4) == 4. since it is obvious that the shift doesn't remove any bits. llvm-svn: 48631
* The inst combining of inttoptr into GEP with one index was using the bit size ofBill Wendling2008-03-141-1/+1
| | | | | | | | the type instead of the byte size. This was causing troublesome mis-compilations. True to form, this took 2 days to find and is a one-line fix. :-P llvm-svn: 48354
* Reimplement the parameter attributes support, phase #1. hilights:Chris Lattner2008-03-121-39/+28
| | | | | | | | | | | | | | | | | | | | | | | 1. There is now a "PAListPtr" class, which is a smart pointer around the underlying uniqued parameter attribute list object, and manages its refcount. It is now impossible to mess up the refcount. 2. PAListPtr is now the main interface to the underlying object, and the underlying object is now completely opaque. 3. Implementation details like SmallVector and FoldingSet are now no longer part of the interface. 4. You can create a PAListPtr with an arbitrary sequence of ParamAttrsWithIndex's, no need to make a SmallVector of a specific size (you can just use an array or scalar or vector if you wish). 5. All the client code that had to check for a null pointer before dereferencing the pointer is simplified to just access the PAListPtr directly. 6. The interfaces for adding attrs to a list and removing them is a bit simpler. Phase #2 will rename some stuff (e.g. PAListPtr) and do other less invasive changes. llvm-svn: 48289
* Skip functions that return multiple values.Devang Patel2008-03-111-0/+3
| | | | llvm-svn: 48233
* Don't eliminate blocks that are only reachable by unwind_to.Nick Lewycky2008-03-091-2/+8
| | | | llvm-svn: 48106
* Don't try to simplify urem and srem using arithmetic rules that don't workNick Lewycky2008-03-061-43/+96
| | | | | | under modulo (overflow). Fixes PR1933. llvm-svn: 47987
* Folding or(fcmp,fcmp) only works if the operands of the fcmps are the same ↵Chris Lattner2008-02-291-1/+2
| | | | | | fp type. llvm-svn: 47750
* De-tabify.Bill Wendling2008-02-261-22/+22
| | | | llvm-svn: 47599
* Split ParameterAttributes.h, putting the complicatedDale Johannesen2008-02-221-1/+1
| | | | | | | stuff into ParamAttrsList.h. Per feedback from ParamAttrs changes. llvm-svn: 47504
* Fixed a typo.Zhou Sheng2008-02-221-1/+1
| | | | llvm-svn: 47478
* Fix newly-introduced 4.3 warningsAnton Korobeynikov2008-02-201-2/+2
| | | | llvm-svn: 47375
* Make Transforms to be 4.3 warnings-cleanAnton Korobeynikov2008-02-201-14/+23
| | | | llvm-svn: 47371
* Expand ParameterAttributes to 32 bits (in preparationDale Johannesen2008-02-191-8/+13
| | | | | | | for adding alignment info, not there yet). Clean up interfaces to reference ParameterAttributes consistently. llvm-svn: 47342
* fdiv/frem of undef can produce undef, because the undef operand Chris Lattner2008-02-191-4/+11
| | | | | | | can be a SNaN. We could be more aggressive and turn this into unreachable, but that is less nice, and not really worth it. llvm-svn: 47313
* Correctly fold divide-by-constant, even when faced with overflow.Nick Lewycky2008-02-181-2/+27
| | | | llvm-svn: 47287
* Transforming -A + -B --> -(A + B) isn't safe for FP, thanksChris Lattner2008-02-181-4/+6
| | | | | | to Dale for noticing this! llvm-svn: 47276
* optimize away stackrestore calls that have no intervening alloca or call.Chris Lattner2008-02-181-10/+18
| | | | llvm-svn: 47258
* Fold (-x + -y) -> -(x+y) which promotes better association, fixingChris Lattner2008-02-171-2/+10
| | | | | | the second half of PR2047 llvm-svn: 47244
* Rename APInt's isPositive to isNonNegative, to reflect what itDan Gohman2008-02-131-6/+6
| | | | | | actually does. llvm-svn: 47090
* Fix a bug compiling PR1978 (perhaps not the only one though) whichChris Lattner2008-02-051-54/+5
| | | | | | | | | was incorrectly simplifying "x == (gep x, 1, i)" into false, even though i could be negative. As it turns out, all the code to handle this already existed, we just need to disable the incorrect optimization case and let the general case handle it. llvm-svn: 46739
* There are some cases where icmp(add) can be folded into a new icmp. Handle them.Nick Lewycky2008-02-031-0/+32
| | | | llvm-svn: 46687
* Hack on vectors too.Nick Lewycky2008-02-031-1/+1
| | | | llvm-svn: 46684
* Fold away one multiply in instcombine. This would normally be caught inNick Lewycky2008-02-031-0/+24
| | | | | | reassociate anyways, but they could be generated during instcombine's run. llvm-svn: 46683
* eliminate additions of 0.0 when they are obviously dead. This has to be ↵Chris Lattner2008-01-291-0/+47
| | | | | | | | careful to avoid turning -0.0 + 0.0 -> -0.0 which is incorrect. llvm-svn: 46499
* Handle some more combinations of extend and icmp. Fixes PR1940.Nick Lewycky2008-01-281-8/+12
| | | | llvm-svn: 46431
* Fix PR1932 by disabling an xform invalid for fdiv.Chris Lattner2008-01-281-9/+10
| | | | llvm-svn: 46429
* Fold fptrunc(add (fpextend x), (fpextend y)) -> add(x,y), as GCC does.Chris Lattner2008-01-271-3/+75
| | | | llvm-svn: 46406
* Enable the fix I just checked in, silly me.Nick Lewycky2008-01-221-1/+0
| | | | llvm-svn: 46247
* Multiply can be evaluated in a different type, so long as the target type hasNick Lewycky2008-01-221-0/+10
| | | | | | a smaller bitwidth. llvm-svn: 46244
* I noticed that the trampoline straightening transformation couldDuncan Sands2008-01-141-21/+28
| | | | | | | | | drop attributes on varargs call arguments. Also, it could generate invalid IR if the transformed call already had the 'nest' attribute somewhere (this can never happen for code coming from llvm-gcc, but it's a theoretical possibility). Fix both problems. llvm-svn: 45973
* Turn a memcpy from a double* into a load/store of double instead ofChris Lattner2008-01-141-9/+46
| | | | | | | | | | a load/store of i64. The later prevents promotion/scalarrepl of the source and dest in many cases. This fixes the 300% performance regression of the byval stuff on stepanov_v1p2. llvm-svn: 45945
* factor memcpy/memmove simplification out to its own SimplifyMemTransfer Chris Lattner2008-01-131-35/+42
| | | | | | method, no functionality change. llvm-svn: 45944
* simplify some code. If we can infer alignment for source and dest that are Chris Lattner2008-01-131-21/+22
| | | | | | | greater than memcpy alignment, and if we lower to load/store, use the best alignment info we have. llvm-svn: 45943
* simplify some code by adding a InsertBitCastBefore method,Chris Lattner2008-01-131-30/+25
| | | | | | make memmove->memcpy conversion a bit simpler. llvm-svn: 45942
* Fix PR1907, a nasty miscompilation because instcombine didn'tChris Lattner2008-01-131-2/+8
| | | | | | | realize that ne & sgt was a signed comparison (it was only looking at whether the left compare was signed). llvm-svn: 45937
* When turning a call to a bitcast function into a direct call,Duncan Sands2008-01-131-12/+17
| | | | | | | if this becomes a varargs call then deal correctly with any parameter attributes on the newly vararg call arguments. llvm-svn: 45931
* Implement PR1795, an instcombine hack for forming GEPs with integer pointer ↵Chris Lattner2008-01-081-3/+53
| | | | | | arithmetic. llvm-svn: 45745
* Small cleanup for handling of type/parameter attributeDuncan Sands2008-01-071-8/+11
| | | | | | incompatibility. llvm-svn: 45704
* The transform that tries to turn calls to bitcast functions intoDuncan Sands2008-01-061-10/+45
| | | | | | | | | direct calls bails out unless caller and callee have essentially equivalent parameter attributes. This is illogical - the callee's attributes should be of no relevance here. Rework the logic, which incidentally fixes a crash when removed arguments have attributes. llvm-svn: 45658
* When transforming a call to a bitcast function intoDuncan Sands2008-01-061-45/+16
| | | | | | | | | | | a direct call with cast parameters and cast return value (if any), instcombine was prepared to cast any non-void return value into any other, whether castable or not. Add a new predicate for testing whether casting is valid, and check it both for the return value and (as a cleanup) for the parameters. llvm-svn: 45657
* remove a couple more unsafe xforms in the face of overflow.Chris Lattner2008-01-051-9/+0
| | | | llvm-svn: 45613
* remove the (x-y) < 0 comparison xform, it miscompiles Chris Lattner2008-01-051-11/+5
| | | | | | | things that are not equality comparisons, for example: (2147479553+4096)-2147479553 < 0 != (2147479553+4096) < 2147479553 llvm-svn: 45612
OpenPOWER on IntegriCloud