|  | ; 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(i64* %o) | 
|  | declare void @f(i32) | 
|  |  | 
|  | define void @realigned_cleanup() personality i32 (...)* @__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(i64* %o) | 
|  | ret void | 
|  |  | 
|  | ehcleanup:                                        ; preds = %entry | 
|  | %0 = cleanuppad within none [] | 
|  | call void @Dtor(i64* %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 5 | 
|  | ; X64:         pushq   %rbx | 
|  | ; X64:         .seh_pushreg 3 | 
|  | ; X64:         subq    $104, %rsp | 
|  | ; X64:         .seh_stackalloc 104 | 
|  | ; X64:         leaq    96(%rsp), %rbp | 
|  | ; X64:         .seh_setframe 5, 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 5 | 
|  | ; X64:         pushq   %rbx | 
|  | ; X64:         .seh_pushreg 3 | 
|  | ; 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 |