Skip to content

Commit 9211977

Browse files
[AArch64][SME] Return false from produceCompactUnwindFrame if VG save required. (#104588)
The compact unwind format requires all registers are stored in pairs, so return false from produceCompactUnwindFrame if we require saving VG.
1 parent 8b1916b commit 9211977

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

llvm/lib/Target/AArch64/AArch64FrameLowering.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2860,7 +2860,8 @@ static bool produceCompactUnwindFrame(MachineFunction &MF) {
28602860
return Subtarget.isTargetMachO() &&
28612861
!(Subtarget.getTargetLowering()->supportSwiftError() &&
28622862
Attrs.hasAttrSomewhere(Attribute::SwiftError)) &&
2863-
MF.getFunction().getCallingConv() != CallingConv::SwiftTail;
2863+
MF.getFunction().getCallingConv() != CallingConv::SwiftTail &&
2864+
!requiresSaveVG(MF);
28642865
}
28652866

28662867
static bool invalidateWindowsRegisterPairing(unsigned Reg1, unsigned Reg2,
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
; RUN: llc -mtriple=aarch64-darwin -mattr=+sve -mattr=+sme -verify-machineinstrs < %s | FileCheck %s
2+
3+
declare void @normal_callee();
4+
5+
define void @locally_streaming_fn() #0 {
6+
; CHECK-LABEL: locally_streaming_fn:
7+
; CHECK: ; %bb.0:
8+
; CHECK-NEXT: stp d15, d14, [sp, #-96]! ; 16-byte Folded Spill
9+
; CHECK-NEXT: .cfi_def_cfa_offset 96
10+
; CHECK-NEXT: rdsvl x9, #1
11+
; CHECK-NEXT: stp d13, d12, [sp, #16] ; 16-byte Folded Spill
12+
; CHECK-NEXT: lsr x9, x9, #3
13+
; CHECK-NEXT: stp d11, d10, [sp, #32] ; 16-byte Folded Spill
14+
; CHECK-NEXT: stp d9, d8, [sp, #48] ; 16-byte Folded Spill
15+
; CHECK-NEXT: stp x30, x9, [sp, #64] ; 16-byte Folded Spill
16+
; CHECK-NEXT: cntd x9
17+
; CHECK-NEXT: str x9, [sp, #80] ; 8-byte Folded Spill
18+
; CHECK-NEXT: .cfi_offset vg, -16
19+
; CHECK-NEXT: .cfi_offset w30, -32
20+
; CHECK-NEXT: .cfi_offset b8, -40
21+
; CHECK-NEXT: .cfi_offset b9, -48
22+
; CHECK-NEXT: .cfi_offset b10, -56
23+
; CHECK-NEXT: .cfi_offset b11, -64
24+
; CHECK-NEXT: .cfi_offset b12, -72
25+
; CHECK-NEXT: .cfi_offset b13, -80
26+
; CHECK-NEXT: .cfi_offset b14, -88
27+
; CHECK-NEXT: .cfi_offset b15, -96
28+
; CHECK-NEXT: smstart sm
29+
; CHECK-NEXT: .cfi_offset vg, -24
30+
; CHECK-NEXT: smstop sm
31+
; CHECK-NEXT: bl _normal_callee
32+
; CHECK-NEXT: smstart sm
33+
; CHECK-NEXT: .cfi_restore vg
34+
; CHECK-NEXT: smstop sm
35+
; CHECK-NEXT: ldp d9, d8, [sp, #48] ; 16-byte Folded Reload
36+
; CHECK-NEXT: ldr x30, [sp, #64] ; 8-byte Folded Reload
37+
; CHECK-NEXT: ldp d11, d10, [sp, #32] ; 16-byte Folded Reload
38+
; CHECK-NEXT: ldp d13, d12, [sp, #16] ; 16-byte Folded Reload
39+
; CHECK-NEXT: ldp d15, d14, [sp], #96 ; 16-byte Folded Reload
40+
; CHECK-NEXT: .cfi_def_cfa_offset 0
41+
; CHECK-NEXT: .cfi_restore w30
42+
; CHECK-NEXT: .cfi_restore b8
43+
; CHECK-NEXT: .cfi_restore b9
44+
; CHECK-NEXT: .cfi_restore b10
45+
; CHECK-NEXT: .cfi_restore b11
46+
; CHECK-NEXT: .cfi_restore b12
47+
; CHECK-NEXT: .cfi_restore b13
48+
; CHECK-NEXT: .cfi_restore b14
49+
; CHECK-NEXT: .cfi_restore b15
50+
; CHECK-NEXT: ret
51+
call void @normal_callee()
52+
ret void
53+
}
54+
55+
attributes #0 = { "aarch64_pstate_sm_body" uwtable(async) }

0 commit comments

Comments
 (0)