summaryrefslogtreecommitdiffstats
path: root/llvm/lib
Commit message (Collapse)AuthorAgeFilesLines
...
* Bring this directory into "it actually compiles" landChris Lattner2004-02-284-8/+20
| | | | llvm-svn: 11955
* Fix multiple inclusion problemChris Lattner2004-02-281-3/+0
| | | | llvm-svn: 11954
* if there is already a prototype for malloc/free, use it, even if it's incorrect.Chris Lattner2004-02-281-10/+42
| | | | | | Do not just inject a new prototype. llvm-svn: 11951
* Do not generate instructions with mismatched memory/immediate sizedAlkis Evlogimenos2004-02-283-35/+39
| | | | | | operands. The X86 backend doesn't handle them properly right now. llvm-svn: 11944
* Rename AddUsesToWorkList -> AddUsersToWorkList, as that is what it does.Chris Lattner2004-02-281-19/+54
| | | | | | | Create a new AddUsesToWorkList method optimize memmove/set/cpy of zero bytes to a noop. llvm-svn: 11941
* Turn 'free null' into nothingChris Lattner2004-02-281-0/+8
| | | | llvm-svn: 11940
* 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
* Further comment updates.Alkis Evlogimenos2004-02-281-4/+4
| | | | llvm-svn: 11933
* Update comments.Alkis Evlogimenos2004-02-281-9/+9
| | | | llvm-svn: 11932
* My previous commit broke the jit. The shift instructions always takeAlkis Evlogimenos2004-02-281-16/+16
| | | | | | | | | | | | | | | | an 8-bit immediate. So mark the shifts that take immediates as taking an 8-bit argument. The rest with the implicit use of CL are marked appropriately. A bug still exists: def SHLDmri32 : I2A8 <"shld", 0xA4, MRMDestMem>, TB; // [mem32] <<= [mem32],R32 imm8 The immediate in the above instruction is 8-bit but the memory reference is 32-bit. The printer prints this as an 8-bit reference which confuses the assembler. Same with SHRDmri32. llvm-svn: 11931
* Turn off the SparcV9MachineCodeDestructionPass for now, because it's buggyBrian Gaeke2004-02-271-1/+6
| | | | llvm-svn: 11930
* Correct DestroyMachineFunction's getPassNameBrian Gaeke2004-02-271-1/+1
| | | | llvm-svn: 11929
* Only clone global nodes between graphs if both graphs have the global.Chris Lattner2004-02-272-13/+9
| | | | llvm-svn: 11928
* ADD MORE FUNCTIONS!Chris Lattner2004-02-271-14/+20
| | | | llvm-svn: 11927
* Fix argument size for SHL, SHR, SAR, SHLD and SHRD families ofAlkis Evlogimenos2004-02-271-34/+34
| | | | | | instructions. llvm-svn: 11923
* Fix encoding of ADD and SUB family of instructions. Also rearrangeAlkis Evlogimenos2004-02-271-22/+24
| | | | | | them so that they are consistent with AND, XOR, etc... llvm-svn: 11922
* Rename MRMS[0-7]{r,m} to MRM[0-7]{r,m}.Alkis Evlogimenos2004-02-274-215/+215
| | | | llvm-svn: 11921
* setcond instructions don't have aliasing implications.Chris Lattner2004-02-271-2/+2
| | | | llvm-svn: 11919
* Fix Regression/Assembler/2004-02-27-SelfUseAssertError.llChris Lattner2004-02-271-1/+2
| | | | llvm-svn: 11913
* Add memory operand folding support for the SETcc family ofAlkis Evlogimenos2004-02-272-0/+25
| | | | | | instructions. llvm-svn: 11907
* Add memory operand folding support for SHLD and SHRD instructions.Alkis Evlogimenos2004-02-272-0/+15
| | | | llvm-svn: 11905
* Add memory operand folding support for SHL, SHR and SAR, SHLD instructions.Alkis Evlogimenos2004-02-272-0/+39
| | | | llvm-svn: 11903
* Rename SHL, SHR, SAR, SHLD and SHLR instructions to make themAlkis Evlogimenos2004-02-272-25/+28
| | | | | | | consistent with the rest and also pepare for the addition of their memory operand variants. llvm-svn: 11902
* Implement test/Regression/Transforms/InstCombine/canonicalize_branch.llChris Lattner2004-02-271-1/+23
| | | | | | | This is a really minor thing, but might help out the 'switch statement induction' code in simplifycfg. llvm-svn: 11900
* Rename member function to be consistent with the rest.Alkis Evlogimenos2004-02-272-4/+4
| | | | llvm-svn: 11898
* Make spiller push stores right after the definition of a register soAlkis Evlogimenos2004-02-271-8/+33
| | | | | | that they are as far away from the loads as possible. llvm-svn: 11895
* Fix crash caused by passing register 0 toAlkis Evlogimenos2004-02-271-1/+1
| | | | | | MRegisterInfo::isPhysicalRegister(). llvm-svn: 11894
* Clear maps right after basic block is processed.Alkis Evlogimenos2004-02-261-4/+4
| | | | llvm-svn: 11892
* Fixes for PR258 and PR259.John Criswell2004-02-261-3/+3
| | | | | | | | | Functions with linkonce linkage are declared with weak linkage. Global floating point constants used to represent unprintable values (such as NaN and infinity) are declared static so that they don't interfere with other CBE generated translation units. llvm-svn: 11884
* Be a good little compiler and handle direct calls efficiently, even if thereChris Lattner2004-02-261-10/+13
| | | | | | are beastly ConstantPointerRefs in the way... llvm-svn: 11883
* Uncomment assertions that register# != 0 on calls toAlkis Evlogimenos2004-02-264-21/+28
| | | | | | | MRegisterInfo::is{Physical,Virtual}Register. Apply appropriate fixes to relevant files. llvm-svn: 11882
* Since LLVM uses structure type equivalence, it isn't useful to keep aroundChris Lattner2004-02-261-10/+11
| | | | | | | multiple type names for the same structural type. Make DTE eliminate all but one of the type names llvm-svn: 11879
* Use a map instead of annotationsChris Lattner2004-02-261-23/+36
| | | | llvm-svn: 11875
* remove obsolete commentChris Lattner2004-02-261-1/+1
| | | | llvm-svn: 11872
* Make sure that at least one virtual method is defined in a .cpp file to avoidChris Lattner2004-02-262-1/+13
| | | | | | having the compiler emit RTTI and vtables to EVERY translation unit. llvm-svn: 11871
* 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
* No need to clear the map here, it will always be emptyChris Lattner2004-02-261-1/+0
| | | | llvm-svn: 11868
* Fix typoChris Lattner2004-02-261-1/+1
| | | | llvm-svn: 11864
* The node doesn't have to be _no_ node flags, it just has to be complete andChris Lattner2004-02-261-2/+3
| | | | | | not have any globals. llvm-svn: 11863
* Add _more_ functionsChris Lattner2004-02-261-3/+20
| | | | llvm-svn: 11862
* Fix some warnings, some of which were spurious, and some of which were realChris Lattner2004-02-261-6/+6
| | | | | | bugs. Thanks Brian! llvm-svn: 11859
* Instructions to call and return from functions.Misha Brukman2004-02-261-1/+25
| | | | llvm-svn: 11858
* Two changes:Chris Lattner2004-02-251-1/+4
| | | | | | | | | | | | | 1. Functions do not make things incomplete, only variables 2. Constant global variables no longer need to be marked incomplete, because we are guaranteed that the initializer for the global will be in the graph we are hacking on now. This makes resolution of indirect calls happen a lot more in the bu pass, supports things like vtables and the C counterparts (giant constant arrays of function pointers), etc... Testcase here: test/Regression/Analysis/DSGraph/constant_globals.ll llvm-svn: 11852
* When building local graphs, clone the initializer for constant globals into eachChris Lattner2004-02-251-7/+21
| | | | | | local graph that uses the global. llvm-svn: 11850
* Fix bugs found with recent addition of assertions inAlkis Evlogimenos2004-02-251-2/+2
| | | | | | MRegisterInfo::is{Physical,Virtual}Register. llvm-svn: 11849
* Simplify the dead node elimination stuffChris Lattner2004-02-251-10/+12
| | | | | | | | | | Make the incompleteness marker faster by looping directly over the globals instead of over the scalars to find the globals Fix a bug where we didn't mark a global incomplete if it didn't have any outgoing edges. This wouldn't break any current clients but is still wrong. llvm-svn: 11848
* Add a bunch more functionsChris Lattner2004-02-251-8/+55
| | | | llvm-svn: 11847
* Try harder to get symbol infoChris Lattner2004-02-251-0/+3
| | | | llvm-svn: 11846
OpenPOWER on IntegriCloud