215 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -verify-machineinstrs | FileCheck %s -check-prefix=X863; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -verify-machineinstrs | FileCheck %s -check-prefix=X644; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnux32 -verify-machineinstrs | FileCheck %s -check-prefix=X32ABI5; RUN: llc < %s -mcpu=generic -mtriple=i686-linux -filetype=obj6; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux -filetype=obj7; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux-gnux32 -filetype=obj8 9; Just to prevent the alloca from being optimized away10declare void @dummy_use(ptr, i32)11 12define i32 @test_basic(i32 %l) #0 {13; X86-LABEL: test_basic:14; X86: # %bb.0:15; X86-NEXT: cmpl %gs:48, %esp16; X86-NEXT: jbe .LBB0_117; X86-NEXT: .LBB0_2:18; X86-NEXT: pushl %ebp19; X86-NEXT: .cfi_def_cfa_offset 820; X86-NEXT: .cfi_offset %ebp, -821; X86-NEXT: movl %esp, %ebp22; X86-NEXT: .cfi_def_cfa_register %ebp23; X86-NEXT: pushl %esi24; X86-NEXT: pushl %eax25; X86-NEXT: .cfi_offset %esi, -1226; X86-NEXT: movl 8(%ebp), %esi27; X86-NEXT: movl %esp, %eax28; X86-NEXT: leal 15(,%esi,4), %ecx29; X86-NEXT: andl $-16, %ecx30; X86-NEXT: subl %ecx, %eax31; X86-NEXT: cmpl %eax, %gs:4832; X86-NEXT: jg .LBB0_433; X86-NEXT: # %bb.3:34; X86-NEXT: movl %eax, %esp35; X86-NEXT: jmp .LBB0_536; X86-NEXT: .LBB0_4:37; X86-NEXT: subl $12, %esp38; X86-NEXT: pushl %ecx39; X86-NEXT: calll __morestack_allocate_stack_space40; X86-NEXT: addl $16, %esp41; X86-NEXT: .LBB0_5:42; X86-NEXT: subl $16, %esp43; X86-NEXT: movl %esi, {{[0-9]+}}(%esp)44; X86-NEXT: movl %eax, (%esp)45; X86-NEXT: calll dummy_use@PLT46; X86-NEXT: addl $16, %esp47; X86-NEXT: testl %esi, %esi48; X86-NEXT: je .LBB0_649; X86-NEXT: # %bb.8: # %false50; X86-NEXT: decl %esi51; X86-NEXT: subl $16, %esp52; X86-NEXT: movl %esi, (%esp)53; X86-NEXT: calll test_basic@PLT54; X86-NEXT: jmp .LBB0_755; X86-NEXT: .LBB0_6: # %true56; X86-NEXT: xorl %eax, %eax57; X86-NEXT: .LBB0_7: # %true58; X86-NEXT: leal -4(%ebp), %esp59; X86-NEXT: popl %esi60; X86-NEXT: popl %ebp61; X86-NEXT: .cfi_def_cfa %esp, 462; X86-NEXT: retl63; X86-NEXT: .LBB0_1:64; X86-NEXT: .cfi_restore %ebp65; X86-NEXT: .cfi_restore %esi66; X86-NEXT: pushl $467; X86-NEXT: pushl $1268; X86-NEXT: calll __morestack69; X86-NEXT: retl70; X86-NEXT: jmp .LBB0_271;72; X64-LABEL: test_basic:73; X64: # %bb.0:74; X64-NEXT: cmpq %fs:112, %rsp75; X64-NEXT: jbe .LBB0_176; X64-NEXT: .LBB0_2:77; X64-NEXT: pushq %rbp78; X64-NEXT: .cfi_def_cfa_offset 1679; X64-NEXT: .cfi_offset %rbp, -1680; X64-NEXT: movq %rsp, %rbp81; X64-NEXT: .cfi_def_cfa_register %rbp82; X64-NEXT: pushq %rbx83; X64-NEXT: pushq %rax84; X64-NEXT: .cfi_offset %rbx, -2485; X64-NEXT: movl %edi, %ebx86; X64-NEXT: movq %rsp, %rdi87; X64-NEXT: movl %ebx, %eax88; X64-NEXT: leaq 15(,%rax,4), %rax89; X64-NEXT: andq $-16, %rax90; X64-NEXT: subq %rax, %rdi91; X64-NEXT: cmpq %rdi, %fs:11292; X64-NEXT: jg .LBB0_493; X64-NEXT: # %bb.3:94; X64-NEXT: movq %rdi, %rsp95; X64-NEXT: jmp .LBB0_596; X64-NEXT: .LBB0_4:97; X64-NEXT: movq %rax, %rdi98; X64-NEXT: callq __morestack_allocate_stack_space99; X64-NEXT: movq %rax, %rdi100; X64-NEXT: .LBB0_5:101; X64-NEXT: movl %ebx, %esi102; X64-NEXT: callq dummy_use@PLT103; X64-NEXT: testl %ebx, %ebx104; X64-NEXT: je .LBB0_6105; X64-NEXT: # %bb.8: # %false106; X64-NEXT: decl %ebx107; X64-NEXT: movl %ebx, %edi108; X64-NEXT: callq test_basic@PLT109; X64-NEXT: jmp .LBB0_7110; X64-NEXT: .LBB0_6: # %true111; X64-NEXT: xorl %eax, %eax112; X64-NEXT: .LBB0_7: # %true113; X64-NEXT: leaq -8(%rbp), %rsp114; X64-NEXT: popq %rbx115; X64-NEXT: popq %rbp116; X64-NEXT: .cfi_def_cfa %rsp, 8117; X64-NEXT: retq118; X64-NEXT: .LBB0_1:119; X64-NEXT: .cfi_restore %rbx120; X64-NEXT: .cfi_restore %rbp121; X64-NEXT: movl $24, %r10d122; X64-NEXT: movl $0, %r11d123; X64-NEXT: callq __morestack124; X64-NEXT: retq125; X64-NEXT: jmp .LBB0_2126;127; X32ABI-LABEL: test_basic:128; X32ABI: # %bb.0:129; X32ABI-NEXT: cmpl %fs:64, %esp130; X32ABI-NEXT: jbe .LBB0_1131; X32ABI-NEXT: .LBB0_2:132; X32ABI-NEXT: pushq %rbp133; X32ABI-NEXT: .cfi_def_cfa_offset 16134; X32ABI-NEXT: .cfi_offset %rbp, -16135; X32ABI-NEXT: movl %esp, %ebp136; X32ABI-NEXT: .cfi_def_cfa_register %rbp137; X32ABI-NEXT: pushq %rbx138; X32ABI-NEXT: pushq %rax139; X32ABI-NEXT: .cfi_offset %rbx, -24140; X32ABI-NEXT: movl %edi, %ebx141; X32ABI-NEXT: leal 15(,%rbx,4), %eax142; X32ABI-NEXT: andl $-16, %eax143; X32ABI-NEXT: movl %esp, %edi144; X32ABI-NEXT: subl %eax, %edi145; X32ABI-NEXT: cmpl %edi, %fs:64146; X32ABI-NEXT: jg .LBB0_4147; X32ABI-NEXT: # %bb.3:148; X32ABI-NEXT: movl %edi, %esp149; X32ABI-NEXT: jmp .LBB0_5150; X32ABI-NEXT: .LBB0_4:151; X32ABI-NEXT: movl %eax, %edi152; X32ABI-NEXT: callq __morestack_allocate_stack_space153; X32ABI-NEXT: movl %eax, %edi154; X32ABI-NEXT: .LBB0_5:155; X32ABI-NEXT: movl %ebx, %esi156; X32ABI-NEXT: callq dummy_use@PLT157; X32ABI-NEXT: testl %ebx, %ebx158; X32ABI-NEXT: je .LBB0_6159; X32ABI-NEXT: # %bb.8: # %false160; X32ABI-NEXT: decl %ebx161; X32ABI-NEXT: movl %ebx, %edi162; X32ABI-NEXT: callq test_basic@PLT163; X32ABI-NEXT: jmp .LBB0_7164; X32ABI-NEXT: .LBB0_6: # %true165; X32ABI-NEXT: xorl %eax, %eax166; X32ABI-NEXT: .LBB0_7: # %true167; X32ABI-NEXT: leal -8(%ebp), %esp168; X32ABI-NEXT: popq %rbx169; X32ABI-NEXT: popq %rbp170; X32ABI-NEXT: .cfi_def_cfa %rsp, 8171; X32ABI-NEXT: retq172; X32ABI-NEXT: .LBB0_1:173; X32ABI-NEXT: .cfi_def_cfa_register 4294967294174; X32ABI-NEXT: .cfi_restore %rbx175; X32ABI-NEXT: .cfi_restore %rbp176; X32ABI-NEXT: movl $24, %r10d177; X32ABI-NEXT: movl $0, %r11d178; X32ABI-NEXT: callq __morestack179; X32ABI-NEXT: retq180; X32ABI-NEXT: jmp .LBB0_2181 %mem = alloca i32, i32 %l182 call void @dummy_use (ptr %mem, i32 %l)183 %terminate = icmp eq i32 %l, 0184 br i1 %terminate, label %true, label %false185 186true:187 ret i32 0188 189false:190 %newlen = sub i32 %l, 1191 %retvalue = call i32 @test_basic(i32 %newlen)192 ret i32 %retvalue193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212}213 214attributes #0 = { "split-stack" }215