Skip to content
  1. Sep 20, 2005
  2. Sep 19, 2005
    • Chris Lattner's avatar
      Teach the local spiller to turn stack slot loads into register-register copies · 2f838f21
      Chris Lattner authored
      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
      2f838f21
    • Chris Lattner's avatar
      Implement the isLoadFromStackSlot interface · de3c87a2
      Chris Lattner authored
      llvm-svn: 23387
      de3c87a2
  3. Sep 18, 2005
    • Chris Lattner's avatar
      Refactor this code a bit and make it more general. This now compiles: · b4b2530a
      Chris Lattner authored
      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
      b4b2530a
    • Chris Lattner's avatar
      Compile · 797dee77
      Chris Lattner authored
      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
      797dee77
    • Chris Lattner's avatar
      Generalize this transform, using MaskedValueIsZero, allowing us to compile: · 01f56c68
      Chris Lattner authored
      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
      01f56c68
    • Chris Lattner's avatar
      fix typeo · 4ebc8ab4
      Chris Lattner authored
      llvm-svn: 23383
      4ebc8ab4
    • Chris Lattner's avatar
      Remove unintentionally committed code · e5b23a6d
      Chris Lattner authored
      llvm-svn: 23382
      e5b23a6d
    • Chris Lattner's avatar
      implement shift.ll:test25. This compiles: · 27cb9dbd
      Chris Lattner authored
      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
      27cb9dbd
    • Chris Lattner's avatar
      Implement add.ll:test29. Codegening: · af517574
      Chris Lattner authored
      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
      af517574
    • Chris Lattner's avatar
      remove debug output · 027eaf01
      Chris Lattner authored
      llvm-svn: 23377
      027eaf01
    • Chris Lattner's avatar
      Implement or.ll:test21. This teaches instcombine to be able to turn this: · 15212989
      Chris Lattner authored
      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
      15212989
  4. Sep 17, 2005
  5. Sep 16, 2005
  6. Sep 15, 2005
  7. Sep 14, 2005
  8. Sep 13, 2005
Loading