|  | Commit message (Collapse) | Author | Age | Files | Lines | 
|---|
| | 
| 
| 
| 
| 
| 
| 
| | because gccas runs globalopt before inlining.
This implements ctor-list-opt.ll:CTOR7
llvm-svn: 23462 | 
| | 
| 
| 
| | llvm-svn: 23460 | 
| | 
| 
| 
| 
| 
| | eh lowering as well.
llvm-svn: 23459 | 
| | 
| 
| 
| | llvm-svn: 23458 | 
| | 
| 
| 
| 
| 
| 
| 
| | for testing and will require target machine info to do a proper scheduling.
The simple scheduler can be turned on using -sched=simple (defaults
to -sched=none)
llvm-svn: 23455 | 
| | 
| 
| 
| | llvm-svn: 23453 | 
| | 
| 
| 
| | llvm-svn: 23452 | 
| | 
| 
| 
| | llvm-svn: 23450 | 
| | 
| 
| 
| 
| 
| | ctor-list-opt.ll:CTOR5.
llvm-svn: 23449 | 
| | 
| 
| 
| | llvm-svn: 23447 | 
| | 
| 
| 
| 
| 
| | ConstantFoldLoadThroughGEPConstantExpr function in the utils lib.
llvm-svn: 23446 | 
| | 
| 
| 
| 
| 
| | as ConstantFoldLoadThroughGEPConstantExpr.
llvm-svn: 23445 | 
| | 
| 
| 
| 
| 
| | pass.
llvm-svn: 23444 | 
| | 
| 
| 
| | llvm-svn: 23442 | 
| | 
| 
| 
| | llvm-svn: 23441 | 
| | 
| 
| 
| | llvm-svn: 23439 | 
| | 
| 
| 
| 
| 
| | global ctors that are simple enough.  This implements ctor-list-opt.ll:CTOR2.
llvm-svn: 23437 | 
| | 
| 
| 
| 
| 
| | functionality change.
llvm-svn: 23435 | 
| | 
| 
| 
| 
| 
| | accepting the null even with a non-65535 init prio
llvm-svn: 23434 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | Implement the start of global ctor optimization.  It is currently smart
enough to remove the global ctor for cases like this:
struct foo {
  foo() {}
} x;
... saving a bit of startup time for the program.
llvm-svn: 23433 | 
| | 
| 
| 
| 
| 
| | SimplifyLibCalls/2005-05-20-sprintf-crash.ll
llvm-svn: 23430 | 
| | 
| 
| 
| 
| 
| | Match a bunch of idioms for sign extensions, implementing InstCombine/signext.ll
llvm-svn: 23428 | 
| | 
| 
| 
| 
| 
| 
| 
| | sprintf("%s", P)'s that have uses.
s/hasNUses(0)/use_empty()/
llvm-svn: 23425 | 
| | 
| 
| 
| 
| 
| | prefix to a symbol name
llvm-svn: 23421 | 
| | 
| 
| 
| 
| 
| | generated isel now tries li then lis, then lis+ori.
llvm-svn: 23418 | 
| | 
| 
| 
| | llvm-svn: 23411 | 
| | 
| 
| 
| 
| 
| 
| | This implements SimplifyCFG/branch-fold.ll, and is useful on ?:/min/max heavy
code
llvm-svn: 23410 | 
| | 
| 
| 
| | llvm-svn: 23408 | 
| | 
| 
| 
| | llvm-svn: 23407 | 
| | 
| 
| 
| 
| 
| 
| | an llvm-ranlib symtab.  This speeds up gccld -native on an almost empty .o file
from 1.63s to 0.18s.
llvm-svn: 23406 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| | This happens all the time on PPC for bool values, e.g. eliminating a xori
in inverted-bool-compares.ll.
This should be added to the dag combiner as well.
llvm-svn: 23403 | 
| | 
| 
| 
| | llvm-svn: 23400 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| | not define a value that is used outside of it's block.  This catches many
more simplifications, e.g. 854 in 176.gcc, 137 in vpr, etc.
This implements branch-phi-thread.ll:test3.ll
llvm-svn: 23397 | 
| | 
| 
| 
| 
| 
| | predecessors.  This implements branch-phi-thread.ll::test1
llvm-svn: 23395 | 
| | 
| 
| 
| | llvm-svn: 23393 | 
| | 
| 
| 
| | llvm-svn: 23392 | 
| | 
| 
| 
| 
| 
| 
| | control across branches with determined outcomes.  More generality to follow.
This triggers a couple thousand times in specint.
llvm-svn: 23391 | 
| | 
| 
| 
| 
| 
| 
| | select_cc bits and then wrap it in a convenience function for  use with
regular select.
llvm-svn: 23389 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | when possible, avoiding the load (and avoiding the copy if the value is already
in the right register).
This patch came about when I noticed code like the following being generated:
  store R17 -> [SS1]
  ...blah...
  R4 = load [SS1]
