288 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-pc-win32 | FileCheck %s3; RUN: llc < %s -mtriple=x86_64-pc-win32 -mattr=+sahf | FileCheck %s4; RUN: llc < %s -mtriple=x86_64-uefi | FileCheck %s5; RUN: llc < %s -mtriple=x86_64-uefi -mattr=+sahf | FileCheck %s6 7define i32 @f1(i32 %p1, i32 %p2, i32 %p3, i32 %p4, i32 %p5) "frame-pointer"="all" {8; CHECK-LABEL: f1:9; CHECK: # %bb.0:10; CHECK-NEXT: pushq %rbp11; CHECK-NEXT: .seh_pushreg %rbp12; CHECK-NEXT: movq %rsp, %rbp13; CHECK-NEXT: .seh_setframe %rbp, 014; CHECK-NEXT: .seh_endprologue15; CHECK-NEXT: movl 48(%rbp), %eax16; CHECK-NEXT: .seh_startepilogue17; CHECK-NEXT: popq %rbp18; CHECK-NEXT: .seh_endepilogue19; CHECK-NEXT: retq20; CHECK-NEXT: .seh_endproc21 ret i32 %p522}23 24define void @f2(i32 %p, ...) "frame-pointer"="all" {25; CHECK-LABEL: f2:26; CHECK: # %bb.0:27; CHECK-NEXT: pushq %rbp28; CHECK-NEXT: .seh_pushreg %rbp29; CHECK-NEXT: pushq %rax30; CHECK-NEXT: .seh_stackalloc 831; CHECK-NEXT: movq %rsp, %rbp32; CHECK-NEXT: .seh_setframe %rbp, 033; CHECK-NEXT: .seh_endprologue34; CHECK-NEXT: movq %rdx, 32(%rbp)35; CHECK-NEXT: movq %r8, 40(%rbp)36; CHECK-NEXT: movq %r9, 48(%rbp)37; CHECK-NEXT: leaq 32(%rbp), %rax38; CHECK-NEXT: movq %rax, (%rbp)39; CHECK-NEXT: .seh_startepilogue40; CHECK-NEXT: addq $8, %rsp41; CHECK-NEXT: popq %rbp42; CHECK-NEXT: .seh_endepilogue43; CHECK-NEXT: retq44; CHECK-NEXT: .seh_endproc45 %ap = alloca i8, align 846 call void @llvm.va_start(ptr %ap)47 ret void48}49 50define ptr @f3() "frame-pointer"="all" {51; CHECK-LABEL: f3:52; CHECK: # %bb.0:53; CHECK-NEXT: pushq %rbp54; CHECK-NEXT: .seh_pushreg %rbp55; CHECK-NEXT: movq %rsp, %rbp56; CHECK-NEXT: .seh_setframe %rbp, 057; CHECK-NEXT: .seh_endprologue58; CHECK-NEXT: movq 8(%rbp), %rax59; CHECK-NEXT: .seh_startepilogue60; CHECK-NEXT: popq %rbp61; CHECK-NEXT: .seh_endepilogue62; CHECK-NEXT: retq63; CHECK-NEXT: .seh_endproc64 %ra = call ptr @llvm.returnaddress(i32 0)65 ret ptr %ra66}67 68define ptr @f4() "frame-pointer"="all" {69; CHECK-LABEL: f4:70; CHECK: # %bb.0:71; CHECK-NEXT: pushq %rbp72; CHECK-NEXT: .seh_pushreg %rbp73; CHECK-NEXT: subq $304, %rsp # imm = 0x13074; CHECK-NEXT: .seh_stackalloc 30475; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rbp76; CHECK-NEXT: .seh_setframe %rbp, 12877; CHECK-NEXT: .seh_endprologue78; CHECK-NEXT: movq 184(%rbp), %rax79; CHECK-NEXT: .seh_startepilogue80; CHECK-NEXT: addq $304, %rsp # imm = 0x13081; CHECK-NEXT: popq %rbp82; CHECK-NEXT: .seh_endepilogue83; CHECK-NEXT: retq84; CHECK-NEXT: .seh_endproc85 alloca [300 x i8]86 %ra = call ptr @llvm.returnaddress(i32 0)87 ret ptr %ra88}89 90declare void @external(ptr)91 92define void @f5() "frame-pointer"="all" {93; CHECK-LABEL: f5:94; CHECK: # %bb.0:95; CHECK-NEXT: pushq %rbp96; CHECK-NEXT: .seh_pushreg %rbp97; CHECK-NEXT: subq $336, %rsp # imm = 0x15098; CHECK-NEXT: .seh_stackalloc 33699; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rbp100; CHECK-NEXT: .seh_setframe %rbp, 128101; CHECK-NEXT: .seh_endprologue102; CHECK-NEXT: leaq -92(%rbp), %rcx103; CHECK-NEXT: callq external104; CHECK-NEXT: nop105; CHECK-NEXT: .seh_startepilogue106; CHECK-NEXT: addq $336, %rsp # imm = 0x150107; CHECK-NEXT: popq %rbp108; CHECK-NEXT: .seh_endepilogue109; CHECK-NEXT: retq110; CHECK-NEXT: .seh_endproc111 %a = alloca [300 x i8]112 call void @external(ptr %a)113 ret void114}115 116define void @f6(i32 %p, ...) "frame-pointer"="all" {117; CHECK-LABEL: f6:118; CHECK: # %bb.0:119; CHECK-NEXT: pushq %rbp120; CHECK-NEXT: .seh_pushreg %rbp121; CHECK-NEXT: subq $336, %rsp # imm = 0x150122; CHECK-NEXT: .seh_stackalloc 336123; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rbp124; CHECK-NEXT: .seh_setframe %rbp, 128125; CHECK-NEXT: .seh_endprologue126; CHECK-NEXT: leaq -92(%rbp), %rcx127; CHECK-NEXT: callq external128; CHECK-NEXT: nop129; CHECK-NEXT: .seh_startepilogue130; CHECK-NEXT: addq $336, %rsp # imm = 0x150131; CHECK-NEXT: popq %rbp132; CHECK-NEXT: .seh_endepilogue133; CHECK-NEXT: retq134; CHECK-NEXT: .seh_endproc135 %a = alloca [300 x i8]136 call void @external(ptr %a)137 ret void138}139 140define i32 @f7(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "frame-pointer"="all" {141; CHECK-LABEL: f7:142; CHECK: # %bb.0:143; CHECK-NEXT: pushq %rbp144; CHECK-NEXT: .seh_pushreg %rbp145; CHECK-NEXT: subq $304, %rsp # imm = 0x130146; CHECK-NEXT: .seh_stackalloc 304147; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rbp148; CHECK-NEXT: .seh_setframe %rbp, 128149; CHECK-NEXT: .seh_endprologue150; CHECK-NEXT: andq $-64, %rsp151; CHECK-NEXT: movl 224(%rbp), %eax152; CHECK-NEXT: .seh_startepilogue153; CHECK-NEXT: leaq 176(%rbp), %rsp154; CHECK-NEXT: popq %rbp155; CHECK-NEXT: .seh_endepilogue156; CHECK-NEXT: retq157; CHECK-NEXT: .seh_endproc158 alloca [300 x i8], align 64159 ret i32 %e160}161 162define i32 @f8(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) "frame-pointer"="all" {163; CHECK-LABEL: f8:164; CHECK: # %bb.0:165; CHECK-NEXT: pushq %rbp166; CHECK-NEXT: .seh_pushreg %rbp167; CHECK-NEXT: pushq %rsi168; CHECK-NEXT: .seh_pushreg %rsi169; CHECK-NEXT: pushq %rbx170; CHECK-NEXT: .seh_pushreg %rbx171; CHECK-NEXT: subq $352, %rsp # imm = 0x160172; CHECK-NEXT: .seh_stackalloc 352173; CHECK-NEXT: leaq {{[0-9]+}}(%rsp), %rbp174; CHECK-NEXT: .seh_setframe %rbp, 128175; CHECK-NEXT: .seh_endprologue176; CHECK-NEXT: andq $-64, %rsp177; CHECK-NEXT: movq %rsp, %rbx178; CHECK-NEXT: movl 288(%rbp), %esi179; CHECK-NEXT: movl %ecx, %eax180; CHECK-NEXT: leaq 15(,%rax,4), %rax181; CHECK-NEXT: andq $-16, %rax182; CHECK-NEXT: callq __chkstk183; CHECK-NEXT: subq %rax, %rsp184; CHECK-NEXT: subq $32, %rsp185; CHECK-NEXT: movq %rbx, %rcx186; CHECK-NEXT: callq external187; CHECK-NEXT: addq $32, %rsp188; CHECK-NEXT: movl %esi, %eax189; CHECK-NEXT: .seh_startepilogue190; CHECK-NEXT: leaq 224(%rbp), %rsp191; CHECK-NEXT: popq %rbx192; CHECK-NEXT: popq %rsi193; CHECK-NEXT: popq %rbp194; CHECK-NEXT: .seh_endepilogue195; CHECK-NEXT: retq196; CHECK-NEXT: .seh_endproc197 %alloca = alloca [300 x i8], align 64198 alloca i32, i32 %a199 call void @external(ptr %alloca)200 ret i32 %e201}202 203define i64 @f9() {204; CHECK-LABEL: f9:205; CHECK: # %bb.0: # %entry206; CHECK-NEXT: pushq %rbp207; CHECK-NEXT: .seh_pushreg %rbp208; CHECK-NEXT: movq %rsp, %rbp209; CHECK-NEXT: .seh_setframe %rbp, 0210; CHECK-NEXT: .seh_endprologue211; CHECK-NEXT: pushfq212; CHECK-NEXT: popq %rax213; CHECK-NEXT: .seh_startepilogue214; CHECK-NEXT: popq %rbp215; CHECK-NEXT: .seh_endepilogue216; CHECK-NEXT: retq217; CHECK-NEXT: .seh_endproc218entry:219 %call = call i64 @llvm.x86.flags.read.u64()220 ret i64 %call221}222 223declare i64 @dummy()224 225define i64 @f10(ptr %foo, i64 %bar, i64 %baz) {226; CHECK-LABEL: f10:227; CHECK: # %bb.0:228; CHECK-NEXT: pushq %rsi229; CHECK-NEXT: .seh_pushreg %rsi230; CHECK-NEXT: pushq %rbx231; CHECK-NEXT: .seh_pushreg %rbx232; CHECK-NEXT: subq $40, %rsp233; CHECK-NEXT: .seh_stackalloc 40234; CHECK-NEXT: .seh_endprologue235; CHECK-NEXT: movq %rdx, %rsi236; CHECK-NEXT: movq %rdx, %rax237; CHECK-NEXT: lock cmpxchgq %r8, (%rcx)238; CHECK-NEXT: sete %bl239; CHECK-NEXT: callq dummy240; CHECK-NEXT: testb %bl, %bl241; CHECK-NEXT: cmoveq %rsi, %rax242; CHECK-NEXT: .seh_startepilogue243; CHECK-NEXT: addq $40, %rsp244; CHECK-NEXT: popq %rbx245; CHECK-NEXT: popq %rsi246; CHECK-NEXT: .seh_endepilogue247; CHECK-NEXT: retq248; CHECK-NEXT: .seh_endproc249 %cx = cmpxchg ptr %foo, i64 %bar, i64 %baz seq_cst seq_cst250 %v = extractvalue { i64, i1 } %cx, 0251 %p = extractvalue { i64, i1 } %cx, 1252 %call = call i64 @dummy()253 %sel = select i1 %p, i64 %call, i64 %bar254 ret i64 %sel255}256 257define ptr @f11() "frame-pointer"="all" {258; CHECK-LABEL: f11:259; CHECK: # %bb.0:260; CHECK-NEXT: pushq %rbp261; CHECK-NEXT: .seh_pushreg %rbp262; CHECK-NEXT: movq %rsp, %rbp263; CHECK-NEXT: .seh_setframe %rbp, 0264; CHECK-NEXT: .seh_endprologue265; CHECK-NEXT: leaq 8(%rbp), %rax266; CHECK-NEXT: .seh_startepilogue267; CHECK-NEXT: popq %rbp268; CHECK-NEXT: .seh_endepilogue269; CHECK-NEXT: retq270; CHECK-NEXT: .seh_endproc271 %aora = call ptr @llvm.addressofreturnaddress()272 ret ptr %aora273}274 275define ptr @f12() {276; CHECK-LABEL: f12:277; CHECK: # %bb.0:278; CHECK-NEXT: movq %rsp, %rax279; CHECK-NEXT: retq280 %aora = call ptr @llvm.addressofreturnaddress()281 ret ptr %aora282}283 284declare ptr @llvm.returnaddress(i32) nounwind readnone285declare ptr @llvm.addressofreturnaddress() nounwind readnone286declare i64 @llvm.x86.flags.read.u64()287declare void @llvm.va_start(ptr) nounwind288