| # RUN: llc -mtriple thumbv7m-none-eabi -run-pass prologepilog %s -o - | FileCheck %s |
| |
| --- | |
| define void @throw() noreturn { unreachable } |
| |
| define void @ret() nounwind { ret void } |
| |
| define void @tables() nounwind noreturn uwtable { ret void } |
| |
| define void @noret() noreturn nounwind { |
| start: |
| %p = alloca i32 |
| store i32 42, i32* %p |
| unreachable |
| } |
| ... |
| --- |
| # This function may return by exception. Check that $r4 is saved and restored. |
| # CHECK-LABEL: name: throw |
| # CHECK: killed $r4 |
| # CHECK: def $r4 |
| name: throw |
| body: | |
| bb.0: |
| $r4 = IMPLICIT_DEF |
| tBX_RET 14, $noreg |
| --- |
| --- |
| # This function may return. Check that $r4 is saved and restored. |
| # CHECK-LABEL: name: ret |
| # CHECK: killed $r4 |
| # CHECK: def $r4 |
| name: ret |
| body: | |
| bb.0: |
| $r4 = IMPLICIT_DEF |
| tBX_RET 14, $noreg |
| --- |
| --- |
| # This function needs correct unwind tables anyway. Check that $r4 is saved and |
| # restored. |
| # CHECK-LABEL: name: tables |
| # CHECK: killed $r4 |
| # CHECK: def $r4 |
| name: tables |
| body: | |
| bb.0: |
| $r4 = IMPLICIT_DEF |
| tBX_RET 14, $noreg |
| --- |
| --- |
| # This function does not return. We need not save any CSR, but |
| # other stack adjustments in the prologue are still necessary. |
| # CHECK-LABEL: name: noret |
| # CHECK-NOT: killed $r4 |
| # CHECK-NOT: def $r4 |
| # CHECK: $sp = frame-setup |
| name: noret |
| stack: |
| - { id: 0, name: p, offset: 0, size: 4, alignment: 4, local-offset: -4 } |
| body: | |
| bb.0: |
| $r4 = IMPLICIT_DEF |
| tBX_RET 14, $noreg |
| --- |