- Feb 27, 2004
-
-
Chris Lattner authored
llvm-svn: 11919
-
John Criswell authored
llvm-svn: 11915
-
Chris Lattner authored
llvm-svn: 11913
-
Chris Lattner authored
llvm-svn: 11912
-
Chris Lattner authored
llvm-svn: 11911
-
Chris Lattner authored
llvm-svn: 11908
-
Alkis Evlogimenos authored
instructions. llvm-svn: 11907
-
Alkis Evlogimenos authored
each MachineOperand. We don't really need an int64_t immediate :-). llvm-svn: 11906
-
Alkis Evlogimenos authored
llvm-svn: 11905
-
Alkis Evlogimenos authored
llvm-svn: 11903
-
Alkis Evlogimenos authored
consistent with the rest and also pepare for the addition of their memory operand variants. llvm-svn: 11902
-
Chris Lattner authored
llvm-svn: 11901
-
Chris Lattner authored
This is a really minor thing, but might help out the 'switch statement induction' code in simplifycfg. llvm-svn: 11900
-
Chris Lattner authored
llvm-svn: 11899
-
Alkis Evlogimenos authored
llvm-svn: 11898
-
Alkis Evlogimenos authored
llvm-svn: 11896
-
Alkis Evlogimenos authored
that they are as far away from the loads as possible. llvm-svn: 11895
-
Alkis Evlogimenos authored
MRegisterInfo::isPhysicalRegister(). llvm-svn: 11894
-
Alkis Evlogimenos authored
llvm-svn: 11892
-
Misha Brukman authored
llvm-svn: 11891
-
Misha Brukman authored
llvm-svn: 11890
-
John Criswell authored
llvm-svn: 11889
-
John Criswell authored
Made removing the object files a separate sh command so that it can easily be commented out. llvm-svn: 11888
-
John Criswell authored
llvm-svn: 11887
-
- Feb 26, 2004
-
-
John Criswell authored
Oops. llvm-svn: 11886
-
John Criswell authored
2004-02-26-FPNotPrintableConstants.llx ensures that constants used in an LLVM program are declared static if they are assigned to global variables. 2004-02-26-LinkOnceFunctions.llx ensures that linkonce functions get the weak attribute. llvm-svn: 11885
-
John Criswell authored
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
-
Chris Lattner authored
are beastly ConstantPointerRefs in the way... llvm-svn: 11883
-
Alkis Evlogimenos authored
MRegisterInfo::is{Physical,Virtual}Register. Apply appropriate fixes to relevant files. llvm-svn: 11882
-
John Criswell authored
llvm-svn: 11881
-
Chris Lattner authored
multiple type names for the same structural type. Make DTE eliminate all but one of the type names llvm-svn: 11879
-
Chris Lattner authored
all dynamically allocated LLVM values 4 bytes smaller, eliminate some vtables, and make Value's destructor faster. This makes Function derive from Annotation now because it is the only core LLVM class that still has an annotation stuck onto it: MachineFunction. MachineFunction is obviously horrible and gross (like most other annotations), but will be the subject of refactorings later in the future. Besides many fewer Function objects are dynamically allocated that instructions blocks, constants, types, etc... :) llvm-svn: 11878
-
Chris Lattner authored
llvm-svn: 11876
-
Chris Lattner authored
llvm-svn: 11875
-
Chris Lattner authored
llvm-svn: 11874
-
Chris Lattner authored
llvm-svn: 11873
-
Chris Lattner authored
llvm-svn: 11872
-
Chris Lattner authored
having the compiler emit RTTI and vtables to EVERY translation unit. llvm-svn: 11871
-
Chris Lattner authored
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
-
Chris Lattner authored
llvm-svn: 11868
-