118 lines · plain
1; RUN: llc -mtriple=x86_64-pc-windows-msvc -mattr=+avx < %s | FileCheck %s2 3; void bar(int a, int b, int c, int d, int e);4; void baz(int x);5; 6; void foo(int a, int b, int c, int d, int e)7; {8; __asm("nop" ::: "bx", "cx", "xmm5", "xmm6", "ymm7");9; try {10; bar(a, b, c, d, e);11; }12; catch (...) {13; baz(a);14; if (a)15; __asm("nop" ::: "xmm8");16; }17; }18 19%rtti.TypeDescriptor2 = type { ptr, ptr, [3 x i8] }20 21$"??_R0H@8" = comdat any22 23@"??_7type_info@@6B@" = external constant ptr24@"??_R0H@8" = linkonce_odr global %rtti.TypeDescriptor2 { ptr @"??_7type_info@@6B@", ptr null, [3 x i8] c".H\00" }, comdat25 26declare dso_local i32 @__CxxFrameHandler3(...)27declare dso_local void @"?bar@@YAXHHHHH@Z"(i32, i32, i32, i32, i32)28declare dso_local void @"?baz@@YAXH@Z"(i32)29 30define dso_local void @"?foo@@YAXHHHHH@Z"(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) personality ptr @__CxxFrameHandler3 {31entry:32 %e.addr = alloca i32, align 433 %d.addr = alloca i32, align 434 %c.addr = alloca i32, align 435 %b.addr = alloca i32, align 436 %a.addr = alloca i32, align 437 store i32 %e, ptr %e.addr, align 438 store i32 %d, ptr %d.addr, align 439 store i32 %c, ptr %c.addr, align 440 store i32 %b, ptr %b.addr, align 441 store i32 %a, ptr %a.addr, align 442 call void asm sideeffect "nop", "~{bx},~{cx},~{xmm5},~{xmm6},~{ymm7}"()43 %0 = load i32, ptr %e.addr, align 444 %1 = load i32, ptr %d.addr, align 445 %2 = load i32, ptr %c.addr, align 446 %3 = load i32, ptr %b.addr, align 447 %4 = load i32, ptr %a.addr, align 448 invoke void @"?bar@@YAXHHHHH@Z"(i32 %4, i32 %3, i32 %2, i32 %1, i32 %0)49 to label %invoke.cont unwind label %catch.dispatch50 51catch.dispatch: ; preds = %entry52 %5 = catchswitch within none [label %catch] unwind to caller53 54catch: ; preds = %catch.dispatch55 %6 = catchpad within %5 [ptr null, i32 64, ptr null]56 %7 = load i32, ptr %a.addr, align 457 call void @"?baz@@YAXH@Z"(i32 %7) [ "funclet"(token %6) ]58 %8 = load i32, ptr %a.addr, align 459 %tobool = icmp ne i32 %8, 060 br i1 %tobool, label %if.then, label %if.end61 62if.then: ; preds = %catch63 call void asm sideeffect "nop", "~{xmm8}"() [ "funclet"(token %6) ]64 br label %if.end65 66invoke.cont: ; preds = %entry67 br label %try.cont68 69if.end: ; preds = %if.then, %catch70 catchret from %6 to label %catchret.dest71 72catchret.dest: ; preds = %if.end73 br label %try.cont74 75try.cont: ; preds = %catchret.dest, %invoke.cont76 ret void77}78 79; CHECK: # %catch80; CHECK: movq %rdx, 16(%rsp)81; CHECK: pushq %rbp82; CHECK: .seh_pushreg %rbp83; CHECK: pushq %rbx84; CHECK: .seh_pushreg %rbx85; CHECK: subq $88, %rsp86; CHECK: .seh_stackalloc 8887; CHECK: leaq 112(%rdx), %rbp88; CHECK: vmovaps %xmm8, 32(%rsp)89; CHECK: .seh_savexmm %xmm8, 3290; CHECK: vmovaps %xmm7, 48(%rsp)91; CHECK: .seh_savexmm %xmm7, 4892; CHECK: vmovaps %xmm6, 64(%rsp)93; CHECK: .seh_savexmm %xmm6, 6494; CHECK: .seh_endprologue95; CHECK: movl -{{[0-9]+}}(%rbp), %ecx96; CHECK: vmovaps 64(%rsp), %xmm697; CHECK: vmovaps 48(%rsp), %xmm798; CHECK: vmovaps 32(%rsp), %xmm899; CHECK: leaq .LBB0_1(%rip), %rax100; CHECK: .seh_startepilogue101; CHECK: addq $88, %rsp102; CHECK: popq %rbx103; CHECK: popq %rbp104; CHECK: .seh_endepilogue105; CHECK: retq # CATCHRET106 107; CHECK-LABEL: "$handlerMap$0$?foo@@YAXHHHHH@Z":108; CHECK-NEXT: .long 64 # Adjectives109; CHECK-NEXT: .long 0 # Type110; CHECK-NEXT: .long 0 # CatchObjOffset111; CHECK-NEXT: .long "?catch$2@?0??foo@@YAXHHHHH@Z@4HA"@IMGREL # Handler112; Sum of:113; 16 RDX store offset114; 16 two pushes115; 72 stack alloc116; CHECK-NEXT: .long 120 # ParentFrameOffset117 118