| ; RUN: llc < %s -march=x86 -mcpu=yonah | FileCheck %s |
| ; rdar://5752025 |
| |
| ; We want: |
| ; CHECK: movl $42, %ecx |
| ; CHECK-NEXT: movl 4(%esp), %eax |
| ; CHECK-NEXT: andl $15, %eax |
| ; CHECK-NEXT: cmovnel %ecx, %eax |
| ; CHECK-NEXT: ret |
| ; |
| ; We don't want: |
| ; movl 4(%esp), %eax |
| ; movl %eax, %ecx # bad: extra copy |
| ; andl $15, %ecx |
| ; testl $15, %eax # bad: peep obstructed |
| ; movl $42, %eax |
| ; cmovel %ecx, %eax |
| ; ret |
| ; |
| ; We also don't want: |
| ; movl $15, %ecx # bad: larger encoding |
| ; andl 4(%esp), %ecx |
| ; movl $42, %eax |
| ; cmovel %ecx, %eax |
| ; ret |
| ; |
| ; We also don't want: |
| ; movl 4(%esp), %ecx |
| ; andl $15, %ecx |
| ; testl %ecx, %ecx # bad: unnecessary test |
| ; movl $42, %eax |
| ; cmovel %ecx, %eax |
| ; ret |
| |
| define i32 @t1(i32 %X) nounwind { |
| entry: |
| %tmp2 = and i32 %X, 15 ; <i32> [#uses=2] |
| %tmp4 = icmp eq i32 %tmp2, 0 ; <i1> [#uses=1] |
| %retval = select i1 %tmp4, i32 %tmp2, i32 42 ; <i32> [#uses=1] |
| ret i32 %retval |
| } |
| |