| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
| |
llvm-svn: 11955
|
| |
|
|
| |
llvm-svn: 11954
|
| |
|
|
|
|
| |
Do not just inject a new prototype.
llvm-svn: 11951
|
| |
|
|
|
|
| |
operands. The X86 backend doesn't handle them properly right now.
llvm-svn: 11944
|
| |
|
|
|
|
|
| |
Create a new AddUsesToWorkList method
optimize memmove/set/cpy of zero bytes to a noop.
llvm-svn: 11941
|
| |
|
|
| |
llvm-svn: 11940
|
| |
|
|
| |
llvm-svn: 11939
|
| |
|
|
|
|
|
| |
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 new function, taking care of inputs and outputs.
llvm-svn: 11935
|
| |
|
|
| |
llvm-svn: 11933
|
| |
|
|
| |
llvm-svn: 11932
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
| |
|
|
| |
llvm-svn: 11930
|
| |
|
|
| |
llvm-svn: 11929
|
| |
|
|
| |
llvm-svn: 11928
|
| |
|
|
| |
llvm-svn: 11927
|
| |
|
|
|
|
| |
instructions.
llvm-svn: 11923
|
| |
|
|
|
|
| |
them so that they are consistent with AND, XOR, etc...
llvm-svn: 11922
|
| |
|
|
| |
llvm-svn: 11921
|
| |
|
|
| |
llvm-svn: 11919
|
| |
|
|
| |
llvm-svn: 11913
|
| |
|
|
|
|
| |
instructions.
llvm-svn: 11907
|
| |
|
|
| |
llvm-svn: 11905
|
| |
|
|
| |
llvm-svn: 11903
|
| |
|
|
|
|
|
| |
consistent with the rest and also pepare for the addition of their
memory operand variants.
llvm-svn: 11902
|
| |
|
|
|
|
|
| |
This is a really minor thing, but might help out the 'switch statement induction'
code in simplifycfg.
llvm-svn: 11900
|
| |
|
|
| |
llvm-svn: 11898
|
| |
|
|
|
|
| |
that they are as far away from the loads as possible.
llvm-svn: 11895
|
| |
|
|
|
|
| |
MRegisterInfo::isPhysicalRegister().
llvm-svn: 11894
|
| |
|
|
| |
llvm-svn: 11892
|
| |
|
|
|
|
|
|
|
| |
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
|
| |
|
|
|
|
| |
are beastly ConstantPointerRefs in the way...
llvm-svn: 11883
|
| |
|
|
|
|
|
| |
MRegisterInfo::is{Physical,Virtual}Register. Apply appropriate fixes
to relevant files.
llvm-svn: 11882
|
| |
|
|
|
|
|
| |
multiple type names for the same structural type. Make DTE eliminate all
but one of the type names
llvm-svn: 11879
|
| |
|
|
| |
llvm-svn: 11875
|
| |
|
|
| |
llvm-svn: 11872
|
| |
|
|
|
|
| |
having the compiler emit RTTI and vtables to EVERY translation unit.
llvm-svn: 11871
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
| |
|
|
| |
llvm-svn: 11868
|
| |
|
|
| |
llvm-svn: 11864
|
| |
|
|
|
|
| |
not have any globals.
llvm-svn: 11863
|
| |
|
|
| |
llvm-svn: 11862
|
| |
|
|
|
|
| |
bugs. Thanks Brian!
llvm-svn: 11859
|
| |
|
|
| |
llvm-svn: 11858
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
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
|
| |
|
|
|
|
| |
local graph that uses the global.
llvm-svn: 11850
|
| |
|
|
|
|
| |
MRegisterInfo::is{Physical,Virtual}Register.
llvm-svn: 11849
|
| |
|
|
|
|
|
|
|
|
| |
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
|
| |
|
|
| |
llvm-svn: 11847
|
| |
|
|
| |
llvm-svn: 11846
|