131 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp2; RUN: llc < %s | FileCheck %s3 4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"5target triple = "x86_64-unknown-linux-gnu"6 7; | case1 | alloca + align < probe_size8define i32 @foo1(i64 %i) local_unnamed_addr #0 {9; CHECK-LABEL: foo1:10; CHECK: # %bb.0:11; CHECK-NEXT: pushq %rbp12; CHECK-NEXT: .cfi_def_cfa_offset 1613; CHECK-NEXT: .cfi_offset %rbp, -1614; CHECK-NEXT: movq %rsp, %rbp15; CHECK-NEXT: .cfi_def_cfa_register %rbp16; CHECK-NEXT: andq $-64, %rsp17; CHECK-NEXT: subq $832, %rsp # imm = 0x34018; CHECK-NEXT: movl $1, (%rsp,%rdi,4)19; CHECK-NEXT: movl (%rsp), %eax20; CHECK-NEXT: movq %rbp, %rsp21; CHECK-NEXT: popq %rbp22; CHECK-NEXT: .cfi_def_cfa %rsp, 823; CHECK-NEXT: retq24 %a = alloca i32, i32 200, align 6425 %b = getelementptr inbounds i32, ptr %a, i64 %i26 store volatile i32 1, ptr %b27 %c = load volatile i32, ptr %a28 ret i32 %c29}30 31; | case2 | alloca > probe_size, align > probe_size32define i32 @foo2(i64 %i) local_unnamed_addr #0 {33; CHECK-LABEL: foo2:34; CHECK: # %bb.0:35; CHECK-NEXT: pushq %rbp36; CHECK-NEXT: .cfi_def_cfa_offset 1637; CHECK-NEXT: .cfi_offset %rbp, -1638; CHECK-NEXT: movq %rsp, %rbp39; CHECK-NEXT: .cfi_def_cfa_register %rbp40; CHECK-NEXT: andq $-2048, %rsp # imm = 0xF80041; CHECK-NEXT: subq $2048, %rsp # imm = 0x80042; CHECK-NEXT: movq $0, (%rsp)43; CHECK-NEXT: subq $4096, %rsp # imm = 0x100044; CHECK-NEXT: movq $0, (%rsp)45; CHECK-NEXT: subq $2048, %rsp # imm = 0x80046; CHECK-NEXT: movl $1, (%rsp,%rdi,4)47; CHECK-NEXT: movl (%rsp), %eax48; CHECK-NEXT: movq %rbp, %rsp49; CHECK-NEXT: popq %rbp50; CHECK-NEXT: .cfi_def_cfa %rsp, 851; CHECK-NEXT: retq52 %a = alloca i32, i32 2000, align 204853 %b = getelementptr inbounds i32, ptr %a, i64 %i54 store volatile i32 1, ptr %b55 %c = load volatile i32, ptr %a56 ret i32 %c57}58 59; | case3 | alloca < probe_size, align < probe_size, alloca + align > probe_size60define i32 @foo3(i64 %i) local_unnamed_addr #0 {61; CHECK-LABEL: foo3:62; CHECK: # %bb.0:63; CHECK-NEXT: pushq %rbp64; CHECK-NEXT: .cfi_def_cfa_offset 1665; CHECK-NEXT: .cfi_offset %rbp, -1666; CHECK-NEXT: movq %rsp, %rbp67; CHECK-NEXT: .cfi_def_cfa_register %rbp68; CHECK-NEXT: andq $-1024, %rsp # imm = 0xFC0069; CHECK-NEXT: subq $3072, %rsp # imm = 0xC0070; CHECK-NEXT: movq $0, (%rsp)71; CHECK-NEXT: subq $1024, %rsp # imm = 0x40072; CHECK-NEXT: movl $1, (%rsp,%rdi,4)73; CHECK-NEXT: movl (%rsp), %eax74; CHECK-NEXT: movq %rbp, %rsp75; CHECK-NEXT: popq %rbp76; CHECK-NEXT: .cfi_def_cfa %rsp, 877; CHECK-NEXT: retq78 %a = alloca i32, i32 1000, align 102479 %b = getelementptr inbounds i32, ptr %a, i64 %i80 store volatile i32 1, ptr %b81 %c = load volatile i32, ptr %a82 ret i32 %c83}84 85; | case4 | alloca + probe_size < probe_size, followed by dynamic alloca86define i32 @foo4(i64 %i) local_unnamed_addr #0 {87; CHECK-LABEL: foo4:88; CHECK: # %bb.0:89; CHECK-NEXT: pushq %rbp90; CHECK-NEXT: .cfi_def_cfa_offset 1691; CHECK-NEXT: .cfi_offset %rbp, -1692; CHECK-NEXT: movq %rsp, %rbp93; CHECK-NEXT: .cfi_def_cfa_register %rbp94; CHECK-NEXT: pushq %rbx95; CHECK-NEXT: andq $-64, %rsp96; CHECK-NEXT: subq $896, %rsp # imm = 0x38097; CHECK-NEXT: movq %rsp, %rbx98; CHECK-NEXT: .cfi_offset %rbx, -2499; CHECK-NEXT: movl $1, (%rbx,%rdi,4)100; CHECK-NEXT: movl (%rbx), %ecx101; CHECK-NEXT: movq %rsp, %rax102; CHECK-NEXT: leaq 15(,%rcx,4), %rcx103; CHECK-NEXT: andq $-16, %rcx104; CHECK-NEXT: subq %rcx, %rax105; CHECK-NEXT: cmpq %rsp, %rax106; CHECK-NEXT: jge .LBB3_3107; CHECK-NEXT: .LBB3_2: # =>This Inner Loop Header: Depth=1108; CHECK-NEXT: xorq $0, (%rsp)109; CHECK-NEXT: subq $4096, %rsp # imm = 0x1000110; CHECK-NEXT: cmpq %rsp, %rax111; CHECK-NEXT: jl .LBB3_2112; CHECK-NEXT: .LBB3_3:113; CHECK-NEXT: andq $-64, %rax114; CHECK-NEXT: movq %rax, %rsp115; CHECK-NEXT: movl (%rax), %eax116; CHECK-NEXT: leaq -8(%rbp), %rsp117; CHECK-NEXT: popq %rbx118; CHECK-NEXT: popq %rbp119; CHECK-NEXT: .cfi_def_cfa %rsp, 8120; CHECK-NEXT: retq121 %a = alloca i32, i32 200, align 64122 %b = getelementptr inbounds i32, ptr %a, i64 %i123 store volatile i32 1, ptr %b124 %c = load volatile i32, ptr %a125 %d = alloca i32, i32 %c, align 64126 %e = load volatile i32, ptr %d127 ret i32 %e128}129 130attributes #0 = {"probe-stack"="inline-asm"}131