xref: /llvm-project/llvm/test/CodeGen/SPARC/stack-align.ll (revision 728490257ecc09ada707a0390303bd3c61027a53)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc -mtriple=sparc < %s | FileCheck %s --check-prefixes=CHECK32
3; RUN: llc -mtriple=sparcv9 < %s | FileCheck %s --check-prefixes=CHECK64
4declare void @stack_realign_helper(i32 %a, ptr %b)
5
6;; This is a function where we have a local variable of 64-byte
7;; alignment.  We want to see that the stack is aligned (the initial add/and),
8;; that the local var is accessed via stack pointer (to %o1), and that
9;; the argument is accessed via frame pointer not stack pointer (to %o0).
10
11define void @stack_realign(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e, i32 %f, i32 %g) nounwind {
12; CHECK32-LABEL: stack_realign:
13; CHECK32:       ! %bb.0: ! %entry
14; CHECK32-NEXT:    save %sp, -96, %sp
15; CHECK32-NEXT:    ld [%fp+92], %o0
16; CHECK32-NEXT:    add %sp, 80, %i0
17; CHECK32-NEXT:    and %i0, -64, %o1
18; CHECK32-NEXT:    call stack_realign_helper
19; CHECK32-NEXT:    add %o1, -96, %sp
20; CHECK32-NEXT:    ret
21; CHECK32-NEXT:    restore
22;
23; CHECK64-LABEL: stack_realign:
24; CHECK64:       ! %bb.0: ! %entry
25; CHECK64-NEXT:    save %sp, -128, %sp
26; CHECK64-NEXT:    add %sp, 2159, %i0
27; CHECK64-NEXT:    and %i0, -64, %o1
28; CHECK64-NEXT:    add %o1, -2175, %sp
29; CHECK64-NEXT:    add %sp, -48, %sp
30; CHECK64-NEXT:    call stack_realign_helper
31; CHECK64-NEXT:    ld [%fp+2227], %o0
32; CHECK64-NEXT:    add %sp, 48, %sp
33; CHECK64-NEXT:    ret
34; CHECK64-NEXT:    restore
35entry:
36  %aligned = alloca i32, align 64
37  call void @stack_realign_helper(i32 %g, ptr %aligned)
38  ret void
39}
40