llvm-project/llvm/test/CodeGen/WinEH/wineh-dynamic-alloca.ll
Mirko 926a71f0c9
[CodeGen][WinEH] Update saved esp for inlined inallocas (#116585)
This fixes issue #116583

When inalloca calls are inlined the static stack pointer saving prolog
of X86WinEHState breaks due to dynamic allocas.
In this case we need to update the saved esp for every inalloca and for
every stackrestore also related to inalloca.
2024-11-21 13:58:43 -08:00

96 lines
3.2 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc < %s | FileCheck %s
target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32-a:0:32-S32"
target triple = "i386-pc-windows-msvc"
%struct.Foo = type { i32, i32 }
@bar = external global i1
define dso_local noundef i32 @foo() local_unnamed_addr #0 personality ptr @__CxxFrameHandler3 {
; CHECK-LABEL: foo:
; CHECK: # %bb.0: # %entry
; CHECK-NEXT: pushl %ebp
; CHECK-NEXT: movl %esp, %ebp
; CHECK-NEXT: pushl %ebx
; CHECK-NEXT: pushl %edi
; CHECK-NEXT: pushl %esi
; CHECK-NEXT: subl $16, %esp
; CHECK-NEXT: movl %esp, -28(%ebp)
; CHECK-NEXT: movl $-1, -16(%ebp)
; CHECK-NEXT: leal -24(%ebp), %eax
; CHECK-NEXT: movl $___ehhandler$foo, -20(%ebp)
; CHECK-NEXT: movl %fs:0, %ecx
; CHECK-NEXT: movl %ecx, -24(%ebp)
; CHECK-NEXT: movl %eax, %fs:0
; CHECK-NEXT: cmpb $1, _bar
; CHECK-NEXT: je LBB0_1
; CHECK-NEXT: LBB0_5: # %exit
; CHECK-NEXT: $ehgcr_0_5:
; CHECK-NEXT: movl -24(%ebp), %eax
; CHECK-NEXT: movl %eax, %fs:0
; CHECK-NEXT: xorl %eax, %eax
; CHECK-NEXT: leal -12(%ebp), %esp
; CHECK-NEXT: popl %esi
; CHECK-NEXT: popl %edi
; CHECK-NEXT: popl %ebx
; CHECK-NEXT: popl %ebp
; CHECK-NEXT: retl
; CHECK-NEXT: LBB0_1: # %if.then
; CHECK-NEXT: pushl %eax
; CHECK-NEXT: pushl %eax
; CHECK-NEXT: movl %esp, %eax
; CHECK-NEXT: movl %esp, -28(%ebp)
; CHECK-NEXT: movl $123, (%eax)
; CHECK-NEXT: movl $0, -16(%ebp)
; CHECK-NEXT: calll _alwaysthrows
; CHECK-NEXT: # %bb.4: # %unreachable.i
; CHECK-NEXT: LBB0_3: # Block address taken
; CHECK-NEXT: # %catch.i
; CHECK-NEXT: addl $12, %ebp
; CHECK-NEXT: jmp LBB0_5
; CHECK-NEXT: .def "?catch$2@?0?foo@4HA";
; CHECK-NEXT: .scl 3;
; CHECK-NEXT: .type 32;
; CHECK-NEXT: .endef
; CHECK-NEXT: .p2align 4
; CHECK-NEXT: "?catch$2@?0?foo@4HA":
; CHECK-NEXT: LBB0_2: # %catch.i
; CHECK-NEXT: pushl %ebp
; CHECK-NEXT: addl $12, %ebp
; CHECK-NEXT: movl %esp, -28(%ebp)
; CHECK-NEXT: movl $LBB0_3, %eax
; CHECK-NEXT: popl %ebp
; CHECK-NEXT: retl # CATCHRET
; CHECK-NEXT: Lfunc_end0:
entry:
%cmp = load i1, ptr @bar
br i1 %cmp, label %if.then, label %exit
if.then: ; preds = %entry
%foo = alloca <{ %struct.Foo }>, align 4
store i32 123, ptr %foo, align 4
invoke void @alwaysthrows() #1
to label %unreachable.i unwind label %catch.dispatch.i
catch.dispatch.i: ; preds = %if.then
%3 = catchswitch within none [label %catch.i] unwind to caller
catch.i: ; preds = %catch.dispatch.i
%4 = catchpad within %3 [ptr null, i32 64, ptr null]
catchret from %4 to label %exit
unreachable.i: ; preds = %if.then
unreachable
exit: ; preds = %entry, %catch.i
ret i32 0
}
declare dso_local i32 @__CxxFrameHandler3(...)
declare dso_local void @alwaysthrows() local_unnamed_addr
attributes #0 = { norecurse "min-legal-vector-width"="0" "target-cpu"="pentium4" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" }
attributes #1 = { noreturn }