brintos

brintos / llvm-project-archived public Read only

0
0
Text · 18.5 KiB · 3e0eaf1 Raw
540 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=aarch64 < %s -verify-machineinstrs -enable-post-misched=false | FileCheck %s3; RUN: llc -mtriple=aarch64 < %s -verify-machineinstrs -enable-post-misched=false -global-isel | FileCheck %s4 5; Tests for prolog sequences for stack probing, when using a 4KiB stack guard.6 7; The stack probing parameters in function attributes take precedence over8; ones in the module flags.9 10; Small stack frame, no probing required.11define void @static_64(ptr %out) #0 {12; CHECK-LABEL: static_64:13; CHECK:       // %bb.0: // %entry14; CHECK-NEXT:    sub sp, sp, #6415; CHECK-NEXT:    .cfi_def_cfa_offset 6416; CHECK-NEXT:    mov x8, sp17; CHECK-NEXT:    str x8, [x0]18; CHECK-NEXT:    add sp, sp, #6419; CHECK-NEXT:    .cfi_def_cfa_offset 020; CHECK-NEXT:    ret21entry:22  %v = alloca i8, i64 64, align 123  store ptr %v, ptr %out, align 824  ret void25}26 27; At 256 bytes we start to always create a frame pointer. No frame smaller then28; this needs a probe, so we can use the saving of at least one CSR as a probe29; at the top of our frame.30define void @static_256(ptr %out) #0 {31; CHECK-LABEL: static_256:32; CHECK:       // %bb.0: // %entry33; CHECK-NEXT:    sub sp, sp, #27234; CHECK-NEXT:    .cfi_def_cfa_offset 27235; CHECK-NEXT:    str x29, [sp, #256] // 8-byte Spill36; CHECK-NEXT:    .cfi_offset w29, -1637; CHECK-NEXT:    mov x8, sp38; CHECK-NEXT:    str x8, [x0]39; CHECK-NEXT:    add sp, sp, #27240; CHECK-NEXT:    .cfi_def_cfa_offset 041; CHECK-NEXT:    .cfi_restore w2942; CHECK-NEXT:    ret43entry:44  %v = alloca i8, i64 256, align 145  store ptr %v, ptr %out, align 846  ret void47}48 49; At 1024 bytes, this is the largest frame which doesn't need probing.50define void @static_1024(ptr %out) #0 {51; CHECK-LABEL: static_1024:52; CHECK:       // %bb.0: // %entry53; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill54; CHECK-NEXT:    .cfi_def_cfa_offset 1655; CHECK-NEXT:    .cfi_offset w29, -1656; CHECK-NEXT:    sub sp, sp, #102457; CHECK-NEXT:    .cfi_def_cfa_offset 104058; CHECK-NEXT:    mov x8, sp59; CHECK-NEXT:    str x8, [x0]60; CHECK-NEXT:    add sp, sp, #102461; CHECK-NEXT:    .cfi_def_cfa_offset 1662; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload63; CHECK-NEXT:    .cfi_def_cfa_offset 064; CHECK-NEXT:    .cfi_restore w2965; CHECK-NEXT:    ret66entry:67  %v = alloca i8, i64 1024, align 168  store ptr %v, ptr %out, align 869  ret void70}71 72; At 1024+16 bytes, this is the smallest frame which needs probing.73define void @static_1040(ptr %out) #0 {74; CHECK-LABEL: static_1040:75; CHECK:       // %bb.0: // %entry76; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill77; CHECK-NEXT:    .cfi_def_cfa_offset 1678; CHECK-NEXT:    .cfi_offset w29, -1679; CHECK-NEXT:    sub sp, sp, #104080; CHECK-NEXT:    .cfi_def_cfa_offset 105681; CHECK-NEXT:    str xzr, [sp]82; CHECK-NEXT:    mov x8, sp83; CHECK-NEXT:    str x8, [x0]84; CHECK-NEXT:    add sp, sp, #104085; CHECK-NEXT:    .cfi_def_cfa_offset 1686; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload87; CHECK-NEXT:    .cfi_def_cfa_offset 088; CHECK-NEXT:    .cfi_restore w2989; CHECK-NEXT:    ret90entry:91  %v = alloca i8, i64 1040, align 192  store ptr %v, ptr %out, align 893  ret void94}95 96; 4k bytes is the largest frame we can probe in one go.97define void @static_4096(ptr %out) #0 {98; CHECK-LABEL: static_4096:99; CHECK:       // %bb.0: // %entry100; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill101; CHECK-NEXT:    .cfi_def_cfa_offset 16102; CHECK-NEXT:    .cfi_offset w29, -16103; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096104; CHECK-NEXT:    .cfi_def_cfa_offset 4112105; CHECK-NEXT:    str xzr, [sp]106; CHECK-NEXT:    mov x8, sp107; CHECK-NEXT:    str x8, [x0]108; CHECK-NEXT:    add sp, sp, #1, lsl #12 // =4096109; CHECK-NEXT:    .cfi_def_cfa_offset 16110; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload111; CHECK-NEXT:    .cfi_def_cfa_offset 0112; CHECK-NEXT:    .cfi_restore w29113; CHECK-NEXT:    ret114entry:115  %v = alloca i8, i64 4096, align 1116  store ptr %v, ptr %out, align 8117  ret void118}119 120; 4k+16 bytes, still needs just one probe.121define void @static_4112(ptr %out) #0 {122; CHECK-LABEL: static_4112:123; CHECK:       // %bb.0: // %entry124; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill125; CHECK-NEXT:    .cfi_def_cfa_offset 16126; CHECK-NEXT:    .cfi_offset w29, -16127; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096128; CHECK-NEXT:    .cfi_def_cfa_offset 4112129; CHECK-NEXT:    str xzr, [sp], #-16130; CHECK-NEXT:    .cfi_def_cfa_offset 4128131; CHECK-NEXT:    mov x8, sp132; CHECK-NEXT:    str x8, [x0]133; CHECK-NEXT:    add sp, sp, #1, lsl #12 // =4096134; CHECK-NEXT:    .cfi_def_cfa_offset 32135; CHECK-NEXT:    add sp, sp, #16136; CHECK-NEXT:    .cfi_def_cfa_offset 16137; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload138; CHECK-NEXT:    .cfi_def_cfa_offset 0139; CHECK-NEXT:    .cfi_restore w29140; CHECK-NEXT:    ret141entry:142  %v = alloca i8, i64 4112, align 1143  store ptr %v, ptr %out, align 8144  ret void145}146 147; 4k+1024 bytes, the largest frame which needs just one probe.148define void @static_5120(ptr %out) #0 {149; CHECK-LABEL: static_5120:150; CHECK:       // %bb.0: // %entry151; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill152; CHECK-NEXT:    .cfi_def_cfa_offset 16153; CHECK-NEXT:    .cfi_offset w29, -16154; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096155; CHECK-NEXT:    .cfi_def_cfa_offset 4112156; CHECK-NEXT:    str xzr, [sp]157; CHECK-NEXT:    sub sp, sp, #1024158; CHECK-NEXT:    .cfi_def_cfa_offset 5136159; CHECK-NEXT:    mov x8, sp160; CHECK-NEXT:    str x8, [x0]161; CHECK-NEXT:    add sp, sp, #1, lsl #12 // =4096162; CHECK-NEXT:    .cfi_def_cfa_offset 1040163; CHECK-NEXT:    add sp, sp, #1024164; CHECK-NEXT:    .cfi_def_cfa_offset 16165; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload166; CHECK-NEXT:    .cfi_def_cfa_offset 0167; CHECK-NEXT:    .cfi_restore w29168; CHECK-NEXT:    ret169entry:170  %v = alloca i8, i64 5120, align 1171  store ptr %v, ptr %out, align 8172  ret void173}174 175; 4k+1024+16, the smallest frame which needs two probes.176define void @static_5136(ptr %out) #0 {177; CHECK-LABEL: static_5136:178; CHECK:       // %bb.0: // %entry179; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill180; CHECK-NEXT:    .cfi_def_cfa_offset 16181; CHECK-NEXT:    .cfi_offset w29, -16182; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096183; CHECK-NEXT:    .cfi_def_cfa_offset 4112184; CHECK-NEXT:    str xzr, [sp]185; CHECK-NEXT:    sub sp, sp, #1040186; CHECK-NEXT:    .cfi_def_cfa_offset 5152187; CHECK-NEXT:    str xzr, [sp]188; CHECK-NEXT:    mov x8, sp189; CHECK-NEXT:    str x8, [x0]190; CHECK-NEXT:    add sp, sp, #1, lsl #12 // =4096191; CHECK-NEXT:    .cfi_def_cfa_offset 1056192; CHECK-NEXT:    add sp, sp, #1040193; CHECK-NEXT:    .cfi_def_cfa_offset 16194; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload195; CHECK-NEXT:    .cfi_def_cfa_offset 0196; CHECK-NEXT:    .cfi_restore w29197; CHECK-NEXT:    ret198entry:199  %v = alloca i8, i64 5136, align 1200  store ptr %v, ptr %out, align 8201  ret void202}203 204; 2*4k+1024, the largest frame needing two probes205define void @static_9216(ptr %out) #0 {206; CHECK-LABEL: static_9216:207; CHECK:       // %bb.0: // %entry208; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill209; CHECK-NEXT:    .cfi_def_cfa_offset 16210; CHECK-NEXT:    .cfi_offset w29, -16211; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096212; CHECK-NEXT:    .cfi_def_cfa_offset 4112213; CHECK-NEXT:    str xzr, [sp]214; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096215; CHECK-NEXT:    .cfi_def_cfa_offset 8208216; CHECK-NEXT:    str xzr, [sp]217; CHECK-NEXT:    sub sp, sp, #1024218; CHECK-NEXT:    .cfi_def_cfa_offset 9232219; CHECK-NEXT:    mov x8, sp220; CHECK-NEXT:    str x8, [x0]221; CHECK-NEXT:    add sp, sp, #2, lsl #12 // =8192222; CHECK-NEXT:    .cfi_def_cfa_offset 1040223; CHECK-NEXT:    add sp, sp, #1024224; CHECK-NEXT:    .cfi_def_cfa_offset 16225; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload226; CHECK-NEXT:    .cfi_def_cfa_offset 0227; CHECK-NEXT:    .cfi_restore w29228; CHECK-NEXT:    ret229entry:230  %v = alloca i8, i64 9216, align 1231  store ptr %v, ptr %out, align 8232  ret void233}234 235; 5*4k-16, the largest frame probed without a loop236define void @static_20464(ptr %out) #0 {237; CHECK-LABEL: static_20464:238; CHECK:       // %bb.0: // %entry239; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill240; CHECK-NEXT:    .cfi_def_cfa_offset 16241; CHECK-NEXT:    .cfi_offset w29, -16242; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096243; CHECK-NEXT:    .cfi_def_cfa_offset 4112244; CHECK-NEXT:    str xzr, [sp]245; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096246; CHECK-NEXT:    .cfi_def_cfa_offset 8208247; CHECK-NEXT:    str xzr, [sp]248; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096249; CHECK-NEXT:    .cfi_def_cfa_offset 12304250; CHECK-NEXT:    str xzr, [sp]251; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096252; CHECK-NEXT:    .cfi_def_cfa_offset 16400253; CHECK-NEXT:    str xzr, [sp]254; CHECK-NEXT:    sub sp, sp, #4080255; CHECK-NEXT:    .cfi_def_cfa_offset 20480256; CHECK-NEXT:    str xzr, [sp]257; CHECK-NEXT:    mov x8, sp258; CHECK-NEXT:    str x8, [x0]259; CHECK-NEXT:    add sp, sp, #4, lsl #12 // =16384260; CHECK-NEXT:    .cfi_def_cfa_offset 4096261; CHECK-NEXT:    add sp, sp, #4080262; CHECK-NEXT:    .cfi_def_cfa_offset 16263; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload264; CHECK-NEXT:    .cfi_def_cfa_offset 0265; CHECK-NEXT:    .cfi_restore w29266; CHECK-NEXT:    ret267entry:268  %v = alloca i8, i64 20464, align 1269  store ptr %v, ptr %out, align 8270  ret void271}272 273; 5*4k, the smallest frame probed with a loop274define void @static_20480(ptr %out) #0 {275; CHECK-LABEL: static_20480:276; CHECK:       // %bb.0: // %entry277; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill278; CHECK-NEXT:    .cfi_def_cfa_offset 16279; CHECK-NEXT:    .cfi_offset w29, -16280; CHECK-NEXT:    sub x9, sp, #5, lsl #12 // =20480281; CHECK-NEXT:    .cfi_def_cfa w9, 20496282; CHECK-NEXT:  .LBB10_1: // %entry283; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1284; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096285; CHECK-NEXT:    str xzr, [sp]286; CHECK-NEXT:    cmp sp, x9287; CHECK-NEXT:    b.ne .LBB10_1288; CHECK-NEXT:  // %bb.2: // %entry289; CHECK-NEXT:    .cfi_def_cfa_register wsp290; CHECK-NEXT:    mov x8, sp291; CHECK-NEXT:    str x8, [x0]292; CHECK-NEXT:    add sp, sp, #5, lsl #12 // =20480293; CHECK-NEXT:    .cfi_def_cfa_offset 16294; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload295; CHECK-NEXT:    .cfi_def_cfa_offset 0296; CHECK-NEXT:    .cfi_restore w29297; CHECK-NEXT:    ret298entry:299  %v = alloca i8, i64 20480, align 1300  store ptr %v, ptr %out, align 8301  ret void302}303 304; 5*4k + 1024, large enough to use a loop, but not a multiple of 4KiB305; so has a reminder, but no extra probe.306define void @static_21504(ptr %out) #0 {307; CHECK-LABEL: static_21504:308; CHECK:       // %bb.0: // %entry309; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill310; CHECK-NEXT:    .cfi_def_cfa_offset 16311; CHECK-NEXT:    .cfi_offset w29, -16312; CHECK-NEXT:    sub x9, sp, #5, lsl #12 // =20480313; CHECK-NEXT:    .cfi_def_cfa w9, 20496314; CHECK-NEXT:  .LBB11_1: // %entry315; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1316; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096317; CHECK-NEXT:    str xzr, [sp]318; CHECK-NEXT:    cmp sp, x9319; CHECK-NEXT:    b.ne .LBB11_1320; CHECK-NEXT:  // %bb.2: // %entry321; CHECK-NEXT:    .cfi_def_cfa_register wsp322; CHECK-NEXT:    sub sp, sp, #1024323; CHECK-NEXT:    .cfi_def_cfa_offset 21520324; CHECK-NEXT:    mov x8, sp325; CHECK-NEXT:    str x8, [x0]326; CHECK-NEXT:    add sp, sp, #5, lsl #12 // =20480327; CHECK-NEXT:    .cfi_def_cfa_offset 1040328; CHECK-NEXT:    add sp, sp, #1024329; CHECK-NEXT:    .cfi_def_cfa_offset 16330; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload331; CHECK-NEXT:    .cfi_def_cfa_offset 0332; CHECK-NEXT:    .cfi_restore w29333; CHECK-NEXT:    ret334entry:335  %v = alloca i8, i64 21504, align 1336  store ptr %v, ptr %out, align 8337  ret void338}339 340; 5*4k+1040, large enough to use a loop, has a reminder and341; an extra probe.342define void @static_21520(ptr %out) #0 {343; CHECK-LABEL: static_21520:344; CHECK:       // %bb.0: // %entry345; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill346; CHECK-NEXT:    .cfi_def_cfa_offset 16347; CHECK-NEXT:    .cfi_offset w29, -16348; CHECK-NEXT:    sub x9, sp, #5, lsl #12 // =20480349; CHECK-NEXT:    .cfi_def_cfa w9, 20496350; CHECK-NEXT:  .LBB12_1: // %entry351; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1352; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096353; CHECK-NEXT:    str xzr, [sp]354; CHECK-NEXT:    cmp sp, x9355; CHECK-NEXT:    b.ne .LBB12_1356; CHECK-NEXT:  // %bb.2: // %entry357; CHECK-NEXT:    .cfi_def_cfa_register wsp358; CHECK-NEXT:    sub sp, sp, #1040359; CHECK-NEXT:    .cfi_def_cfa_offset 21536360; CHECK-NEXT:    str xzr, [sp]361; CHECK-NEXT:    mov x8, sp362; CHECK-NEXT:    str x8, [x0]363; CHECK-NEXT:    add sp, sp, #5, lsl #12 // =20480364; CHECK-NEXT:    .cfi_def_cfa_offset 1056365; CHECK-NEXT:    add sp, sp, #1040366; CHECK-NEXT:    .cfi_def_cfa_offset 16367; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload368; CHECK-NEXT:    .cfi_def_cfa_offset 0369; CHECK-NEXT:    .cfi_restore w29370; CHECK-NEXT:    ret371entry:372  %v = alloca i8, i64 21520, align 1373  store ptr %v, ptr %out, align 8374  ret void375}376 377; A small allocation, but with a very large alignment requirement. We do this378; by moving SP far enough that a sufficiently-aligned block will exist379; somewhere in the stack frame, so must probe the whole of that larger SP move.380define void @static_16_align_8192(ptr %out) #0 {381; CHECK-LABEL: static_16_align_8192:382; CHECK:       // %bb.0: // %entry383; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill384; CHECK-NEXT:    .cfi_def_cfa_offset 16385; CHECK-NEXT:    mov x29, sp386; CHECK-NEXT:    .cfi_def_cfa w29, 16387; CHECK-NEXT:    .cfi_offset w30, -8388; CHECK-NEXT:    .cfi_offset w29, -16389; CHECK-NEXT:    sub x9, sp, #1, lsl #12 // =4096390; CHECK-NEXT:    sub x9, x9, #4080391; CHECK-NEXT:    and x9, x9, #0xffffffffffffe000392; CHECK-NEXT:  .LBB13_1: // %entry393; CHECK-NEXT:    // =>This Inner Loop Header: Depth=1394; CHECK-NEXT:    sub sp, sp, #1, lsl #12 // =4096395; CHECK-NEXT:    cmp sp, x9396; CHECK-NEXT:    b.le .LBB13_3397; CHECK-NEXT:  // %bb.2: // %entry398; CHECK-NEXT:    // in Loop: Header=BB13_1 Depth=1399; CHECK-NEXT:    str xzr, [sp]400; CHECK-NEXT:    b .LBB13_1401; CHECK-NEXT:  .LBB13_3: // %entry402; CHECK-NEXT:    mov sp, x9403; CHECK-NEXT:    ldr xzr, [sp]404; CHECK-NEXT:    mov x8, sp405; CHECK-NEXT:    str x8, [x0]406; CHECK-NEXT:    mov sp, x29407; CHECK-NEXT:    .cfi_def_cfa wsp, 16408; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload409; CHECK-NEXT:    .cfi_def_cfa_offset 0410; CHECK-NEXT:    .cfi_restore w30411; CHECK-NEXT:    .cfi_restore w29412; CHECK-NEXT:    ret413entry:414  %v = alloca i8, i64 16, align 8192415  store ptr %v, ptr %out, align 8416  ret void417}418 419; A small allocation with a very large alignment requirement, but420; nevertheless small enough as to not need a loop.421define void @static_16_align_2048(ptr %out) #0 {422; CHECK-LABEL: static_16_align_2048:423; CHECK:       // %bb.0: // %entry424; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill425; CHECK-NEXT:    .cfi_def_cfa_offset 16426; CHECK-NEXT:    mov x29, sp427; CHECK-NEXT:    .cfi_def_cfa w29, 16428; CHECK-NEXT:    .cfi_offset w30, -8429; CHECK-NEXT:    .cfi_offset w29, -16430; CHECK-NEXT:    sub x9, sp, #2032431; CHECK-NEXT:    and sp, x9, #0xfffffffffffff800432; CHECK-NEXT:    str xzr, [sp]433; CHECK-NEXT:    mov x8, sp434; CHECK-NEXT:    str x8, [x0]435; CHECK-NEXT:    mov sp, x29436; CHECK-NEXT:    .cfi_def_cfa wsp, 16437; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload438; CHECK-NEXT:    .cfi_def_cfa_offset 0439; CHECK-NEXT:    .cfi_restore w30440; CHECK-NEXT:    .cfi_restore w29441; CHECK-NEXT:    ret442entry:443  %v = alloca i8, i64 16, align 2048444  store ptr %v, ptr %out, align 8445  ret void446}447 448; A large(-ish) allocation with a very large alignment requirement, but449; nevertheless small enough as to not need a loop.450define void @static_2032_align_2048(ptr %out) #0 {451; CHECK-LABEL: static_2032_align_2048:452; CHECK:       // %bb.0: // %entry453; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill454; CHECK-NEXT:    .cfi_def_cfa_offset 16455; CHECK-NEXT:    mov x29, sp456; CHECK-NEXT:    .cfi_def_cfa w29, 16457; CHECK-NEXT:    .cfi_offset w30, -8458; CHECK-NEXT:    .cfi_offset w29, -16459; CHECK-NEXT:    sub x9, sp, #2032460; CHECK-NEXT:    and sp, x9, #0xfffffffffffff800461; CHECK-NEXT:    str xzr, [sp]462; CHECK-NEXT:    mov x8, sp463; CHECK-NEXT:    str x8, [x0]464; CHECK-NEXT:    mov sp, x29465; CHECK-NEXT:    .cfi_def_cfa wsp, 16466; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload467; CHECK-NEXT:    .cfi_def_cfa_offset 0468; CHECK-NEXT:    .cfi_restore w30469; CHECK-NEXT:    .cfi_restore w29470; CHECK-NEXT:    ret471entry:472  %v = alloca i8, i64 2032, align 2048473  store ptr %v, ptr %out, align 8474  ret void475}476 477; Test stack probing is enabled by module flags478define void @static_9232(ptr %out) uwtable(async) {479; CHECK-LABEL: static_9232:480; CHECK:       // %bb.0: // %entry481; CHECK-NEXT:    str x29, [sp, #-16]! // 8-byte Folded Spill482; CHECK-NEXT:    .cfi_def_cfa_offset 16483; CHECK-NEXT:    .cfi_offset w29, -16484; CHECK-NEXT:    sub sp, sp, #2, lsl #12 // =8192485; CHECK-NEXT:    .cfi_def_cfa_offset 8208486; CHECK-NEXT:    sub sp, sp, #800487; CHECK-NEXT:    .cfi_def_cfa_offset 9008488; CHECK-NEXT:    str xzr, [sp], #-240489; CHECK-NEXT:    .cfi_def_cfa_offset 9248490; CHECK-NEXT:    mov x8, sp491; CHECK-NEXT:    str x8, [x0]492; CHECK-NEXT:    add sp, sp, #2, lsl #12 // =8192493; CHECK-NEXT:    .cfi_def_cfa_offset 1056494; CHECK-NEXT:    add sp, sp, #1040495; CHECK-NEXT:    .cfi_def_cfa_offset 16496; CHECK-NEXT:    ldr x29, [sp], #16 // 8-byte Folded Reload497; CHECK-NEXT:    .cfi_def_cfa_offset 0498; CHECK-NEXT:    .cfi_restore w29499; CHECK-NEXT:    ret500entry:501  %v = alloca i8, i64 9232, align 1502  store ptr %v, ptr %out, align 8503  ret void504}505 506; Test for a tight upper bound on the amount of stack adjustment507; due to stack realignment. No probes should appear.508define void @static_1008(ptr %out) #0 {509; CHECK-LABEL: static_1008:510; CHECK:       // %bb.0: // %entry511; CHECK-NEXT:    stp x29, x30, [sp, #-16]! // 16-byte Folded Spill512; CHECK-NEXT:    .cfi_def_cfa_offset 16513; CHECK-NEXT:    mov x29, sp514; CHECK-NEXT:    .cfi_def_cfa w29, 16515; CHECK-NEXT:    .cfi_offset w30, -8516; CHECK-NEXT:    .cfi_offset w29, -16517; CHECK-NEXT:    sub x9, sp, #1008518; CHECK-NEXT:    and sp, x9, #0xffffffffffffffe0519; CHECK-NEXT:    mov x8, sp520; CHECK-NEXT:    str x8, [x0]521; CHECK-NEXT:    mov sp, x29522; CHECK-NEXT:    .cfi_def_cfa wsp, 16523; CHECK-NEXT:    ldp x29, x30, [sp], #16 // 16-byte Folded Reload524; CHECK-NEXT:    .cfi_def_cfa_offset 0525; CHECK-NEXT:    .cfi_restore w30526; CHECK-NEXT:    .cfi_restore w29527; CHECK-NEXT:    ret528entry:529  %v = alloca i8, i32 1008, align 32530  store ptr %v, ptr %out, align 8531  ret void532}533 534attributes #0 = { uwtable(async) "probe-stack"="inline-asm" "stack-probe-size"="4096" "frame-pointer"="none" }535 536!llvm.module.flags = !{!0, !1}537 538!0 = !{i32 4, !"probe-stack", !"inline-asm"}539!1 = !{i32 8, !"stack-probe-size", i32 9000}540