Whenever a call to __chkstk was made, the frame lowering previously omitted the aligning (as NumBytes was reset to zero before doing alignment). This fixes https://github.com/llvm/llvm-project/issues/56182. The initial version of this produced invalid code for small functions with no local stack allocations, if those functions were marked with the "stackrealign" attribute. If building with -mstack-alignment=16 (which otherwise mostly would be a no-op), this attribute is added on the main function. Differential Revision: https://reviews.llvm.org/D135687
25 lines
796 B
LLVM
25 lines
796 B
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=aarch64-windows | FileCheck %s
|
|
|
|
define dso_local void @func() #0 {
|
|
; CHECK-LABEL: func:
|
|
; CHECK: .seh_proc func
|
|
; CHECK-NEXT: // %bb.0: // %entry
|
|
; CHECK-NEXT: stp x29, x30, [sp, #-16]! // 16-byte Folded Spill
|
|
; CHECK-NEXT: .seh_save_fplr_x 16
|
|
; CHECK-NEXT: mov x29, sp
|
|
; CHECK-NEXT: .seh_set_fp
|
|
; CHECK-NEXT: .seh_endprologue
|
|
; CHECK-NEXT: .seh_startepilogue
|
|
; CHECK-NEXT: ldp x29, x30, [sp], #16 // 16-byte Folded Reload
|
|
; CHECK-NEXT: .seh_save_fplr_x 16
|
|
; CHECK-NEXT: .seh_endepilogue
|
|
; CHECK-NEXT: ret
|
|
; CHECK-NEXT: .seh_endfunclet
|
|
; CHECK-NEXT: .seh_endproc
|
|
entry:
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { uwtable "frame-pointer"="none" "stackrealign" }
|