|  | ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py | 
|  | ; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s -check-prefix=X64 | 
|  | ; RUN: llc < %s -mtriple=i686-apple-darwin   | FileCheck %s -check-prefix=X86 | 
|  |  | 
|  | ; rdar://7329206 | 
|  |  | 
|  | ; In 32-bit the partial register stall would degrade performance. | 
|  |  | 
|  | define zeroext i16 @test1(i16 zeroext %c, i16 zeroext %k) nounwind ssp { | 
|  | ; X64-LABEL: test1: | 
|  | ; X64:       ## %bb.0: ## %entry | 
|  | ; X64-NEXT:    movl %esi, %eax | 
|  | ; X64-NEXT:    incl %eax | 
|  | ; X64-NEXT:    cmpw %di, %si | 
|  | ; X64-NEXT:    jne LBB0_2 | 
|  | ; X64-NEXT:  ## %bb.1: ## %bb | 
|  | ; X64-NEXT:    pushq %rbx | 
|  | ; X64-NEXT:    movzwl %ax, %ebx | 
|  | ; X64-NEXT:    movl %ebx, %edi | 
|  | ; X64-NEXT:    callq _foo | 
|  | ; X64-NEXT:    movl %ebx, %eax | 
|  | ; X64-NEXT:    popq %rbx | 
|  | ; X64-NEXT:    retq | 
|  | ; X64-NEXT:  LBB0_2: ## %bb1 | 
|  | ; X64-NEXT:    movzwl %ax, %eax | 
|  | ; X64-NEXT:    retq | 
|  | ; | 
|  | ; X86-LABEL: test1: | 
|  | ; X86:       ## %bb.0: ## %entry | 
|  | ; X86-NEXT:    pushl %esi | 
|  | ; X86-NEXT:    subl $8, %esp | 
|  | ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx | 
|  | ; X86-NEXT:    movl %ecx, %eax | 
|  | ; X86-NEXT:    incl %eax | 
|  | ; X86-NEXT:    cmpw {{[0-9]+}}(%esp), %cx | 
|  | ; X86-NEXT:    jne LBB0_2 | 
|  | ; X86-NEXT:  ## %bb.1: ## %bb | 
|  | ; X86-NEXT:    movzwl %ax, %esi | 
|  | ; X86-NEXT:    movl %esi, (%esp) | 
|  | ; X86-NEXT:    calll _foo | 
|  | ; X86-NEXT:    movl %esi, %eax | 
|  | ; X86-NEXT:    jmp LBB0_3 | 
|  | ; X86-NEXT:  LBB0_2: ## %bb1 | 
|  | ; X86-NEXT:    movzwl %ax, %eax | 
|  | ; X86-NEXT:  LBB0_3: ## %bb1 | 
|  | ; X86-NEXT:    addl $8, %esp | 
|  | ; X86-NEXT:    popl %esi | 
|  | ; X86-NEXT:    retl | 
|  | entry: | 
|  | %0 = icmp eq i16 %k, %c | 
|  | %1 = add i16 %k, 1 | 
|  | br i1 %0, label %bb, label %bb1 | 
|  |  | 
|  | bb: | 
|  | tail call void @foo(i16 zeroext %1) nounwind | 
|  | ret i16 %1 | 
|  |  | 
|  | bb1: | 
|  | ret i16 %1 | 
|  | } | 
|  |  | 
|  | define zeroext i16 @test2(i16 zeroext %c, i16 zeroext %k) nounwind ssp { | 
|  | ; X64-LABEL: test2: | 
|  | ; X64:       ## %bb.0: ## %entry | 
|  | ; X64-NEXT:    movl %esi, %eax | 
|  | ; X64-NEXT:    decl %eax | 
|  | ; X64-NEXT:    cmpw %di, %si | 
|  | ; X64-NEXT:    jne LBB1_2 | 
|  | ; X64-NEXT:  ## %bb.1: ## %bb | 
|  | ; X64-NEXT:    pushq %rbx | 
|  | ; X64-NEXT:    movzwl %ax, %ebx | 
|  | ; X64-NEXT:    movl %ebx, %edi | 
|  | ; X64-NEXT:    callq _foo | 
|  | ; X64-NEXT:    movl %ebx, %eax | 
|  | ; X64-NEXT:    popq %rbx | 
|  | ; X64-NEXT:    retq | 
|  | ; X64-NEXT:  LBB1_2: ## %bb1 | 
|  | ; X64-NEXT:    movzwl %ax, %eax | 
|  | ; X64-NEXT:    retq | 
|  | ; | 
|  | ; X86-LABEL: test2: | 
|  | ; X86:       ## %bb.0: ## %entry | 
|  | ; X86-NEXT:    pushl %esi | 
|  | ; X86-NEXT:    subl $8, %esp | 
|  | ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx | 
|  | ; X86-NEXT:    movl %ecx, %eax | 
|  | ; X86-NEXT:    decl %eax | 
|  | ; X86-NEXT:    cmpw {{[0-9]+}}(%esp), %cx | 
|  | ; X86-NEXT:    jne LBB1_2 | 
|  | ; X86-NEXT:  ## %bb.1: ## %bb | 
|  | ; X86-NEXT:    movzwl %ax, %esi | 
|  | ; X86-NEXT:    movl %esi, (%esp) | 
|  | ; X86-NEXT:    calll _foo | 
|  | ; X86-NEXT:    movl %esi, %eax | 
|  | ; X86-NEXT:    jmp LBB1_3 | 
|  | ; X86-NEXT:  LBB1_2: ## %bb1 | 
|  | ; X86-NEXT:    movzwl %ax, %eax | 
|  | ; X86-NEXT:  LBB1_3: ## %bb1 | 
|  | ; X86-NEXT:    addl $8, %esp | 
|  | ; X86-NEXT:    popl %esi | 
|  | ; X86-NEXT:    retl | 
|  | entry: | 
|  | %0 = icmp eq i16 %k, %c | 
|  | %1 = add i16 %k, -1 | 
|  | br i1 %0, label %bb, label %bb1 | 
|  |  | 
|  | bb: | 
|  | tail call void @foo(i16 zeroext %1) nounwind | 
|  | ret i16 %1 | 
|  |  | 
|  | bb1: | 
|  | ret i16 %1 | 
|  | } | 
|  |  | 
|  | declare void @foo(i16 zeroext) | 
|  |  | 
|  | define zeroext i16 @test3(i16 zeroext %c, i16 zeroext %k) nounwind ssp { | 
|  | ; X64-LABEL: test3: | 
|  | ; X64:       ## %bb.0: ## %entry | 
|  | ; X64-NEXT:    movl %esi, %eax | 
|  | ; X64-NEXT:    addl $2, %eax | 
|  | ; X64-NEXT:    cmpw %di, %si | 
|  | ; X64-NEXT:    jne LBB2_2 | 
|  | ; X64-NEXT:  ## %bb.1: ## %bb | 
|  | ; X64-NEXT:    pushq %rbx | 
|  | ; X64-NEXT:    movzwl %ax, %ebx | 
|  | ; X64-NEXT:    movl %ebx, %edi | 
|  | ; X64-NEXT:    callq _foo | 
|  | ; X64-NEXT:    movl %ebx, %eax | 
|  | ; X64-NEXT:    popq %rbx | 
|  | ; X64-NEXT:    retq | 
|  | ; X64-NEXT:  LBB2_2: ## %bb1 | 
|  | ; X64-NEXT:    movzwl %ax, %eax | 
|  | ; X64-NEXT:    retq | 
|  | ; | 
|  | ; X86-LABEL: test3: | 
|  | ; X86:       ## %bb.0: ## %entry | 
|  | ; X86-NEXT:    pushl %esi | 
|  | ; X86-NEXT:    subl $8, %esp | 
|  | ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx | 
|  | ; X86-NEXT:    movl %ecx, %eax | 
|  | ; X86-NEXT:    addl $2, %eax | 
|  | ; X86-NEXT:    cmpw {{[0-9]+}}(%esp), %cx | 
|  | ; X86-NEXT:    jne LBB2_2 | 
|  | ; X86-NEXT:  ## %bb.1: ## %bb | 
|  | ; X86-NEXT:    movzwl %ax, %esi | 
|  | ; X86-NEXT:    movl %esi, (%esp) | 
|  | ; X86-NEXT:    calll _foo | 
|  | ; X86-NEXT:    movl %esi, %eax | 
|  | ; X86-NEXT:    jmp LBB2_3 | 
|  | ; X86-NEXT:  LBB2_2: ## %bb1 | 
|  | ; X86-NEXT:    movzwl %ax, %eax | 
|  | ; X86-NEXT:  LBB2_3: ## %bb1 | 
|  | ; X86-NEXT:    addl $8, %esp | 
|  | ; X86-NEXT:    popl %esi | 
|  | ; X86-NEXT:    retl | 
|  | entry: | 
|  | %0 = add i16 %k, 2 | 
|  | %1 = icmp eq i16 %k, %c | 
|  | br i1 %1, label %bb, label %bb1 | 
|  |  | 
|  | bb: | 
|  | tail call void @foo(i16 zeroext %0) nounwind | 
|  | ret i16 %0 | 
|  |  | 
|  | bb1: | 
|  | ret i16 %0 | 
|  | } | 
|  |  | 
|  | define zeroext i16 @test4(i16 zeroext %c, i16 zeroext %k) nounwind ssp { | 
|  | ; X64-LABEL: test4: | 
|  | ; X64:       ## %bb.0: ## %entry | 
|  | ; X64-NEXT:    movl %esi, %eax | 
|  | ; X64-NEXT:    addl %edi, %eax | 
|  | ; X64-NEXT:    cmpw %di, %si | 
|  | ; X64-NEXT:    jne LBB3_2 | 
|  | ; X64-NEXT:  ## %bb.1: ## %bb | 
|  | ; X64-NEXT:    pushq %rbx | 
|  | ; X64-NEXT:    movzwl %ax, %ebx | 
|  | ; X64-NEXT:    movl %ebx, %edi | 
|  | ; X64-NEXT:    callq _foo | 
|  | ; X64-NEXT:    movl %ebx, %eax | 
|  | ; X64-NEXT:    popq %rbx | 
|  | ; X64-NEXT:    retq | 
|  | ; X64-NEXT:  LBB3_2: ## %bb1 | 
|  | ; X64-NEXT:    movzwl %ax, %eax | 
|  | ; X64-NEXT:    retq | 
|  | ; | 
|  | ; X86-LABEL: test4: | 
|  | ; X86:       ## %bb.0: ## %entry | 
|  | ; X86-NEXT:    pushl %esi | 
|  | ; X86-NEXT:    subl $8, %esp | 
|  | ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx | 
|  | ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx | 
|  | ; X86-NEXT:    movl %edx, %eax | 
|  | ; X86-NEXT:    addl %ecx, %eax | 
|  | ; X86-NEXT:    cmpw %cx, %dx | 
|  | ; X86-NEXT:    jne LBB3_2 | 
|  | ; X86-NEXT:  ## %bb.1: ## %bb | 
|  | ; X86-NEXT:    movzwl %ax, %esi | 
|  | ; X86-NEXT:    movl %esi, (%esp) | 
|  | ; X86-NEXT:    calll _foo | 
|  | ; X86-NEXT:    movl %esi, %eax | 
|  | ; X86-NEXT:    jmp LBB3_3 | 
|  | ; X86-NEXT:  LBB3_2: ## %bb1 | 
|  | ; X86-NEXT:    movzwl %ax, %eax | 
|  | ; X86-NEXT:  LBB3_3: ## %bb1 | 
|  | ; X86-NEXT:    addl $8, %esp | 
|  | ; X86-NEXT:    popl %esi | 
|  | ; X86-NEXT:    retl | 
|  | entry: | 
|  | %0 = add i16 %k, %c | 
|  | %1 = icmp eq i16 %k, %c | 
|  | br i1 %1, label %bb, label %bb1 | 
|  |  | 
|  | bb: | 
|  | tail call void @foo(i16 zeroext %0) nounwind | 
|  | ret i16 %0 | 
|  |  | 
|  | bb1: | 
|  | ret i16 %0 | 
|  | } | 
|  |  |