78 lines · plain
1; RUN: llc -mtriple x86_64-pc-windows-msvc -o - %s | FileCheck %s2 3; struct S { int x; };4; void foo() {5; struct S __declspec(align(32)) o;6; __try { o.x; }7; __finally { o.x; }8; }9; void bar() {10; struct S o;11; __try { o.x; }12; __finally { o.x; }13; }14 15%struct.S = type { i32 }16 17define dso_local void @"?foo@@YAXXZ"() #0 {18entry:19; CHECK-LABEL: foo20; CHECK: movq %rsp, %rdx21; CHECK-NOT: movq %rbp, %rdx22 23 %o = alloca %struct.S, align 3224 call void (...) @llvm.localescape(ptr %o)25 %0 = call ptr @llvm.localaddress()26 call void @"?fin$0@0@foo@@"(i8 0, ptr %0)27 ret void28}29 30; void bar(void)31; {32; int x;33; void (*fn)(int);34;35; __try {36; x = 1;37; fn(x);38; } __finally {39; x = 2;40; }41; }42 43define dso_local void @"?bar@@YAXXZ"() personality ptr @__C_specific_handler {44entry:45; CHECK-LABEL: bar46; CHECK: movq %rbp, %rdx47; CHECK-NOT: movq %rsp, %rdx48 %x = alloca i32, align 449 %fn = alloca ptr, align 850 call void (...) @llvm.localescape(ptr %x)51 store i32 1, ptr %x, align 452 %0 = load ptr, ptr %fn, align 853 %1 = load i32, ptr %x, align 454 invoke void %0(i32 %1)55 to label %invoke.cont unwind label %ehcleanup56 invoke.cont: ; preds = %entry57 %2 = call ptr @llvm.localaddress()58 call void @"?fin$0@0@bar@@"(i8 0, ptr %2)59 ret void60 ehcleanup: ; preds = %entry61 %3 = cleanuppad within none []62 %4 = call ptr @llvm.localaddress()63 call void @"?fin$0@0@bar@@"(i8 1, ptr %4) [ "funclet"(token %3) ]64 cleanupret from %3 unwind to caller65}66 67declare void @"?fin$0@0@foo@@"(i8 %abnormal_termination, ptr %frame_pointer)68 69declare void @"?fin$0@0@bar@@"(i8 %abnormal_termination, ptr %frame_pointer)70 71declare ptr @llvm.localrecover(ptr, ptr, i32)72 73declare ptr @llvm.localaddress()74 75declare void @llvm.localescape(...)76 77declare dso_local i32 @__C_specific_handler(...)78