| ; 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 |
| } |