; 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=X32 ; 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 ; ; X32-LABEL: test1: ; X32: ## %bb.0: ## %entry ; X32-NEXT: pushl %esi ; X32-NEXT: subl $8, %esp ; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X32-NEXT: movl %ecx, %eax ; X32-NEXT: incl %eax ; X32-NEXT: cmpw {{[0-9]+}}(%esp), %cx ; X32-NEXT: jne LBB0_2 ; X32-NEXT: ## %bb.1: ## %bb ; X32-NEXT: movzwl %ax, %esi ; X32-NEXT: movl %esi, (%esp) ; X32-NEXT: calll _foo ; X32-NEXT: movl %esi, %eax ; X32-NEXT: jmp LBB0_3 ; X32-NEXT: LBB0_2: ## %bb1 ; X32-NEXT: movzwl %ax, %eax ; X32-NEXT: LBB0_3: ## %bb1 ; X32-NEXT: addl $8, %esp ; X32-NEXT: popl %esi ; X32-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 ; ; X32-LABEL: test2: ; X32: ## %bb.0: ## %entry ; X32-NEXT: pushl %esi ; X32-NEXT: subl $8, %esp ; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X32-NEXT: movl %ecx, %eax ; X32-NEXT: decl %eax ; X32-NEXT: cmpw {{[0-9]+}}(%esp), %cx ; X32-NEXT: jne LBB1_2 ; X32-NEXT: ## %bb.1: ## %bb ; X32-NEXT: movzwl %ax, %esi ; X32-NEXT: movl %esi, (%esp) ; X32-NEXT: calll _foo ; X32-NEXT: movl %esi, %eax ; X32-NEXT: jmp LBB1_3 ; X32-NEXT: LBB1_2: ## %bb1 ; X32-NEXT: movzwl %ax, %eax ; X32-NEXT: LBB1_3: ## %bb1 ; X32-NEXT: addl $8, %esp ; X32-NEXT: popl %esi ; X32-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 ; ; X32-LABEL: test3: ; X32: ## %bb.0: ## %entry ; X32-NEXT: pushl %esi ; X32-NEXT: subl $8, %esp ; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X32-NEXT: movl %ecx, %eax ; X32-NEXT: addl $2, %eax ; X32-NEXT: cmpw {{[0-9]+}}(%esp), %cx ; X32-NEXT: jne LBB2_2 ; X32-NEXT: ## %bb.1: ## %bb ; X32-NEXT: movzwl %ax, %esi ; X32-NEXT: movl %esi, (%esp) ; X32-NEXT: calll _foo ; X32-NEXT: movl %esi, %eax ; X32-NEXT: jmp LBB2_3 ; X32-NEXT: LBB2_2: ## %bb1 ; X32-NEXT: movzwl %ax, %eax ; X32-NEXT: LBB2_3: ## %bb1 ; X32-NEXT: addl $8, %esp ; X32-NEXT: popl %esi ; X32-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 ; ; X32-LABEL: test4: ; X32: ## %bb.0: ## %entry ; X32-NEXT: pushl %esi ; X32-NEXT: subl $8, %esp ; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X32-NEXT: movl {{[0-9]+}}(%esp), %edx ; X32-NEXT: movl %edx, %eax ; X32-NEXT: addl %ecx, %eax ; X32-NEXT: cmpw %cx, %dx ; X32-NEXT: jne LBB3_2 ; X32-NEXT: ## %bb.1: ## %bb ; X32-NEXT: movzwl %ax, %esi ; X32-NEXT: movl %esi, (%esp) ; X32-NEXT: calll _foo ; X32-NEXT: movl %esi, %eax ; X32-NEXT: jmp LBB3_3 ; X32-NEXT: LBB3_2: ## %bb1 ; X32-NEXT: movzwl %ax, %eax ; X32-NEXT: LBB3_3: ## %bb1 ; X32-NEXT: addl $8, %esp ; X32-NEXT: popl %esi ; X32-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 }