blob: e1e1f11b2e074b95f1603f63d6a50cf7a1dba6a7 [file] [edit]
; RUN: llc -mtriple=hexagon -mattr=+hvxv68,+hvx-length128b < %s | FileCheck %s
; When a function needs dynamic stack realignment, AP (here r16) is
; initialized by PS_aligna in the prologue. AP is a callee-saved register, so it
; must be saved before PS_aligna clobbers it and restored on the way out.
; PS_aligna is created during prologue emission (after callee-saved registers
; are determined), so HexagonFrameLowering::determineCalleeSaves must explicitly
; add AP to the save set; otherwise the caller's r16 is corrupted.
; CHECK-LABEL: f:
; CHECK: r16 = and(r30,#-128)
; CHECK: memd(r30+#-8) = r17:16
; CHECK: r17:16 = memd(r30+#-8)
; CHECK: dealloc_return
declare void @use(ptr, ptr)
define void @f(i32 %n) {
entry:
; Variable-sized alloca -> hasVarSizedObjects -> needsAligna.
%vla = alloca i32, i32 %n, align 4
; Over-aligned local -> MaxAlign > stack alignment -> real realignment.
%buf = alloca [16 x i32], align 128
call void @use(ptr %vla, ptr %buf)
ret void
}