; RUN: llc -mtriple=i686-pc-windows-msvc -stack-symbol-ordering=0 < %s | FileCheck --check-prefix=X86 %s ; RUN: llc -mtriple=x86_64-pc-windows-msvc -stack-symbol-ordering=0 < %s | FileCheck --check-prefix=X64 %s declare i32 @__CxxFrameHandler3(...) declare void @Dtor(ptr %o) declare void @f(i32) define void @realigned_cleanup() personality ptr @__CxxFrameHandler3 { entry: ; Overalign %o to cause stack realignment. %o = alloca i64, align 32 invoke void @f(i32 1) to label %invoke.cont unwind label %ehcleanup invoke.cont: ; preds = %entry call void @Dtor(ptr %o) ret void ehcleanup: ; preds = %entry %0 = cleanuppad within none [] call void @Dtor(ptr %o) [ "funclet"(token %0) ] cleanupret from %0 unwind to caller } ; X86-LABEL: _realigned_cleanup: # @realigned_cleanup ; X86: pushl %ebp ; X86: movl %esp, %ebp ; X86: pushl %ebx ; X86: pushl %edi ; X86: pushl %esi ; X86: andl $-32, %esp ; X86: subl $96, %esp ; X86: movl %esp, %esi ; EBP will reload from this offset. ; X86: movl %ebp, 28(%esi) ; The last EH reg field is the state number, so dtor adjust is this +4. ; X86: movl $-1, 72(%esi) ; X86-LABEL: "?dtor$2@?0?realigned_cleanup@4HA": ; X86: pushl %ebp ; X86: leal -76(%ebp), %esi ; X86: movl 28(%esi), %ebp ; We used to have a bug where we clobbered ESI after the prologue. ; X86-NOT: movl {{.*}}, %esi ; X86: popl %ebp ; X86: retl # CLEANUPRET ; X64-LABEL: realigned_cleanup: # @realigned_cleanup ; X64: pushq %rbp ; X64: .seh_pushreg %rbp ; X64: pushq %rbx ; X64: .seh_pushreg %rbx ; X64: subq $104, %rsp ; X64: .seh_stackalloc 104 ; X64: leaq 96(%rsp), %rbp ; X64: .seh_setframe %rbp, 96 ; X64: .seh_endprologue ; X64: andq $-32, %rsp ; X64: movq %rsp, %rbx ; RBP will reload from this offset. ; X64: movq %rbp, 56(%rbx) ; X64: movq $-2, (%rbp) ; X64-LABEL: "?dtor$2@?0?realigned_cleanup@4HA": ; X64: movq %rdx, 16(%rsp) ; X64: pushq %rbp ; X64: .seh_pushreg %rbp ; X64: pushq %rbx ; X64: .seh_pushreg %rbx ; X64: subq $40, %rsp ; X64: .seh_stackalloc 40 ; X64: leaq 96(%rdx), %rbp ; X64: .seh_endprologue ; X64: andq $-32, %rdx ; X64: movq %rdx, %rbx ; X64-NOT: mov{{.*}}, %rbx ; X64: popq %rbp ; X64: retq # CLEANUPRET