xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/cleanuppad-realign.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=i686-pc-windows-msvc -stack-symbol-ordering=0 < %s | FileCheck --check-prefix=X86 %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-pc-windows-msvc -stack-symbol-ordering=0 < %s | FileCheck --check-prefix=X64 %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdeclare i32 @__CxxFrameHandler3(...)
5*9880d681SAndroid Build Coastguard Workerdeclare void @Dtor(i64* %o)
6*9880d681SAndroid Build Coastguard Workerdeclare void @f(i32)
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine void @realigned_cleanup() personality i32 (...)* @__CxxFrameHandler3 {
9*9880d681SAndroid Build Coastguard Workerentry:
10*9880d681SAndroid Build Coastguard Worker  ; Overalign %o to cause stack realignment.
11*9880d681SAndroid Build Coastguard Worker  %o = alloca i64, align 32
12*9880d681SAndroid Build Coastguard Worker  invoke void @f(i32 1)
13*9880d681SAndroid Build Coastguard Worker          to label %invoke.cont unwind label %ehcleanup
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerinvoke.cont:                                      ; preds = %entry
16*9880d681SAndroid Build Coastguard Worker  call void @Dtor(i64* %o)
17*9880d681SAndroid Build Coastguard Worker  ret void
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerehcleanup:                                        ; preds = %entry
20*9880d681SAndroid Build Coastguard Worker  %0 = cleanuppad within none []
21*9880d681SAndroid Build Coastguard Worker  call void @Dtor(i64* %o) [ "funclet"(token %0) ]
22*9880d681SAndroid Build Coastguard Worker  cleanupret from %0 unwind to caller
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; X86-LABEL: _realigned_cleanup: # @realigned_cleanup
26*9880d681SAndroid Build Coastguard Worker; X86:         pushl   %ebp
27*9880d681SAndroid Build Coastguard Worker; X86:         movl    %esp, %ebp
28*9880d681SAndroid Build Coastguard Worker; X86:         pushl   %ebx
29*9880d681SAndroid Build Coastguard Worker; X86:         pushl   %edi
30*9880d681SAndroid Build Coastguard Worker; X86:         pushl   %esi
31*9880d681SAndroid Build Coastguard Worker; X86:         andl    $-32, %esp
32*9880d681SAndroid Build Coastguard Worker; X86:         subl    $96, %esp
33*9880d681SAndroid Build Coastguard Worker; X86:         movl    %esp, %esi
34*9880d681SAndroid Build Coastguard Worker;	EBP will reload from this offset.
35*9880d681SAndroid Build Coastguard Worker; X86:         movl    %ebp, 28(%esi)
36*9880d681SAndroid Build Coastguard Worker; 	The last EH reg field is the state number, so dtor adjust is this +4.
37*9880d681SAndroid Build Coastguard Worker; X86:         movl    $-1, 72(%esi)
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; X86-LABEL: "?dtor$2@?0?realigned_cleanup@4HA":
40*9880d681SAndroid Build Coastguard Worker; X86:         pushl   %ebp
41*9880d681SAndroid Build Coastguard Worker; X86:         leal    -76(%ebp), %esi
42*9880d681SAndroid Build Coastguard Worker; X86:         movl    28(%esi), %ebp
43*9880d681SAndroid Build Coastguard Worker;	We used to have a bug where we clobbered ESI after the prologue.
44*9880d681SAndroid Build Coastguard Worker; X86-NOT: 	movl {{.*}}, %esi
45*9880d681SAndroid Build Coastguard Worker; X86:         popl    %ebp
46*9880d681SAndroid Build Coastguard Worker; X86:         retl                            # CLEANUPRET
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; X64-LABEL: realigned_cleanup: # @realigned_cleanup
49*9880d681SAndroid Build Coastguard Worker; X64:         pushq   %rbp
50*9880d681SAndroid Build Coastguard Worker; X64:         .seh_pushreg 5
51*9880d681SAndroid Build Coastguard Worker; X64:         pushq   %rbx
52*9880d681SAndroid Build Coastguard Worker; X64:         .seh_pushreg 3
53*9880d681SAndroid Build Coastguard Worker; X64:         subq    $104, %rsp
54*9880d681SAndroid Build Coastguard Worker; X64:         .seh_stackalloc 104
55*9880d681SAndroid Build Coastguard Worker; X64:         leaq    96(%rsp), %rbp
56*9880d681SAndroid Build Coastguard Worker; X64:         .seh_setframe 5, 96
57*9880d681SAndroid Build Coastguard Worker; X64:         .seh_endprologue
58*9880d681SAndroid Build Coastguard Worker; X64:         andq    $-32, %rsp
59*9880d681SAndroid Build Coastguard Worker; X64:         movq    %rsp, %rbx
60*9880d681SAndroid Build Coastguard Worker;	RBP will reload from this offset.
61*9880d681SAndroid Build Coastguard Worker; X64:         movq    %rbp, 56(%rbx)
62*9880d681SAndroid Build Coastguard Worker; X64: 	       movq    $-2, (%rbp)
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker; X64-LABEL: "?dtor$2@?0?realigned_cleanup@4HA":
65*9880d681SAndroid Build Coastguard Worker; X64:         movq    %rdx, 16(%rsp)
66*9880d681SAndroid Build Coastguard Worker; X64:         pushq   %rbp
67*9880d681SAndroid Build Coastguard Worker; X64:         .seh_pushreg 5
68*9880d681SAndroid Build Coastguard Worker; X64:         pushq   %rbx
69*9880d681SAndroid Build Coastguard Worker; X64:         .seh_pushreg 3
70*9880d681SAndroid Build Coastguard Worker; X64:         subq    $40, %rsp
71*9880d681SAndroid Build Coastguard Worker; X64:         .seh_stackalloc 40
72*9880d681SAndroid Build Coastguard Worker; X64:         leaq    96(%rdx), %rbp
73*9880d681SAndroid Build Coastguard Worker; X64:         .seh_endprologue
74*9880d681SAndroid Build Coastguard Worker; X64: 	       andq    $-32, %rdx
75*9880d681SAndroid Build Coastguard Worker; X64: 	       movq    %rdx, %rbx
76*9880d681SAndroid Build Coastguard Worker; X64-NOT: 	mov{{.*}}, %rbx
77*9880d681SAndroid Build Coastguard Worker; X64:         popq    %rbp
78*9880d681SAndroid Build Coastguard Worker; X64:         retq                            # CLEANUPRET
79