summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/SelectionDAG
Commit message (Collapse)AuthorAgeFilesLines
...
* Added SelectionDAG::InsertISelMapEntry(). This is used to workaround the gccEvan Cheng2006-02-091-0/+9
| | | | | | | | problem where it inline the map insertion call too aggressively. Before this change it was producing a frame size of 24k for Select_store(), now it's down to 10k (by calling this method rather than calling the map insertion operator). llvm-svn: 26094
* More changes to reduce frame size.Evan Cheng2006-02-091-0/+243
| | | | | | | | | Move all getTargetNode() out of SelectionDAG.h into SelectionDAG.cpp. This prevents them from being inlined. Change getTargetNode() so they return SDNode * instead of SDOperand to prevent copying. It should also help compilation speed. llvm-svn: 26083
* Make MachineConstantPool entries alignments explicitChris Lattner2006-02-091-2/+12
| | | | llvm-svn: 26071
* Compile this:Chris Lattner2006-02-081-0/+26
| | | | | | | | | | | | | | | xori r6, r2, 1 rlwinm r6, r6, 0, 31, 31 cmpwi cr0, r6, 0 bne cr0, LBB1_3 ; endif to this: rlwinm r6, r2, 0, 31, 31 cmpwi cr0, r6, 0 beq cr0, LBB1_3 ; endif llvm-svn: 26047
* Back out previous commit, it isn't safe.Nate Begeman2006-02-051-6/+0
| | | | llvm-svn: 26006
* fold c1 << (x + c2) into (c1 << c2) << x. fix a warning.Nate Begeman2006-02-051-1/+7
| | | | llvm-svn: 26005
* Handle urem by shifted powers of 2.Nate Begeman2006-02-051-4/+15
| | | | llvm-svn: 26001
* handle combining A / (B << N) into A >>u (log2(B)+N) when B is a power of 2Nate Begeman2006-02-051-2/+13
| | | | llvm-svn: 26000
* * Added SDNode::isOnlyUse().Evan Cheng2006-02-051-3/+18
| | | | | | * Fix hasNUsesOfValue(), it should be const. llvm-svn: 25990
* Fix VC++ warning.Jeff Cohen2006-02-041-1/+0
| | | | llvm-svn: 25975
* Get rid of some memory leaks identified by ValgrindEvan Cheng2006-02-042-2/+9
| | | | llvm-svn: 25960
* Add initial support for immediates. This allows us to compile this:Chris Lattner2006-02-042-6/+16
| | | | | | | | | | | | | | | | | | int %rlwnm(int %A, int %B) { %C = call int asm "rlwnm $0, $1, $2, $3, $4", "=r,r,r,n,n"(int %A, int %B, int 4, int 17) ret int %C } into: _rlwnm: or r2, r3, r3 or r3, r4, r4 rlwnm r2, r2, r3, 4, 17 ;; note the immediates :) or r3, r2, r2 blr llvm-svn: 25955
* Initial early support for non-register operands, like immediatesChris Lattner2006-02-041-15/+42
| | | | llvm-svn: 25952
* Add a framework for eliminating instructions that produces undemanded bits.Nate Begeman2006-02-031-10/+30
| | | | llvm-svn: 25945
* remove some #ifdef'd out code, which should properly be in the dag combiner ↵Chris Lattner2006-02-031-30/+0
| | | | | | anyway. llvm-svn: 25941
* remove dead fnChris Lattner2006-02-031-11/+0
| | | | llvm-svn: 25935
* Add common code for reassociating ops in the dag combinerNate Begeman2006-02-031-50/+55
| | | | llvm-svn: 25934
* Added case HANDLENODE to getOperationName().Evan Cheng2006-02-031-0/+1
| | | | llvm-svn: 25920
* Turn any_extend nodes into zero_extend nodes when it allows us to remove anChris Lattner2006-02-021-0/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | and instruction. This allows us to compile stuff like this: bool %X(int %X) { %Y = add int %X, 14 %Z = setne int %Y, 12345 ret bool %Z } to this: _X: cmpl $12331, 4(%esp) setne %al movzbl %al, %eax ret instead of this: _X: cmpl $12331, 4(%esp) setne %al movzbl %al, %eax andl $1, %eax ret This occurs quite a bit with the X86 backend. For example, 25 times in lambda, 30 times in 177.mesa, 14 times in galgel, 70 times in fma3d, 25 times in vpr, several hundred times in gcc, ~45 times in crafty, ~60 times in parser, ~140 times in eon, 110 times in perlbmk, 55 on gap, 16 times on bzip2, 14 times on twolf, and 1-2 times in many other SPEC2K programs. llvm-svn: 25901
* add two dag combines:Chris Lattner2006-02-021-8/+25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | (C1-X) == C2 --> X == C1-C2 (X+C1) == C2 --> X == C2-C1 This allows us to compile this: bool %X(int %X) { %Y = add int %X, 14 %Z = setne int %Y, 12345 ret bool %Z } into this: _X: cmpl $12331, 4(%esp) setne %al movzbl %al, %eax andl $1, %eax ret not this: _X: movl $14, %eax addl 4(%esp), %eax cmpl $12345, %eax setne %al movzbl %al, %eax andl $1, %eax ret Testcase here: Regression/CodeGen/X86/compare-add.ll nukage of the and coming up next. llvm-svn: 25898
* make -debug output less newlineyChris Lattner2006-02-021-2/+1
| | | | llvm-svn: 25895
* Implement matching constraints. We can now say things like this:Chris Lattner2006-02-021-15/+28
| | | | | | | | | | | | | | %C = call int asm "xyz $0, $1, $2, $3", "=r,r,r,0"(int %A, int %B, int 4) and get: xyz r2, r3, r4, r2 note that the r2's are pinned together. Yaay for 2-address instructions. 2342 ---------------------------------------------------------------------- llvm-svn: 25893
* *** empty log message ***Nate Begeman2006-02-011-0/+1
| | | | llvm-svn: 25879
* Implement simple register assignment for inline asms. This allows us to ↵Chris Lattner2006-02-011-8/+103
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | compile: int %test(int %A, int %B) { %C = call int asm "xyz $0, $1, $2", "=r,r,r"(int %A, int %B) ret int %C } into: (0x8906130, LLVM BB @0x8902220): %r2 = OR4 %r3, %r3 %r3 = OR4 %r4, %r4 INLINEASM <es:xyz $0, $1, $2>, %r2<def>, %r2, %r3 %r3 = OR4 %r2, %r2 BLR which asmprints as: _test: or r2, r3, r3 or r3, r4, r4 xyz $0, $1, $2 ;; need to print the operands now :) or r3, r2, r2 blr llvm-svn: 25878
* Fix some of the stuff in the PPC README file, and clean up legalizationNate Begeman2006-02-012-222/+254
| | | | | | of the SELECT_CC, BR_CC, and BRTWOWAY_CC nodes. llvm-svn: 25875
* adjust to changes in InlineAsm interface. Fix a few minor bugs.Chris Lattner2006-02-011-32/+38
| | | | llvm-svn: 25865
* Allow the specification of explicit alignments for constant pool entries.Evan Cheng2006-01-312-9/+16
| | | | llvm-svn: 25855
* Allow custom lowering of fabs. I forgot to check in this change whichEvan Cheng2006-01-311-1/+6
| | | | | | caused several test failures. llvm-svn: 25852
* Only insert an AND when converting from BR_COND to BRCC if needed.Chris Lattner2006-01-311-1/+3
| | | | llvm-svn: 25832
* Handle physreg input/outputs. We now compile this:Chris Lattner2006-01-312-4/+97
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | int %test_cpuid(int %op) { %B = alloca int %C = alloca int %D = alloca int %A = call int asm "cpuid", "=eax,==ebx,==ecx,==edx,eax"(int* %B, int* %C, int* %D, int %op) %Bv = load int* %B %Cv = load int* %C %Dv = load int* %D %x = add int %A, %Bv %y = add int %x, %Cv %z = add int %y, %Dv ret int %z } to this: _test_cpuid: sub %ESP, 16 mov DWORD PTR [%ESP], %EBX mov %EAX, DWORD PTR [%ESP + 20] cpuid mov DWORD PTR [%ESP + 8], %ECX mov DWORD PTR [%ESP + 12], %EBX mov DWORD PTR [%ESP + 4], %EDX mov %ECX, DWORD PTR [%ESP + 12] add %EAX, %ECX mov %ECX, DWORD PTR [%ESP + 8] add %EAX, %ECX mov %ECX, DWORD PTR [%ESP + 4] add %EAX, %ECX mov %EBX, DWORD PTR [%ESP] add %ESP, 16 ret ... note the proper register allocation. :) it is unclear to me why the loads aren't folded into the adds. llvm-svn: 25827
* Fix a bug in my legalizer reworking that caused the X86 backend to not getChris Lattner2006-01-301-2/+1
| | | | | | | a chance to custom legalize setcc, which broke a bunch of C++ Codes. Testcase here: CodeGen/X86/2006-01-30-LongSetcc.ll llvm-svn: 25821
* don't insert an and node if it isn't needed here, this can prevent foldingChris Lattner2006-01-301-1/+3
| | | | | | of lowered target nodes. llvm-svn: 25804
* Move MaskedValueIsZero from the DAGCombiner to the TargetLowering ↵Chris Lattner2006-01-301-120/+21
| | | | | | interface,making isMaskedValueZeroForTargetNode simpler, and useable from other partsof the compiler. llvm-svn: 25803
* pass the address of MaskedValueIsZero into isMaskedValueZeroForTargetNode,Chris Lattner2006-01-301-1/+1
| | | | | | to permit recursion llvm-svn: 25799
* Fix RET of promoted values on targets that custom expand RET to a target node.Chris Lattner2006-01-291-8/+9
| | | | llvm-svn: 25794
* cleanups to the ValueTypeActions interfaceChris Lattner2006-01-291-7/+5
| | | | llvm-svn: 25785
* Remove some special case hacks for CALLSEQ_*, using UpdateNodeOperandsChris Lattner2006-01-292-60/+27
| | | | | | instead. llvm-svn: 25780
* Allow custom expansion of ConstantVec nodes. PPC will use this in the future.Chris Lattner2006-01-291-22/+35
| | | | llvm-svn: 25774
* Legalize ConstantFP into TargetConstantFP when the target allows. ImplementChris Lattner2006-01-292-2/+39
| | | | | | custom expansion of ConstantFP nodes. llvm-svn: 25772
* eliminate uses of SelectionDAG::getBR2Way_CCChris Lattner2006-01-292-9/+24
| | | | llvm-svn: 25767
* Use the new "UpdateNodeOperands" method to simplify LegalizeDAG and make itChris Lattner2006-01-281-317/+194
| | | | | | | | | | | | | | faster. This cuts about 120 lines of code out of the legalizer (mostly code checking to see if operands have changed). It also fixes an ugly performance issue, where the legalizer cloned the entire graph after any change. Now the "UpdateNodeOperands" method gives it a chance to reuse nodes if the operands of a node change but not its opcode or valuetypes. This speeds up instruction selection time on kimwitu++ by about 8.2% with a release build. llvm-svn: 25746
* add another method variantChris Lattner2006-01-281-3/+18
| | | | llvm-svn: 25744
* add some methods for updating nodesChris Lattner2006-01-281-0/+234
| | | | llvm-svn: 25742
* minor tweaksChris Lattner2006-01-281-21/+21
| | | | llvm-svn: 25740
* move a bunch of code, no other change.Chris Lattner2006-01-281-326/+324
| | | | llvm-svn: 25739
* remove a couple more now-extraneous legalizeop'sChris Lattner2006-01-281-9/+5
| | | | llvm-svn: 25738
* fix a bugChris Lattner2006-01-281-2/+1
| | | | llvm-svn: 25737
* Several major changes:Chris Lattner2006-01-281-764/+488
| | | | | | | | | | | 1. Pull out the expand cases for BSWAP and CT* into a separate function, reducing the size of LegalizeOp. 2. Fix a bug where expand(bswap i64) was wrong when i64 is legal. 3. Changed LegalizeOp/PromoteOp so that the legalizer never needs to be iterative. It now operates in a single pass over the nodes. 4. Simplify a LOT of code, with a net reduction of ~280 lines. llvm-svn: 25736
* Eliminate the need for ExpandOp to set 'needsanotheriteration', as it alreadyChris Lattner2006-01-281-131/+80
| | | | | | | | | | | relegalizes the stuff it returns. Add the ability to custom expand ADD/SUB, so that targets don't need to deal with ADD_PARTS/SUB_PARTS if they don't want. Fix some obscure potential bugs and simplify code. llvm-svn: 25732
* Instead of making callers of ExpandLibCall legalize the result, makeChris Lattner2006-01-281-6/+7
| | | | | | ExpandLibCall do it itself. llvm-svn: 25731
OpenPOWER on IntegriCloud