| ; RUN: llc -O0 -frame-pointer=all < %s | FileCheck %s |
| |
| ; Check that CFI instructions are generated properly when |
| ; a frame pointer, variable length array and callee-saved |
| ; registers are all present at the same time |
| |
| target datalayout = "e-m:e-p:16:16-i32:16-i64:16-f32:16-f64:16-a:8-n8:16-S16" |
| target triple = "msp430-unknown-unknown-elf" |
| |
| @g = global float 0.0 |
| @N = external global i16, align 2 |
| |
| define void @foo() { |
| ; CHECK-LABEL: foo: |
| ; CHECK: push r4 |
| ; CHECK-NEXT: .cfi_def_cfa_offset 4 |
| ; CHECK-NEXT: .cfi_offset r4, -4 |
| ; CHECK-NEXT: mov r1, r4 |
| ; CHECK-NEXT: .cfi_def_cfa_register r4 |
| ; CHECK: push r6 |
| ; CHECK-NEXT: push r7 |
| ; CHECK-NEXT: push r8 |
| ; CHECK-NEXT: push r9 |
| ; CHECK-NEXT: push r10 |
| ; CHECK: .cfi_offset r6, -6 |
| ; CHECK: .cfi_offset r7, -8 |
| ; CHECK: .cfi_offset r8, -10 |
| ; CHECK: .cfi_offset r9, -12 |
| ; CHECK: .cfi_offset r10, -14 |
| |
| %n = load i16, ptr @N, align 2 |
| %vla = alloca i8, i16 %n, align 1 |
| %t1 = load volatile float, float* @g |
| %t2 = load volatile float, float* @g |
| %t3 = load volatile float, float* @g |
| %t4 = load volatile float, float* @g |
| %t5 = load volatile float, float* @g |
| store volatile float %t1, float* @g |
| store volatile float %t2, float* @g |
| store volatile float %t3, float* @g |
| store volatile float %t4, float* @g |
| store volatile float %t5, float* @g |
| |
| ; CHECK: mov r4, r1 |
| ; CHECK-NEXT: sub #10, r1 |
| ; CHECK: pop r10 |
| ; CHECK-NEXT: pop r9 |
| ; CHECK-NEXT: pop r8 |
| ; CHECK-NEXT: pop r7 |
| ; CHECK-NEXT: pop r6 |
| ; CHECK: pop r4 |
| ; CHECK: .cfi_def_cfa r1, 2 |
| ; CHECK: .cfi_restore r6 |
| ; CHECK: .cfi_restore r7 |
| ; CHECK: .cfi_restore r8 |
| ; CHECK: .cfi_restore r9 |
| ; CHECK: .cfi_restore r10 |
| |
| ret void |
| } |