This was causing an LSU reject on the G5.  This problem was due to the register
allocator folding spill code into a reg-reg copy (producing the load), which
prevented the spiller from being able to rewrite the load into a copy, despite
the fact that the value was already available in a register.  In the case
above, we now rip out the R4 load and replace it with a R4 = R17 copy.
This speeds up several programs on X86 (which spills a lot :) ), e.g.
smg2k from 22.39->20.60s, povray from 12.93->12.66s, 168.wupwise from
68.54->53.83s (!), 197.parser from 7.33->6.62s (!), etc.  This may have a larger
impact in some cases on the G5 (by avoiding LSU rejects), though it probably
won't trigger as often (less spilling in general).
Targets that implement folding of loads/stores into copies should implement
the isLoadFromStackSlot hook to get this.
llvm-svn: 23388 | 
| | 
| 
| 
| | llvm-svn: 23387 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | struct S { unsigned int i : 6, j : 11, k : 15; } b;
void plus2 (unsigned int x) { b.j += x; }
To:
_plus2:
        lis r2, ha16(L_b$non_lazy_ptr)
        lwz r2, lo16(L_b$non_lazy_ptr)(r2)
        lwz r4, 0(r2)
        slwi r3, r3, 6
        add r3, r4, r3
        rlwimi r3, r4, 0, 26, 14
        stw r3, 0(r2)
        blr
instead of:
_plus2:
        lis r2, ha16(L_b$non_lazy_ptr)
        lwz r2, lo16(L_b$non_lazy_ptr)(r2)
        lwz r4, 0(r2)
        rlwinm r5, r4, 26, 21, 31
        add r3, r5, r3
        rlwimi r4, r3, 6, 15, 25
        stw r4, 0(r2)
        blr
by eliminating an 'and'.
I'm pretty sure this is as small as we can go :)
llvm-svn: 23386 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | struct S { unsigned int i : 6, j : 11, k : 15; } b;
void plus2 (unsigned int x) {
  b.j += x;
}
to:
plus2:
        mov %EAX, DWORD PTR [b]
        mov %ECX, %EAX
        and %ECX, 131008
        mov %EDX, DWORD PTR [%ESP + 4]
        shl %EDX, 6
        add %EDX, %ECX
        and %EDX, 131008
        and %EAX, -131009
        or %EDX, %EAX
        mov DWORD PTR [b], %EDX
        ret
instead of:
plus2:
        mov %EAX, DWORD PTR [b]
        mov %ECX, %EAX
        shr %ECX, 6
        and %ECX, 2047
        add %ECX, DWORD PTR [%ESP + 4]
        shl %ECX, 6
        and %ECX, 131008
        and %EAX, -131009
        or %ECX, %EAX
        mov DWORD PTR [b], %ECX
        ret
llvm-svn: 23385 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | struct S { unsigned int i : 6, j : 11, k : 15; } b;
void plus3 (unsigned int x) { b.k += x; }
To:
plus3:
        mov %EAX, DWORD PTR [%ESP + 4]
        shl %EAX, 17
        add DWORD PTR [b], %EAX
        ret
instead of:
plus3:
        mov %EAX, DWORD PTR [%ESP + 4]
        shl %EAX, 17
        mov %ECX, DWORD PTR [b]
        add %EAX, %ECX
        and %EAX, -131072
        and %ECX, 131071
        or %ECX, %EAX
        mov DWORD PTR [b], %ECX
        ret
llvm-svn: 23384 | 
| | 
| 
| 
| | llvm-svn: 23383 | 
| | 
| 
| 
| | llvm-svn: 23382 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | struct S { unsigned int i : 6, j : 11, k : 15; } b;
void plus3 (unsigned int x) {
  b.k += x;
}
to:
_plus3:
        lis r2, ha16(L_b$non_lazy_ptr)
        lwz r2, lo16(L_b$non_lazy_ptr)(r2)
        lwz r3, 0(r2)
        rlwinm r4, r3, 0, 0, 14
        add r4, r4, r3
        rlwimi r4, r3, 0, 15, 31
        stw r4, 0(r2)
        blr
instead of:
_plus3:
        lis r2, ha16(L_b$non_lazy_ptr)
        lwz r2, lo16(L_b$non_lazy_ptr)(r2)
        lwz r4, 0(r2)
        srwi r5, r4, 17
        add r3, r5, r3
        slwi r3, r3, 17
        rlwimi r3, r4, 0, 15, 31
        stw r3, 0(r2)
        blr
llvm-svn: 23381 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | struct S { unsigned int i : 6, j : 11, k : 15; } b;
void plus1 (unsigned int x) {
  b.i += x;
}
as:
_plus1:
        lis r2, ha16(L_b$non_lazy_ptr)
        lwz r2, lo16(L_b$non_lazy_ptr)(r2)
        lwz r4, 0(r2)
        add r3, r4, r3
        rlwimi r3, r4, 0, 0, 25
        stw r3, 0(r2)
        blr
instead of:
_plus1:
        lis r2, ha16(L_b$non_lazy_ptr)
        lwz r2, lo16(L_b$non_lazy_ptr)(r2)
        lwz r4, 0(r2)
        rlwinm r5, r4, 0, 26, 31
        add r3, r5, r3
        rlwimi r3, r4, 0, 0, 25
        stw r3, 0(r2)
        blr
llvm-svn: 23379 | 
| | 
| 
| 
| | llvm-svn: 23377 | 
| | 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| 
| | struct {
   unsigned int bit0:1;
   unsigned int ubyte:31;
} sdata;
void foo() {
  sdata.ubyte++;
}
into this:
foo:
        add DWORD PTR [sdata], 2
        ret
instead of this:
foo:
        mov %EAX, DWORD PTR [sdata]
        mov %ECX, %EAX
        add %ECX, 2
        and %ECX, -2
        and %EAX, 1
        or %EAX, %ECX
        mov DWORD PTR [sdata], %EAX
        ret
llvm-svn: 23376 | 
| | 
| 
| 
| | llvm-svn: 23374 |