1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --no_x86_scrub_sp 2; RUN: llc -mtriple=x86_64-linux-android < %s | FileCheck -check-prefix=CHECK-X64 %s 3; RUN: llc -mtriple=i686-linux-android < %s | FileCheck -check-prefix=CHECK-X86 %s 4; RUN: llc -mtriple=x86_64-linux-gnux32 < %s | FileCheck -check-prefix=CHECK-X32 %s 5 6define i32 @foo() local_unnamed_addr #0 { 7; CHECK-X64-LABEL: foo: 8; CHECK-X64: # %bb.0: 9; CHECK-X64-NEXT: movq %rsp, %r11 10; CHECK-X64-NEXT: subq $69632, %r11 # imm = 0x11000 11; CHECK-X64-NEXT: .cfi_def_cfa_register %r11 12; CHECK-X64-NEXT: .cfi_adjust_cfa_offset 69632 13; CHECK-X64-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 14; CHECK-X64-NEXT: subq $4096, %rsp # imm = 0x1000 15; CHECK-X64-NEXT: movq $0, (%rsp) 16; CHECK-X64-NEXT: cmpq %r11, %rsp 17; CHECK-X64-NEXT: jne .LBB0_1 18; CHECK-X64-NEXT: # %bb.2: 19; CHECK-X64-NEXT: subq $2248, %rsp # imm = 0x8C8 20; CHECK-X64-NEXT: .cfi_def_cfa_register %rsp 21; CHECK-X64-NEXT: .cfi_def_cfa_offset 71888 22; CHECK-X64-NEXT: movl $1, 264(%rsp) 23; CHECK-X64-NEXT: movl $1, 28664(%rsp) 24; CHECK-X64-NEXT: movl -128(%rsp), %eax 25; CHECK-X64-NEXT: addq $71880, %rsp # imm = 0x118C8 26; CHECK-X64-NEXT: .cfi_def_cfa_offset 8 27; CHECK-X64-NEXT: retq 28; 29; CHECK-X86-LABEL: foo: 30; CHECK-X86: # %bb.0: 31; CHECK-X86-NEXT: movl %esp, %eax 32; CHECK-X86-NEXT: subl $69632, %eax # imm = 0x11000 33; CHECK-X86-NEXT: .cfi_def_cfa_register %eax 34; CHECK-X86-NEXT: .cfi_adjust_cfa_offset 69632 35; CHECK-X86-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 36; CHECK-X86-NEXT: subl $4096, %esp # imm = 0x1000 37; CHECK-X86-NEXT: movl $0, (%esp) 38; CHECK-X86-NEXT: cmpl %eax, %esp 39; CHECK-X86-NEXT: jne .LBB0_1 40; CHECK-X86-NEXT: # %bb.2: 41; CHECK-X86-NEXT: subl $2380, %esp # imm = 0x94C 42; CHECK-X86-NEXT: .cfi_def_cfa_register %esp 43; CHECK-X86-NEXT: .cfi_def_cfa_offset 72016 44; CHECK-X86-NEXT: movl $1, 392(%esp) 45; CHECK-X86-NEXT: movl $1, 28792(%esp) 46; CHECK-X86-NEXT: movl (%esp), %eax 47; CHECK-X86-NEXT: addl $72012, %esp # imm = 0x1194C 48; CHECK-X86-NEXT: .cfi_def_cfa_offset 4 49; CHECK-X86-NEXT: retl 50; 51; CHECK-X32-LABEL: foo: 52; CHECK-X32: # %bb.0: 53; CHECK-X32-NEXT: movl %esp, %r11d 54; CHECK-X32-NEXT: subl $69632, %r11d # imm = 0x11000 55; CHECK-X32-NEXT: .cfi_def_cfa_register %r11 56; CHECK-X32-NEXT: .cfi_adjust_cfa_offset 69632 57; CHECK-X32-NEXT: .LBB0_1: # =>This Inner Loop Header: Depth=1 58; CHECK-X32-NEXT: subl $4096, %esp # imm = 0x1000 59; CHECK-X32-NEXT: movq $0, (%esp) 60; CHECK-X32-NEXT: cmpl %r11d, %esp 61; CHECK-X32-NEXT: jne .LBB0_1 62; CHECK-X32-NEXT: # %bb.2: 63; CHECK-X32-NEXT: subl $2248, %esp # imm = 0x8C8 64; CHECK-X32-NEXT: .cfi_def_cfa_register %rsp 65; CHECK-X32-NEXT: .cfi_def_cfa_offset 71888 66; CHECK-X32-NEXT: movl $1, 264(%esp) 67; CHECK-X32-NEXT: movl $1, 28664(%esp) 68; CHECK-X32-NEXT: movl -128(%esp), %eax 69; CHECK-X32-NEXT: addl $71880, %esp # imm = 0x118C8 70; CHECK-X32-NEXT: .cfi_def_cfa_offset 8 71; CHECK-X32-NEXT: retq 72 %a = alloca i32, i64 18000, align 16 73 %b0 = getelementptr inbounds i32, ptr %a, i64 98 74 %b1 = getelementptr inbounds i32, ptr %a, i64 7198 75 store volatile i32 1, ptr %b0 76 store volatile i32 1, ptr %b1 77 %c = load volatile i32, ptr %a 78 ret i32 %c 79} 80 81define void @push_before_probe(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g, i32 %h) "probe-stack"="inline-asm" "no_caller_saved_registers" { 82; CHECK-X64-LABEL: push_before_probe: 83; CHECK-X64: # %bb.0: 84; CHECK-X64-NEXT: pushq %rax 85; CHECK-X64-NEXT: .cfi_def_cfa_offset 16 86; CHECK-X64-NEXT: movq %rsp, %r11 87; CHECK-X64-NEXT: subq $69632, %r11 # imm = 0x11000 88; CHECK-X64-NEXT: .cfi_def_cfa_register %r11 89; CHECK-X64-NEXT: .cfi_adjust_cfa_offset 69632 90; CHECK-X64-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 91; CHECK-X64-NEXT: subq $4096, %rsp # imm = 0x1000 92; CHECK-X64-NEXT: movq $0, (%rsp) 93; CHECK-X64-NEXT: cmpq %r11, %rsp 94; CHECK-X64-NEXT: jne .LBB1_1 95; CHECK-X64-NEXT: # %bb.2: 96; CHECK-X64-NEXT: subq $2240, %rsp # imm = 0x8C0 97; CHECK-X64-NEXT: .cfi_def_cfa_register %rsp 98; CHECK-X64-NEXT: .cfi_def_cfa_offset 71888 99; CHECK-X64-NEXT: .cfi_offset %rax, -16 100; CHECK-X64-NEXT: movl 71888(%rsp), %eax 101; CHECK-X64-NEXT: addl %esi, %edi 102; CHECK-X64-NEXT: addl %ecx, %edx 103; CHECK-X64-NEXT: addl %edi, %edx 104; CHECK-X64-NEXT: addl %r9d, %r8d 105; CHECK-X64-NEXT: addl 71896(%rsp), %eax 106; CHECK-X64-NEXT: addl %r8d, %eax 107; CHECK-X64-NEXT: addl %edx, %eax 108; CHECK-X64-NEXT: movl %eax, 264(%rsp) 109; CHECK-X64-NEXT: movl %eax, 28664(%rsp) 110; CHECK-X64-NEXT: addq $71872, %rsp # imm = 0x118C0 111; CHECK-X64-NEXT: .cfi_def_cfa_offset 16 112; CHECK-X64-NEXT: popq %rax 113; CHECK-X64-NEXT: .cfi_def_cfa_offset 8 114; CHECK-X64-NEXT: retq 115; 116; CHECK-X86-LABEL: push_before_probe: 117; CHECK-X86: # %bb.0: 118; CHECK-X86-NEXT: pushl %esi 119; CHECK-X86-NEXT: .cfi_def_cfa_offset 8 120; CHECK-X86-NEXT: pushl %edx 121; CHECK-X86-NEXT: .cfi_def_cfa_offset 12 122; CHECK-X86-NEXT: pushl %ecx 123; CHECK-X86-NEXT: .cfi_def_cfa_offset 16 124; CHECK-X86-NEXT: pushl %eax 125; CHECK-X86-NEXT: .cfi_def_cfa_offset 20 126; CHECK-X86-NEXT: movl %esp, %eax 127; CHECK-X86-NEXT: subl $69632, %eax # imm = 0x11000 128; CHECK-X86-NEXT: .cfi_def_cfa_register %eax 129; CHECK-X86-NEXT: .cfi_adjust_cfa_offset 69632 130; CHECK-X86-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 131; CHECK-X86-NEXT: subl $4096, %esp # imm = 0x1000 132; CHECK-X86-NEXT: movl $0, (%esp) 133; CHECK-X86-NEXT: cmpl %eax, %esp 134; CHECK-X86-NEXT: jne .LBB1_1 135; CHECK-X86-NEXT: # %bb.2: 136; CHECK-X86-NEXT: subl $2380, %esp # imm = 0x94C 137; CHECK-X86-NEXT: .cfi_def_cfa_register %esp 138; CHECK-X86-NEXT: .cfi_def_cfa_offset 72032 139; CHECK-X86-NEXT: .cfi_offset %eax, -20 140; CHECK-X86-NEXT: .cfi_offset %ecx, -16 141; CHECK-X86-NEXT: .cfi_offset %edx, -12 142; CHECK-X86-NEXT: .cfi_offset %esi, -8 143; CHECK-X86-NEXT: movl 72056(%esp), %eax 144; CHECK-X86-NEXT: movl 72048(%esp), %edx 145; CHECK-X86-NEXT: movl 72040(%esp), %ecx 146; CHECK-X86-NEXT: movl 72032(%esp), %esi 147; CHECK-X86-NEXT: addl 72036(%esp), %esi 148; CHECK-X86-NEXT: addl 72044(%esp), %ecx 149; CHECK-X86-NEXT: addl %esi, %ecx 150; CHECK-X86-NEXT: addl 72052(%esp), %edx 151; CHECK-X86-NEXT: addl 72060(%esp), %eax 152; CHECK-X86-NEXT: addl %edx, %eax 153; CHECK-X86-NEXT: addl %ecx, %eax 154; CHECK-X86-NEXT: movl %eax, 392(%esp) 155; CHECK-X86-NEXT: movl %eax, 28792(%esp) 156; CHECK-X86-NEXT: addl $72012, %esp # imm = 0x1194C 157; CHECK-X86-NEXT: .cfi_def_cfa_offset 20 158; CHECK-X86-NEXT: popl %eax 159; CHECK-X86-NEXT: .cfi_def_cfa_offset 16 160; CHECK-X86-NEXT: popl %ecx 161; CHECK-X86-NEXT: .cfi_def_cfa_offset 12 162; CHECK-X86-NEXT: popl %edx 163; CHECK-X86-NEXT: .cfi_def_cfa_offset 8 164; CHECK-X86-NEXT: popl %esi 165; CHECK-X86-NEXT: .cfi_def_cfa_offset 4 166; CHECK-X86-NEXT: retl 167; 168; CHECK-X32-LABEL: push_before_probe: 169; CHECK-X32: # %bb.0: 170; CHECK-X32-NEXT: pushq %rax 171; CHECK-X32-NEXT: .cfi_def_cfa_offset 16 172; CHECK-X32-NEXT: movl %esp, %r11d 173; CHECK-X32-NEXT: subl $69632, %r11d # imm = 0x11000 174; CHECK-X32-NEXT: .cfi_def_cfa_register %r11 175; CHECK-X32-NEXT: .cfi_adjust_cfa_offset 69632 176; CHECK-X32-NEXT: .LBB1_1: # =>This Inner Loop Header: Depth=1 177; CHECK-X32-NEXT: subl $4096, %esp # imm = 0x1000 178; CHECK-X32-NEXT: movq $0, (%esp) 179; CHECK-X32-NEXT: cmpl %r11d, %esp 180; CHECK-X32-NEXT: jne .LBB1_1 181; CHECK-X32-NEXT: # %bb.2: 182; CHECK-X32-NEXT: subl $2240, %esp # imm = 0x8C0 183; CHECK-X32-NEXT: .cfi_def_cfa_register %rsp 184; CHECK-X32-NEXT: .cfi_def_cfa_offset 71888 185; CHECK-X32-NEXT: .cfi_offset %rax, -16 186; CHECK-X32-NEXT: movl 71888(%esp), %eax 187; CHECK-X32-NEXT: addl %esi, %edi 188; CHECK-X32-NEXT: addl %ecx, %edx 189; CHECK-X32-NEXT: addl %edi, %edx 190; CHECK-X32-NEXT: addl %r9d, %r8d 191; CHECK-X32-NEXT: addl 71896(%esp), %eax 192; CHECK-X32-NEXT: addl %r8d, %eax 193; CHECK-X32-NEXT: addl %edx, %eax 194; CHECK-X32-NEXT: movl %eax, 264(%esp) 195; CHECK-X32-NEXT: movl %eax, 28664(%esp) 196; CHECK-X32-NEXT: addl $71872, %esp # imm = 0x118C0 197; CHECK-X32-NEXT: .cfi_def_cfa_offset 16 198; CHECK-X32-NEXT: popq %rax 199; CHECK-X32-NEXT: .cfi_def_cfa_offset 8 200; CHECK-X32-NEXT: retq 201 %all = alloca i32, i64 18000, align 16 202 %b0 = getelementptr inbounds i32, ptr %all, i64 98 203 %b1 = getelementptr inbounds i32, ptr %all, i64 7198 204 %ab = add i32 %a, %b 205 %cd = add i32 %c, %d 206 %ef = add i32 %e, %f 207 %gh = add i32 %g, %h 208 %abcd = add i32 %ab, %cd 209 %efgh = add i32 %ef, %gh 210 %sum = add i32 %abcd, %efgh 211 store volatile i32 %sum, ptr %b0 212 store volatile i32 %sum, ptr %b1 213 ret void 214} 215 216attributes #0 = {"probe-stack"="inline-asm"} 217