forked from OSchip/llvm-project
224 lines
5.6 KiB
LLVM
224 lines
5.6 KiB
LLVM
; 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
|
|
}
|
|
|