| # RUN: llc -o - %s -mtriple=arm-- -run-pass prologepilog | FileCheck %s |
| --- | |
| define swiftcc i8* @need_emergency_slot(i8 *swiftself %v) { |
| ; Just a dummy to add a swiftself bit. The real code is in the MI below. |
| unreachable |
| } |
| ... |
| --- |
| # CHECK-LABEL: name: need_emergency_slot |
| # Make sure we do not just assume an unsaved/restored callee saved register |
| # is free to use. Callee saved parameters may still be used if they were used |
| # to pass arguments (as in swiftself). |
| name: need_emergency_slot |
| tracksRegLiveness: true |
| stack: |
| - { id: 0, type: default, size: 8, alignment: 8 } |
| - { id: 1, type: default, size: 4096, alignment: 8 } |
| body: | |
| bb.0: |
| liveins: %r10 ; swiftself parameter comes in as %r10 |
| |
| ; Bring up register pressure to force emergency spilling, coax scavenging |
| ; to use %r10 as that one is not spilled/restored. |
| %r0 = IMPLICIT_DEF |
| %r1 = IMPLICIT_DEF |
| %r2 = IMPLICIT_DEF |
| %r3 = IMPLICIT_DEF |
| %r4 = IMPLICIT_DEF |
| %r5 = IMPLICIT_DEF |
| %r6 = IMPLICIT_DEF |
| %r7 = IMPLICIT_DEF |
| %r8 = IMPLICIT_DEF |
| %r9 = IMPLICIT_DEF |
| %r11 = IMPLICIT_DEF |
| %r12 = IMPLICIT_DEF |
| %lr = IMPLICIT_DEF |
| |
| ; Computing the large stack offset requires an extra register. We should |
| ; not just use %r10 for that. |
| ; CHECK-NOT: STRi12 %1,{{.*}}%r10 |
| |
| STRi12 %r1, %stack.0, 0, 14, _ :: (store 4) |
| |
| ; use the swiftself parameter value. |
| KILL %r10 |
| |
| KILL %r0 |
| KILL %r1 |
| KILL %r2 |
| KILL %r3 |
| KILL %r4 |
| KILL %r5 |
| KILL %r6 |
| KILL %r7 |
| KILL %r8 |
| KILL %r9 |
| KILL %r11 |
| KILL %r12 |
| KILL %lr |
| ... |