summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG
Commit message (Collapse)AuthorAgeFilesLines
...
* Add support for byval function whose argument is not 32 bit aligned.Rafael Espindola2007-10-193-3/+55
| | | | | | | | | | To do this it is necessary to add a "always inline" argument to the memcpy node. For completeness I have also added this node to memmove and memset. I have also added getMem* functions, because the extra argument makes it cumbersome to use getNode and because I get confused by it :-) llvm-svn: 43172
* Implement a few new operations.Chris Lattner2007-10-191-0/+35
| | | | llvm-svn: 43171
* Implement expansion of SINT_TO_FP and UINT_TO_FP operands.Chris Lattner2007-10-191-0/+89
| | | | llvm-svn: 43170
* implement support for custom expansion of any node type, in one place.Chris Lattner2007-10-191-35/+17
| | | | llvm-svn: 43169
* Make use of TLI.ExpandOperation, remove softfloat stuff.Chris Lattner2007-10-191-49/+15
| | | | llvm-svn: 43167
* add expand support for bit_convert result, even allowing custom expansion.Chris Lattner2007-10-191-1/+34
| | | | llvm-svn: 43166
* add a new target hook.Chris Lattner2007-10-191-0/+8
| | | | llvm-svn: 43165
* Negative indices aren't allowed here.Bill Wendling2007-10-191-1/+1
| | | | llvm-svn: 43161
* More ppcf128 issues (maybe the last)?Dale Johannesen2007-10-191-1/+1
| | | | llvm-svn: 43160
* Pointer arithmetic should be done with the index the same size as the pointer.Bill Wendling2007-10-181-0/+7
| | | | llvm-svn: 43120
* Support for ADDC/SUBC.Duncan Sands2007-10-181-8/+33
| | | | llvm-svn: 43119
* Add support for ISD::SELECT in SplitVectorOp.Dan Gohman2007-10-171-0/+20
| | | | llvm-svn: 43072
* Return Expand from getOperationAction for all extendedDuncan Sands2007-10-173-45/+58
| | | | | | | | | | | | | | | | | | | types. This is needed for SIGN_EXTEND_INREG at least. It is not clear if this is correct for other operations. On the other hand, for the various load/store actions it seems to correct to return the type action, as is currently done. Also, it seems that SelectionDAG::getValueType can be called for extended value types; introduce a map for holding these, since we don't really want to extend the vector to be 2^32 pointers long! Generalize DAGTypeLegalizer::PromoteResult_TRUNCATE and DAGTypeLegalizer::PromoteResult_INT_EXTEND to handle the various funky possibilities that apints introduce, for example that you can promote to a type that needs to be expanded. llvm-svn: 43071
* Disable attempts to constant fold PPC f128.Dale Johannesen2007-10-162-48/+57
| | | | | | | Remove the assumption that this will happen from various places. llvm-svn: 43053
* Initial infrastructure for arbitrary precision integerDuncan Sands2007-10-161-26/+32
| | | | | | | | | | codegen support. This should have no effect on codegen for other types. Debatable bits: (1) the use (abuse?) of a set in SDNode::getValueTypeList; (2) the length of getTypeToTransformTo, which maybe should be refactored with a non-inline part for extended value types. llvm-svn: 43030
* Fixes due to lack of type-safety for ValueType: (1) ValueTypeDuncan Sands2007-10-161-3/+3
| | | | | | | being passed instead of an opcode; (2) ValueType being passed for isVolatile (!) in getLoad. llvm-svn: 43028
* implement promotion of select and select_cc, allowing MallocBench/gs toChris Lattner2007-10-161-0/+19
| | | | | | work with type promotion on x86. llvm-svn: 43025
* Make CalcLatency() non-recursive.Evan Cheng2007-10-151-9/+44
| | | | llvm-svn: 43017
* Move CreateStackTemporary out to SelectionDAGChris Lattner2007-10-151-20/+7
| | | | llvm-svn: 42995
* add a new CreateStackTemporary helper method.Chris Lattner2007-10-151-0/+13
| | | | llvm-svn: 42994
* implement promotion of BR_CC operands, fixing bisort on ppc.Chris Lattner2007-10-151-2/+65
| | | | llvm-svn: 42992
* updates from duncanChris Lattner2007-10-151-5/+5
| | | | llvm-svn: 42991
* Fix some typos. Call getTypeToTransformTo rather thanDuncan Sands2007-10-151-14/+14
| | | | | | | | | getTypeToExpandTo. The difference is that getTypeToExpandTo gives the final result of expansion (eg: i128 -> i32 on a 32 bit machine) while getTypeToTransformTo does just one step (i128 -> i64). llvm-svn: 42982
* One mundane change: Change ReplaceAllUsesOfValueWith to *optionally* Chris Lattner2007-10-155-58/+1595
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | take a deleted nodes vector, instead of requiring it. One more significant change: Implement the start of a legalizer that just works on types. This legalizer is designed to run before the operation legalizer and ensure just that the input dag is transformed into an output dag whose operand and result types are all legal, even if the operations on those types are not. This design/impl has the following advantages: 1. When finished, this will *significantly* reduce the amount of code in LegalizeDAG.cpp. It will remove all the code related to promotion and expansion as well as splitting and scalarizing vectors. 2. The new code is very simple, idiomatic, and modular: unlike LegalizeDAG.cpp, it has no 3000 line long functions. :) 3. The implementation is completely iterative instead of recursive, good for hacking on large dags without blowing out your stack. 4. The implementation updates nodes in place when possible instead of deallocating and reallocating the entire graph that points to some mutated node. 5. The code nicely separates out handling of operations with invalid results from operations with invalid operands, making some cases simpler and easier to understand. 6. The new -debug-only=legalize-types option is very very handy :), allowing you to easily understand what legalize types is doing. This is not yet done. Until the ifdef added to SelectionDAGISel.cpp is enabled, this does nothing. However, this code is sufficient to legalize all of the code in 186.crafty, olden and freebench on an x86 machine. The biggest issues are: 1. Vectors aren't implemented at all yet 2. SoftFP is a mess, I need to talk to Evan about it. 3. No lowering to libcalls is implemented yet. 4. Various operations are missing etc. 5. There are FIXME's for stuff I hax0r'd out, like softfp. Hey, at least it is a step in the right direction :). If you'd like to help, just enable the #ifdef in SelectionDAGISel.cpp and compile code with it. If this explodes it will tell you what needs to be implemented. Help is certainly appreciated. Once this goes in, we can do three things: 1. Add a new pass of dag combine between the "type legalizer" and "operation legalizer" passes. This will let us catch some long-standing isel issues that we miss because operation legalization often obfuscates the dag with target-specific nodes. 2. We can rip out all of the type legalization code from LegalizeDAG.cpp, making it much smaller and simpler. When that happens we can then reimplement the core functionality left in it in a much more efficient and non-recursive way. 3. Once the whole legalizer is non-recursive, we can implement whole-function selectiondags maybe... llvm-svn: 42981
* One xform performed by LegalizeDAG is transformation of "store of fp" to ↵Chris Lattner2007-10-151-6/+28
| | | | | | | | | | | | | "store of int". Make two changes: 1) only xform "store of f32" if i32 is a legal type for the target. 2) only xform "store of f64" if either i64 or i32 are legal for the target. 3) if i64 isn't legal, manually lower to 2 stores of i32 instead of letting a later pass of legalize do it. This is ugly, but helps future changes I'm about to commit. llvm-svn: 42980
* Add a (disabled by default) way to view the ID of a node.Chris Lattner2007-10-151-0/+4
| | | | llvm-svn: 42978
* remove misleading comment.Chris Lattner2007-10-141-2/+1
| | | | llvm-svn: 42970
* If a target doesn't have HasMULHU or HasUMUL_LOHI, ExpandOp would returnChris Lattner2007-10-141-1/+0
| | | | | | without lo/hi set. Fall through to making a libcall instead. llvm-svn: 42969
* Disable some compile-time optimizations on PPCDale Johannesen2007-10-141-0/+3
| | | | | | long double. llvm-svn: 42958
* Enhance the truncstore optimization code to handle shiftedChris Lattner2007-10-131-2/+21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | values and propagate demanded bits through them in simple cases. This allows this code: void foo(char *P) { strcpy(P, "abc"); } to compile to: _foo: ldrb r3, [r1] ldrb r2, [r1, #+1] ldrb r12, [r1, #+2]! ldrb r1, [r1, #+1] strb r1, [r0, #+3] strb r2, [r0, #+1] strb r12, [r0, #+2] strb r3, [r0] bx lr instead of: _foo: ldrb r3, [r1, #+3] ldrb r2, [r1, #+2] orr r3, r2, r3, lsl #8 ldrb r2, [r1, #+1] ldrb r1, [r1] orr r2, r1, r2, lsl #8 orr r3, r2, r3, lsl #16 strb r3, [r0] mov r2, r3, lsr #24 strb r2, [r0, #+3] mov r2, r3, lsr #16 strb r2, [r0, #+2] mov r3, r3, lsr #8 strb r3, [r0, #+1] bx lr testcase here: test/CodeGen/ARM/truncstore-dag-combine.ll This also helps occasionally for X86 and other cases not involving unaligned load/stores. llvm-svn: 42954
* Add a simple optimization to simplify the input toChris Lattner2007-10-132-1/+43
| | | | | | | truncate and truncstore instructions, based on the knowledge that they don't demand the top bits. llvm-svn: 42952
* Corrected many typing errors. And removed 'nest' parameter handlingArnold Schwaighofer2007-10-121-2/+2
| | | | | | | for fastcc from X86CallingConv.td. This means that nested functions are not supported for calling convention 'fastcc'. llvm-svn: 42934
* ppc long double. Implement fabs and fneg.Dale Johannesen2007-10-121-0/+16
| | | | llvm-svn: 42924
* Implement i64->ppcf128 conversions.Dale Johannesen2007-10-121-1/+20
| | | | llvm-svn: 42919
* Fix some corner cases with vectors in copyToRegs and copyFromRegs.Dan Gohman2007-10-121-1/+16
| | | | llvm-svn: 42907
* Add support to SplitVectorOp for powi, where the second operandDan Gohman2007-10-121-0/+6
| | | | | | is a scalar integer. llvm-svn: 42906
* EXTRACT_SUBREG coalescing support. The coalescer now treats EXTRACT_SUBREG likeEvan Cheng2007-10-122-3/+13
| | | | | | | | | (almost) a register copy. However, it always coalesced to the register of the RHS (the super-register). All uses of the result of a EXTRACT_SUBREG are sub- register uses which adds subtle complications to load folding, spiller rewrite, etc. llvm-svn: 42899
* PPC long double. Implement a couple more conversions.Dale Johannesen2007-10-121-0/+35
| | | | llvm-svn: 42888
* Add intrinsics for sin, cos, and pow. These use llvm_anyfloat_ty, and soDan Gohman2007-10-121-0/+16
| | | | | | | may be overloaded with vector types. And add a testcase for codegen for these. llvm-svn: 42885
* Codegen support for vector intrinsics.Dan Gohman2007-10-111-27/+114
| | | | | | | | | | | | Factor out the code that expands the "nasty scalar code" for unrolling vectors into a separate routine, teach it how to handle mixed vector/scalar operands, as seen in powi, and use it for several operators, including sin, cos, powi, and pow. Add support in SplitVectorOp for fpow, fpowi and for several unary operators. llvm-svn: 42884
* Implement ppc long double->uint conversion.Dale Johannesen2007-10-111-3/+25
| | | | | | Make ppc long double constants print. llvm-svn: 42882
* Add runtime library names for pow.Dan Gohman2007-10-111-0/+4
| | | | llvm-svn: 42880
* Add an ISD::FPOW node type.Dan Gohman2007-10-111-0/+1
| | | | llvm-svn: 42879
* Added tail call optimization to the x86 back end. It can beArnold Schwaighofer2007-10-111-0/+48
| | | | | | | | | | | enabled by passing -tailcallopt to llc. The optimization is performed if the following conditions are satisfied: * caller/callee are fastcc * elf/pic is disabled OR elf/pic enabled + callee is in module + callee has visibility protected or hidden llvm-svn: 42870
* Next PPC long double bits. First cut at constants.Dale Johannesen2007-10-111-0/+8
| | | | | | | | | No compile-time support for constant operations yet, just format transformations. Make readers and writers work. Split constants into 2 doubles in Legalize. llvm-svn: 42865
* Correct swapped arguments to getConstant.Duncan Sands2007-10-101-1/+1
| | | | llvm-svn: 42824
* Next PPC long double bits: ppcf128->i32 conversion.Dale Johannesen2007-10-102-2/+26
| | | | | | | Surprisingly complicated. Adds getTargetNode for 2 outputs, no inputs (missing). llvm-svn: 42822
* Migrate X86 and ARM from using X86ISD::{,I}DIV and ARMISD::MULHILO{U,S} toDan Gohman2007-10-082-40/+140
| | | | | | | | use ISD::{S,U}DIVREM and ISD::{S,U}MUL_HIO. Move the lowering code associated with these operators into target-independent in LegalizeDAG.cpp and TargetLowering.cpp. llvm-svn: 42762
* DAGCombiner support for UDIVREM/SDIVREM and UMUL_LOHI/SMUL_LOHI. Dan Gohman2007-10-081-17/+137
| | | | | | | | | Check if one of the two results unneeded so see if a simpler operator could bs used. Also check to see if each of the two computations could be simplified if they were split into separate operators. Factor out the code that calls visit() so that it can be used for this purpose. llvm-svn: 42759
* Add convenience overloads of SelectionDAG::getNode that take a SDVTListDan Gohman2007-10-081-0/+36
| | | | | | and individual SDOperand operands. llvm-svn: 42753
OpenPOWER on IntegriCloud