blob: be6ee0b967494d19cb32799ff2c5d1cab9c76728 [file] [edit]
; RUN: llc -O2 -mtriple=thumbv7-pc-windows-msvc < %s | FileCheck %s
; C++ source:
; struct X { int x[100]; };
; void g(int*, int*) noexcept;
; void f(X x, void (*a)()) {
; alignas(64) int aligned;
; struct A {
; X &x;
; int &aligned;
; ~A() {g(&x.x[11], &aligned);}
; } obj = {x, aligned};
; a();
; }
; Check that the changes in PR #184953 forcing r6 indexing in SEH funclets does not affect C++ EH.
%struct.X = type { [100 x i32] }
define dso_local arm_aapcs_vfpcc void @f(ptr noundef byval(%struct.X) align 4 %0, ptr noundef %1) personality ptr @__CxxFrameHandler3 {
entry:
; CHECK-LABEL: f:
; CHECK: .seh_proc f
; CHECK: .seh_handler __CxxFrameHandler3, %unwind, %except
; CHECK: push.w {r11, lr}
; CHECK: mov r11, sp
; CHECK: .seh_save_sp r11
; CHECK: .seh_endprologue
; CHECK: bfc [[REG1:r[0-9]+]], #0, #6
; CHECK: mov sp, [[REG1]]
%aligned = alloca i32, align 64
invoke arm_aapcs_vfpcc void %1()
to label %invoke.cont unwind label %ehcleanup
invoke.cont: ; preds = %entry
%gep.x = getelementptr inbounds i8, ptr %0, i32 44
call arm_aapcs_vfpcc void @g(ptr noundef nonnull %gep.x, ptr noundef nonnull %aligned)
ret void
ehcleanup: ; preds = %entry
%cp = cleanuppad within none []
; CHECK: .seh_proc {{.*}}dtor{{.*}}
; CHECK: push.w {r11, lr}
; CHECK: mov r11, sp
; CHECK: .seh_save_sp r11
; CHECK: .seh_endprologue
; CHECK: bfc [[REG2:r[0-9]+]], #0, #6
; CHECK: mov sp, [[REG2]]
; CHECK: add.w r0, r11, #{{[0-9]+}}
; CHECK: adds r0, #44
; CHECK: bl g
%gep.unwind = getelementptr inbounds i8, ptr %0, i32 44
call arm_aapcs_vfpcc void @g(ptr noundef nonnull %gep.unwind, ptr noundef nonnull %aligned) [ "funclet"(token %cp) ]
cleanupret from %cp unwind to caller
}
declare dso_local arm_aapcs_vfpcc i32 @__CxxFrameHandler3(...)
declare dso_local arm_aapcs_vfpcc void @g(ptr noundef, ptr noundef)