Skip to content
  1. Apr 22, 2005
  2. Apr 21, 2005
    • Chris Lattner's avatar
      Improve and elimination. On PPC, for: · f6302441
      Chris Lattner authored
      bool %test(int %X) {
              %Y = and int %X, 8
              %Z = setne int %Y, 0
              ret bool %Z
      }
      
      we now generate this:
      
              rlwinm r2, r3, 0, 28, 28
              srwi r3, r2, 3
      
      instead of this:
      
              rlwinm r2, r3, 0, 28, 28
              srwi r2, r2, 3
              rlwinm r3, r2, 0, 31, 31
      
      I'll leave it to Nate to get it down to one instruction. :)
      
      ---------------------------------------------------------------------
      
      llvm-svn: 21391
      f6302441
    • Chris Lattner's avatar
      Fold (x & 8) != 0 and (x & 8) == 8 into (x & 8) >> 3. · ab1ed775
      Chris Lattner authored
      This turns this PPC code:
      
              rlwinm r2, r3, 0, 28, 28
              cmpwi cr7, r2, 8
              mfcr r2
              rlwinm r3, r2, 31, 31, 31
      
      into this:
      
              rlwinm r2, r3, 0, 28, 28
              srwi r2, r2, 3
              rlwinm r3, r2, 0, 31, 31
      
      Next up, nuking the extra and.
      
      llvm-svn: 21390
      ab1ed775
  3. Apr 18, 2005
  4. Apr 14, 2005
  5. Apr 13, 2005
  6. Apr 12, 2005
    • Chris Lattner's avatar
      promote extload i1 -> extload i8 · 0b73a6d8
      Chris Lattner authored
      llvm-svn: 21258
      0b73a6d8
    • Chris Lattner's avatar
      Remove some redundant checks, add a couple of new ones. This allows us to · af5b25f1
      Chris Lattner authored
      compile this:
      
      int foo (unsigned long a, unsigned long long g) {
        return a >= g;
      }
      
      To:
      
      foo:
              movl 8(%esp), %eax
              cmpl %eax, 4(%esp)
              setae %al
              cmpl $0, 12(%esp)
              sete %cl
              andb %al, %cl
              movzbl %cl, %eax
              ret
      
      instead of:
      
      foo:
              movl 8(%esp), %eax
              cmpl %eax, 4(%esp)
              setae %al
              movzbw %al, %cx
              movl 12(%esp), %edx
              cmpl $0, %edx
              sete %al
              movzbw %al, %ax
              cmpl $0, %edx
              cmove %cx, %ax
              movzbl %al, %eax
              ret
      
      llvm-svn: 21244
      af5b25f1
    • Chris Lattner's avatar
      Emit comparisons against the sign bit better. Codegen this: · aedcabe8
      Chris Lattner authored
      bool %test1(long %X) {
              %A = setlt long %X, 0
              ret bool %A
      }
      
      like this:
      
      test1:
              cmpl $0, 8(%esp)
              setl %al
              movzbl %al, %eax
              ret
      
      instead of:
      
      test1:
              movl 8(%esp), %ecx
              cmpl $0, %ecx
              setl %al
              movzbw %al, %ax
              cmpl $0, 4(%esp)
              setb %dl
              movzbw %dl, %dx
              cmpl $0, %ecx
              cmove %dx, %ax
              movzbl %al, %eax
              ret
      
      llvm-svn: 21243
      aedcabe8
    • Chris Lattner's avatar
      Emit long comparison against -1 better. Instead of this (x86): · 71ff44e4
      Chris Lattner authored
      test2:
              movl 8(%esp), %eax
              notl %eax
              movl 4(%esp), %ecx
              notl %ecx
              orl %eax, %ecx
              cmpl $0, %ecx
              sete %al
              movzbl %al, %eax
              ret
      
      or this (PPC):
      
      _test2:
              nor r2, r4, r4
              nor r3, r3, r3
              or r2, r2, r3
              cntlzw r2, r2
              srwi r3, r2, 5
              blr
      
      Emit this:
      
      test2:
              movl 8(%esp), %eax
              andl 4(%esp), %eax
              cmpl $-1, %eax
              sete %al
              movzbl %al, %eax
              ret
      
      or this:
      
      _test2:
      .LBB_test2_0:   ;
              and r2, r4, r3
              cmpwi cr0, r2, -1
              li r3, 1
              li r2, 0
              beq .LBB_test2_2        ;
      .LBB_test2_1:   ;
              or r3, r2, r2
      .LBB_test2_2:   ;
              blr
      
      it seems like the PPC isel could do better for R32 == -1 case.
      
      llvm-svn: 21242
      71ff44e4
    • Chris Lattner's avatar
      canonicalize x <u 1 -> x == 0. On this testcase: · 87bd6988
      Chris Lattner authored
      unsigned long long g;
      unsigned long foo (unsigned long a) {
        return (a >= g) ? 1 : 0;
      }
      
      It changes the ppc code from:
      
      _foo:
      .LBB_foo_0:     ; entry
              mflr r11
              stw r11, 8(r1)
              bl "L00000$pb"
      "L00000$pb":
              mflr r2
              addis r2, r2, ha16(L_g$non_lazy_ptr-"L00000$pb")
              lwz r2, lo16(L_g$non_lazy_ptr-"L00000$pb")(r2)
              lwz r4, 0(r2)
              lwz r2, 4(r2)
              cmplw cr0, r3, r2
              li r2, 1
              li r3, 0
              bge .LBB_foo_2  ; entry
      .LBB_foo_1:     ; entry
              or r2, r3, r3
      .LBB_foo_2:     ; entry
              cmplwi cr0, r4, 1
              li r3, 1
              li r5, 0
              blt .LBB_foo_4  ; entry
      .LBB_foo_3:     ; entry
              or r3, r5, r5
      .LBB_foo_4:     ; entry
              cmpwi cr0, r4, 0
              beq .LBB_foo_6  ; entry
      .LBB_foo_5:     ; entry
              or r2, r3, r3
      .LBB_foo_6:     ; entry
              rlwinm r3, r2, 0, 31, 31
              lwz r11, 8(r1)
              mtlr r11
              blr
      
      
      to:
      
      _foo:
      .LBB_foo_0:     ; entry
              mflr r11
              stw r11, 8(r1)
              bl "L00000$pb"
      "L00000$pb":
              mflr r2
              addis r2, r2, ha16(L_g$non_lazy_ptr-"L00000$pb")
              lwz r2, lo16(L_g$non_lazy_ptr-"L00000$pb")(r2)
              lwz r4, 0(r2)
              lwz r2, 4(r2)
              cmplw cr0, r3, r2
              li r2, 1
              li r3, 0
              bge .LBB_foo_2  ; entry
      .LBB_foo_1:     ; entry
              or r2, r3, r3
      .LBB_foo_2:     ; entry
              cntlzw r3, r4
              srwi r3, r3, 5
              cmpwi cr0, r4, 0
              beq .LBB_foo_4  ; entry
      .LBB_foo_3:     ; entry
              or r2, r3, r3
      .LBB_foo_4:     ; entry
              rlwinm r3, r2, 0, 31, 31
              lwz r11, 8(r1)
              mtlr r11
              blr
      
      llvm-svn: 21241
      87bd6988
  7. Apr 11, 2005
    • Chris Lattner's avatar
      Teach the dag mechanism that this: · 8ffd0049
      Chris Lattner authored
      long long test2(unsigned A, unsigned B) {
              return ((unsigned long long)A << 32) + B;
      }
      
      is equivalent to this:
      
      long long test1(unsigned A, unsigned B) {
              return ((unsigned long long)A << 32) | B;
      }
      
      Now they are both codegen'd to this on ppc:
      
      _test2:
              blr
      
      or this on x86:
      
      test2:
              movl 4(%esp), %edx
              movl 8(%esp), %eax
              ret
      
      llvm-svn: 21231
      8ffd0049
    • Chris Lattner's avatar
      Fix expansion of shifts by exactly NVT bits on arch's (like X86) that have · edd19706
      Chris Lattner authored
      masking shifts.
      
      This fixes the miscompilation of this:
      
      long long test1(unsigned A, unsigned B) {
              return ((unsigned long long)A << 32) | B;
      }
      
      into this:
      
      test1:
              movl 4(%esp), %edx
              movl %edx, %eax
              orl 8(%esp), %eax
              ret
      
      allowing us to generate this instead:
      
      test1:
              movl 4(%esp), %edx
              movl 8(%esp), %eax
              ret
      
      llvm-svn: 21230
      edd19706
    • Nate Begeman's avatar
      Fix libcall code to not pass a NULL Chain to LowerCallTo · add0c63a
      Nate Begeman authored
      Fix libcall code to not crash or assert looking for an ADJCALLSTACKUP node
        when it is known that there is no ADJCALLSTACKDOWN to match.
      Expand i64 multiply when ISD::MULHU is legal for the target.
      
      llvm-svn: 21214
      add0c63a
    • Chris Lattner's avatar
      Don't bother sign/zext_inreg'ing the result of an and operation if we know · e2427c9a
      Chris Lattner authored
      the result does change as a result of the extend.
      
      This improves codegen for Alpha on this testcase:
      
      int %a(ushort* %i) {
              %tmp.1 = load ushort* %i
              %tmp.2 = cast ushort %tmp.1 to int
              %tmp.4 = and int %tmp.2, 1
              ret int %tmp.4
      }
      
      Generating:
      
      a:
              ldgp $29, 0($27)
              ldwu $0,0($16)
              and $0,1,$0
              ret $31,($26),1
      
      instead of:
      
      a:
              ldgp $29, 0($27)
              ldwu $0,0($16)
              and $0,1,$0
              addl $0,0,$0
              ret $31,($26),1
      
      btw, alpha really should switch to livein/outs for args :)
      
      llvm-svn: 21213
      e2427c9a
    • Chris Lattner's avatar
  8. Apr 10, 2005
  9. Apr 09, 2005
Loading