| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
| |
llvm-svn: 20293
|
| |
|
|
|
|
| |
actually doing modulo scheduling! :)
llvm-svn: 20292
|
| |
|
|
| |
llvm-svn: 20290
|
| |
|
|
| |
llvm-svn: 20289
|
| |
|
|
| |
llvm-svn: 20288
|
| |
|
|
|
|
| |
this reduces the time for -simplifycfg in a debug build from 106s to 14.82s
llvm-svn: 20286
|
| |
|
|
| |
llvm-svn: 20284
|
| |
|
|
|
|
| |
information.
llvm-svn: 20280
|
| |
|
|
| |
llvm-svn: 20278
|
| |
|
|
| |
llvm-svn: 20277
|
| |
|
|
| |
llvm-svn: 20276
|
| |
|
|
| |
llvm-svn: 20274
|
| |
|
|
| |
llvm-svn: 20273
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Changing 'op' here caused us to not enter the store into a map, causing
reemission of the code!! In practice, a simple loop like this:
no_exit: ; preds = %no_exit, %entry
%indvar = phi uint [ %indvar.next, %no_exit ], [ 0, %entry ] ; <uint> [#uses=3]
%tmp.4 = getelementptr "complex long double"* %P, uint %indvar, uint 0 ; <double*> [#uses=1]
store double 0.000000e+00, double* %tmp.4
%indvar.next = add uint %indvar, 1 ; <uint> [#uses=2]
%exitcond = seteq uint %indvar.next, %N ; <bool> [#uses=1]
br bool %exitcond, label %return, label %no_exit
was being code gen'd to:
.LBBtest_1: # no_exit
movl %edx, %esi
shll $4, %esi
movl $0, 4(%eax,%esi)
movl $0, (%eax,%esi)
incl %edx
movl $0, (%eax,%esi)
movl $0, 4(%eax,%esi)
cmpl %ecx, %edx
jne .LBBtest_1 # no_exit
Note that we are doing 4 32-bit stores instead of 2. Now we generate:
.LBBtest_1: # no_exit
movl %edx, %esi
incl %esi
shll $4, %edx
movl $0, (%eax,%edx)
movl $0, 4(%eax,%edx)
cmpl %ecx, %esi
movl %esi, %edx
jne .LBBtest_1 # no_exit
This is much happier, though it would be even better if the increment of ESI
was scheduled after the compare :-/
llvm-svn: 20265
|
| |
|
|
| |
llvm-svn: 20264
|
| |
|
|
|
|
| |
ANY program that does not have all functions internalized.
llvm-svn: 20258
|
| |
|
|
| |
llvm-svn: 20256
|
| |
|
|
| |
llvm-svn: 20255
|
| |
|
|
| |
llvm-svn: 20253
|
| |
|
|
|
|
|
| |
WARNING: Type conflict between types named 'union.._604.'.
Src=' %union.._604.'.
Dest=' %union.._604.'
llvm-svn: 20252
|
| |
|
|
| |
llvm-svn: 20243
|
| |
|
|
| |
llvm-svn: 20237
|
| |
|
|
| |
llvm-svn: 20232
|
| |
|
|
| |
llvm-svn: 20231
|
| |
|
|
|
|
| |
for 0.0 and -0.0.
llvm-svn: 20230
|
| |
|
|
|
|
| |
folding of argument loads with instructions that are not in the entry block.
llvm-svn: 20228
|
| |
|
|
|
|
|
|
|
|
|
|
| |
and handle incomplete control dependences correctly. This fixes:
Regression/Transforms/ADCE/dead-phi-edge.ll
-> a missed optimization
Regression/Transforms/ADCE/dead-phi-edge.ll
-> a compiler crash distilled from QT4
llvm-svn: 20227
|
| |
|
|
|
|
|
|
| |
Regression/Transforms/IndVarsSimplify/2005-02-17-TruncateExprCrash.ll
and PR515.
llvm-svn: 20224
|
| |
|
|
| |
llvm-svn: 20208
|
| |
|
|
| |
llvm-svn: 20207
|
| |
|
|
|
|
| |
for the suggestion! :)
llvm-svn: 20203
|
| |
|
|
| |
llvm-svn: 20202
|
| |
|
|
| |
llvm-svn: 20201
|
| |
|
|
|
|
|
|
|
|
| |
handling zero length files a little more intelligently. If both files are
zero length then we return 0 (true) indicating a match. If only one of the
files is zero length then we return 1 (false) indicating that the files
differ. If the files don't agree in length then they can't match so we
skip the first loop that looks for a quick match.
llvm-svn: 20200
|
| |
|
|
|
|
|
|
| |
to save and restore the LR register on entry and exit of a leaf function
that needed to access globals or the constant pool. This should hopefully
fix oscar from sending the PPC tester spinning out of control.
llvm-svn: 20197
|
| |
|
|
| |
llvm-svn: 20195
|
| |
|
|
| |
llvm-svn: 20194
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
void %test(int** %P) {
%A = volatile load int** %P
ret void
}
void %test2(int*** %Q) {
%P = load int*** %Q
volatile store int** %P, int*** %Q
ret void
}
instead of emitting:
void test(int **l1_P) {
int *l2_A;
l2_A = (int **((volatile int **)l1_P));
return;
}
void test2(int ***l2_Q) {
int **l1_P;
l1_P = *l2_Q;
*((volatile int ***)l2_Q) = l1_P;
return;
}
... which is loading/storing volatile pointers, not through volatile pointers,
emit this (which is right):
void test(int **l1_P) {
int *l3_A;
l3_A = *((int * volatile*)l1_P);
return;
}
void test2(int ***l2_Q) {
int **l1_P;
l1_P = *l2_Q;
*((int ** volatile*)l2_Q) = l1_P;
return;
}
llvm-svn: 20191
|
| |
|
|
| |
llvm-svn: 20184
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
prints:
getelementptr (int* %A, int -1)
as: "(A) - 4" instead of "(A) + 18446744073709551612", which makes the
assembler much happier.
This fixes test/Regression/CodeGen/X86/2005-02-14-IllegalAssembler.ll,
and Benchmarks/Prolangs-C/cdecl with LLC on X86.
llvm-svn: 20183
|
| |
|
|
| |
llvm-svn: 20181
|
| |
|
|
|
|
| |
printing help output or version info.
llvm-svn: 20180
|
| |
|
|
| |
llvm-svn: 20179
|
| |
|
|
|
|
| |
Volatile loads and stores need to emit volatile pointer operations in C.
llvm-svn: 20177
|
| |
|
|
| |
llvm-svn: 20172
|
| |
|
|
| |
llvm-svn: 20170
|
| |
|
|
| |
llvm-svn: 20168
|
| |
|
|
|
|
| |
This causes garbage to be printed out after error messages.
llvm-svn: 20165
|
| |
|
|
|
|
|
|
| |
both cases they are looking for non-external variables/functions that do
not have internal linkage. Using "!isExternal()" is a little more
understandable than "hasInitializer()"
llvm-svn: 20155
|
| |
|
|
| |
llvm-svn: 20154
|