215 lines
6.1 KiB
LLVM
215 lines
6.1 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -verify-machineinstrs | FileCheck %s -check-prefix=X86
|
|
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -verify-machineinstrs | FileCheck %s -check-prefix=X64
|
|
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnux32 -verify-machineinstrs | FileCheck %s -check-prefix=X32ABI
|
|
; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -filetype=obj
|
|
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -filetype=obj
|
|
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnux32 -filetype=obj
|
|
|
|
; Just to prevent the alloca from being optimized away
|
|
declare void @dummy_use(ptr, i32)
|
|
|
|
define i32 @test_basic(i32 %l) #0 {
|
|
; X86-LABEL: test_basic:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: cmpl %gs:48, %esp
|
|
; X86-NEXT: jbe .LBB0_1
|
|
; X86-NEXT: .LBB0_2:
|
|
; X86-NEXT: pushl %ebp
|
|
; X86-NEXT: .cfi_def_cfa_offset 8
|
|
; X86-NEXT: .cfi_offset %ebp, -8
|
|
; X86-NEXT: movl %esp, %ebp
|
|
; X86-NEXT: .cfi_def_cfa_register %ebp
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: pushl %eax
|
|
; X86-NEXT: .cfi_offset %esi, -12
|
|
; X86-NEXT: movl 8(%ebp), %esi
|
|
; X86-NEXT: leal 15(,%esi,4), %ecx
|
|
; X86-NEXT: andl $-16, %ecx
|
|
; X86-NEXT: movl %esp, %eax
|
|
; X86-NEXT: subl %ecx, %eax
|
|
; X86-NEXT: cmpl %eax, %gs:48
|
|
; X86-NEXT: jg .LBB0_4
|
|
; X86-NEXT: # %bb.3:
|
|
; X86-NEXT: movl %eax, %esp
|
|
; X86-NEXT: jmp .LBB0_5
|
|
; X86-NEXT: .LBB0_4:
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: pushl %ecx
|
|
; X86-NEXT: calll __morestack_allocate_stack_space
|
|
; X86-NEXT: addl $16, %esp
|
|
; X86-NEXT: .LBB0_5:
|
|
; X86-NEXT: subl $8, %esp
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: pushl %eax
|
|
; X86-NEXT: calll dummy_use@PLT
|
|
; X86-NEXT: addl $16, %esp
|
|
; X86-NEXT: testl %esi, %esi
|
|
; X86-NEXT: je .LBB0_6
|
|
; X86-NEXT: # %bb.8: # %false
|
|
; X86-NEXT: decl %esi
|
|
; X86-NEXT: subl $12, %esp
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: calll test_basic@PLT
|
|
; X86-NEXT: jmp .LBB0_7
|
|
; X86-NEXT: .LBB0_6: # %true
|
|
; X86-NEXT: xorl %eax, %eax
|
|
; X86-NEXT: .LBB0_7: # %true
|
|
; X86-NEXT: leal -4(%ebp), %esp
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: popl %ebp
|
|
; X86-NEXT: .cfi_def_cfa %esp, 4
|
|
; X86-NEXT: retl
|
|
; X86-NEXT: .LBB0_1:
|
|
; X86-NEXT: .cfi_restore %ebp
|
|
; X86-NEXT: .cfi_restore %esi
|
|
; X86-NEXT: pushl $4
|
|
; X86-NEXT: pushl $12
|
|
; X86-NEXT: calll __morestack
|
|
; X86-NEXT: retl
|
|
; X86-NEXT: jmp .LBB0_2
|
|
;
|
|
; X64-LABEL: test_basic:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: cmpq %fs:112, %rsp
|
|
; X64-NEXT: jbe .LBB0_1
|
|
; X64-NEXT: .LBB0_2:
|
|
; X64-NEXT: pushq %rbp
|
|
; X64-NEXT: .cfi_def_cfa_offset 16
|
|
; X64-NEXT: .cfi_offset %rbp, -16
|
|
; X64-NEXT: movq %rsp, %rbp
|
|
; X64-NEXT: .cfi_def_cfa_register %rbp
|
|
; X64-NEXT: pushq %rbx
|
|
; X64-NEXT: pushq %rax
|
|
; X64-NEXT: .cfi_offset %rbx, -24
|
|
; X64-NEXT: movl %edi, %ebx
|
|
; X64-NEXT: movl %edi, %eax
|
|
; X64-NEXT: leaq 15(,%rax,4), %rax
|
|
; X64-NEXT: andq $-16, %rax
|
|
; X64-NEXT: movq %rsp, %rdi
|
|
; X64-NEXT: subq %rax, %rdi
|
|
; X64-NEXT: cmpq %rdi, %fs:112
|
|
; X64-NEXT: jg .LBB0_4
|
|
; X64-NEXT: # %bb.3:
|
|
; X64-NEXT: movq %rdi, %rsp
|
|
; X64-NEXT: jmp .LBB0_5
|
|
; X64-NEXT: .LBB0_4:
|
|
; X64-NEXT: movq %rax, %rdi
|
|
; X64-NEXT: callq __morestack_allocate_stack_space
|
|
; X64-NEXT: movq %rax, %rdi
|
|
; X64-NEXT: .LBB0_5:
|
|
; X64-NEXT: movl %ebx, %esi
|
|
; X64-NEXT: callq dummy_use@PLT
|
|
; X64-NEXT: testl %ebx, %ebx
|
|
; X64-NEXT: je .LBB0_6
|
|
; X64-NEXT: # %bb.8: # %false
|
|
; X64-NEXT: decl %ebx
|
|
; X64-NEXT: movl %ebx, %edi
|
|
; X64-NEXT: callq test_basic@PLT
|
|
; X64-NEXT: jmp .LBB0_7
|
|
; X64-NEXT: .LBB0_6: # %true
|
|
; X64-NEXT: xorl %eax, %eax
|
|
; X64-NEXT: .LBB0_7: # %true
|
|
; X64-NEXT: leaq -8(%rbp), %rsp
|
|
; X64-NEXT: popq %rbx
|
|
; X64-NEXT: popq %rbp
|
|
; X64-NEXT: .cfi_def_cfa %rsp, 8
|
|
; X64-NEXT: retq
|
|
; X64-NEXT: .LBB0_1:
|
|
; X64-NEXT: .cfi_restore %rbx
|
|
; X64-NEXT: .cfi_restore %rbp
|
|
; X64-NEXT: movl $24, %r10d
|
|
; X64-NEXT: movl $0, %r11d
|
|
; X64-NEXT: callq __morestack
|
|
; X64-NEXT: retq
|
|
; X64-NEXT: jmp .LBB0_2
|
|
;
|
|
; X32ABI-LABEL: test_basic:
|
|
; X32ABI: # %bb.0:
|
|
; X32ABI-NEXT: cmpl %fs:64, %esp
|
|
; X32ABI-NEXT: jbe .LBB0_1
|
|
; X32ABI-NEXT: .LBB0_2:
|
|
; X32ABI-NEXT: pushq %rbp
|
|
; X32ABI-NEXT: .cfi_def_cfa_offset 16
|
|
; X32ABI-NEXT: .cfi_offset %rbp, -16
|
|
; X32ABI-NEXT: movl %esp, %ebp
|
|
; X32ABI-NEXT: .cfi_def_cfa_register %rbp
|
|
; X32ABI-NEXT: pushq %rbx
|
|
; X32ABI-NEXT: pushq %rax
|
|
; X32ABI-NEXT: .cfi_offset %rbx, -24
|
|
; X32ABI-NEXT: movl %edi, %ebx
|
|
; X32ABI-NEXT: leal 15(,%rbx,4), %eax
|
|
; X32ABI-NEXT: andl $-16, %eax
|
|
; X32ABI-NEXT: movl %esp, %edi
|
|
; X32ABI-NEXT: subl %eax, %edi
|
|
; X32ABI-NEXT: cmpl %edi, %fs:64
|
|
; X32ABI-NEXT: jg .LBB0_4
|
|
; X32ABI-NEXT: # %bb.3:
|
|
; X32ABI-NEXT: movl %edi, %esp
|
|
; X32ABI-NEXT: jmp .LBB0_5
|
|
; X32ABI-NEXT: .LBB0_4:
|
|
; X32ABI-NEXT: movl %eax, %edi
|
|
; X32ABI-NEXT: callq __morestack_allocate_stack_space
|
|
; X32ABI-NEXT: movl %eax, %edi
|
|
; X32ABI-NEXT: .LBB0_5:
|
|
; X32ABI-NEXT: movl %ebx, %esi
|
|
; X32ABI-NEXT: callq dummy_use@PLT
|
|
; X32ABI-NEXT: testl %ebx, %ebx
|
|
; X32ABI-NEXT: je .LBB0_6
|
|
; X32ABI-NEXT: # %bb.8: # %false
|
|
; X32ABI-NEXT: decl %ebx
|
|
; X32ABI-NEXT: movl %ebx, %edi
|
|
; X32ABI-NEXT: callq test_basic@PLT
|
|
; X32ABI-NEXT: jmp .LBB0_7
|
|
; X32ABI-NEXT: .LBB0_6: # %true
|
|
; X32ABI-NEXT: xorl %eax, %eax
|
|
; X32ABI-NEXT: .LBB0_7: # %true
|
|
; X32ABI-NEXT: leal -8(%ebp), %esp
|
|
; X32ABI-NEXT: popq %rbx
|
|
; X32ABI-NEXT: popq %rbp
|
|
; X32ABI-NEXT: .cfi_def_cfa %rsp, 8
|
|
; X32ABI-NEXT: retq
|
|
; X32ABI-NEXT: .LBB0_1:
|
|
; X32ABI-NEXT: .cfi_def_cfa_register 4294967294
|
|
; X32ABI-NEXT: .cfi_restore %rbx
|
|
; X32ABI-NEXT: .cfi_restore %rbp
|
|
; X32ABI-NEXT: movl $24, %r10d
|
|
; X32ABI-NEXT: movl $0, %r11d
|
|
; X32ABI-NEXT: callq __morestack
|
|
; X32ABI-NEXT: retq
|
|
; X32ABI-NEXT: jmp .LBB0_2
|
|
%mem = alloca i32, i32 %l
|
|
call void @dummy_use (ptr %mem, i32 %l)
|
|
%terminate = icmp eq i32 %l, 0
|
|
br i1 %terminate, label %true, label %false
|
|
|
|
true:
|
|
ret i32 0
|
|
|
|
false:
|
|
%newlen = sub i32 %l, 1
|
|
%retvalue = call i32 @test_basic(i32 %newlen)
|
|
ret i32 %retvalue
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
attributes #0 = { "split-stack" }
|