Skip to content

Commit 3e63e6a

Browse files
- Return true from needsAsyncDwarfUnwindInfo() if the function contains
a streaming-mode change.
1 parent 471560b commit 3e63e6a

File tree

6 files changed

+124
-17
lines changed

6 files changed

+124
-17
lines changed

llvm/lib/Target/AArch64/AArch64MachineFunctionInfo.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -196,12 +196,14 @@ bool AArch64FunctionInfo::needsAsyncDwarfUnwindInfo(
196196
const MachineFunction &MF) const {
197197
if (!NeedsAsyncDwarfUnwindInfo) {
198198
const Function &F = MF.getFunction();
199+
const AArch64FunctionInfo *AFI = MF.getInfo<AArch64FunctionInfo>();
199200
// The check got "minsize" is because epilogue unwind info is not emitted
200201
// (yet) for homogeneous epilogues, outlined functions, and functions
201202
// outlined from.
202-
NeedsAsyncDwarfUnwindInfo = needsDwarfUnwindInfo(MF) &&
203-
F.getUWTableKind() == UWTableKind::Async &&
204-
!F.hasMinSize();
203+
NeedsAsyncDwarfUnwindInfo =
204+
(needsDwarfUnwindInfo(MF) && F.getUWTableKind() == UWTableKind::Async &&
205+
!F.hasMinSize()) ||
206+
AFI->hasStreamingModeChanges();
205207
}
206208
return *NeedsAsyncDwarfUnwindInfo;
207209
}

llvm/test/CodeGen/AArch64/sme-lazy-save-call.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,9 @@ define void @test_lazy_save_and_conditional_smstart() nounwind "aarch64_inout_za
133133
; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
134134
; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
135135
; CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill
136-
; CHECK-NEXT: add x29, sp, #64
137136
; CHECK-NEXT: str x9, [sp, #80] // 8-byte Folded Spill
138137
; CHECK-NEXT: stp x20, x19, [sp, #96] // 16-byte Folded Spill
138+
; CHECK-NEXT: add x29, sp, #64
139139
; CHECK-NEXT: sub sp, sp, #16
140140
; CHECK-NEXT: rdsvl x8, #1
141141
; CHECK-NEXT: mov x9, sp

llvm/test/CodeGen/AArch64/sme-streaming-body-streaming-compatible-interface.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,13 @@ define void @streaming_body_and_streaming_compatible_interface_multi_basic_block
8080
; CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill
8181
; CHECK-NEXT: rdsvl x9, #1
8282
; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
83-
; CHECK-NEXT: mov w8, w0
8483
; CHECK-NEXT: lsr x9, x9, #3
8584
; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
8685
; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
8786
; CHECK-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
8887
; CHECK-NEXT: cntd x9
8988
; CHECK-NEXT: stp x9, x19, [sp, #80] // 16-byte Folded Spill
89+
; CHECK-NEXT: mov w8, w0
9090
; CHECK-NEXT: bl __arm_sme_state
9191
; CHECK-NEXT: and x19, x0, #0x1
9292
; CHECK-NEXT: tbnz w19, #0, .LBB2_2

llvm/test/CodeGen/AArch64/sme-streaming-compatible-interface.ll

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,14 +469,14 @@ define void @call_to_non_streaming_pass_args(ptr nocapture noundef readnone %ptr
469469
; CHECK-LABEL: call_to_non_streaming_pass_args:
470470
; CHECK: // %bb.0: // %entry
471471
; CHECK-NEXT: sub sp, sp, #128
472+
; CHECK-NEXT: .cfi_def_cfa_offset 128
472473
; CHECK-NEXT: cntd x9
473474
; CHECK-NEXT: stp d15, d14, [sp, #32] // 16-byte Folded Spill
474475
; CHECK-NEXT: stp d13, d12, [sp, #48] // 16-byte Folded Spill
475476
; CHECK-NEXT: stp d11, d10, [sp, #64] // 16-byte Folded Spill
476477
; CHECK-NEXT: stp d9, d8, [sp, #80] // 16-byte Folded Spill
477478
; CHECK-NEXT: stp x30, x9, [sp, #96] // 16-byte Folded Spill
478479
; CHECK-NEXT: str x19, [sp, #112] // 8-byte Folded Spill
479-
; CHECK-NEXT: .cfi_def_cfa_offset 128
480480
; CHECK-NEXT: .cfi_offset w19, -16
481481
; CHECK-NEXT: .cfi_offset w30, -32
482482
; CHECK-NEXT: .cfi_offset b8, -40
@@ -515,6 +515,17 @@ define void @call_to_non_streaming_pass_args(ptr nocapture noundef readnone %ptr
515515
; CHECK-NEXT: ldp d13, d12, [sp, #48] // 16-byte Folded Reload
516516
; CHECK-NEXT: ldp d15, d14, [sp, #32] // 16-byte Folded Reload
517517
; CHECK-NEXT: add sp, sp, #128
518+
; CHECK-NEXT: .cfi_def_cfa_offset 0
519+
; CHECK-NEXT: .cfi_restore w19
520+
; CHECK-NEXT: .cfi_restore w30
521+
; CHECK-NEXT: .cfi_restore b8
522+
; CHECK-NEXT: .cfi_restore b9
523+
; CHECK-NEXT: .cfi_restore b10
524+
; CHECK-NEXT: .cfi_restore b11
525+
; CHECK-NEXT: .cfi_restore b12
526+
; CHECK-NEXT: .cfi_restore b13
527+
; CHECK-NEXT: .cfi_restore b14
528+
; CHECK-NEXT: .cfi_restore b15
518529
; CHECK-NEXT: ret
519530
entry:
520531
call void @bar(ptr noundef nonnull %ptr, i64 %long1, i64 %long2, i32 %int1, i32 %int2, float %float1, float %float2, double %double1, double %double2)

llvm/test/CodeGen/AArch64/sme-vg-to-stack.ll

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,7 +1046,101 @@ define void @streaming_compatible_no_sve(i32 noundef %x) #4 {
10461046
ret void
10471047
}
10481048

1049+
; Ensure we still emit async unwind information with -fno-asynchronous-unwind-tables
1050+
; if the function contains a streaming-mode change.
1051+
1052+
define void @vg_unwind_noasync() #5 {
1053+
; CHECK-LABEL: vg_unwind_noasync:
1054+
; CHECK: // %bb.0:
1055+
; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
1056+
; CHECK-NEXT: .cfi_def_cfa_offset 80
1057+
; CHECK-NEXT: cntd x9
1058+
; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
1059+
; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
1060+
; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
1061+
; CHECK-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
1062+
; CHECK-NEXT: .cfi_offset w30, -16
1063+
; CHECK-NEXT: .cfi_offset b8, -24
1064+
; CHECK-NEXT: .cfi_offset b9, -32
1065+
; CHECK-NEXT: .cfi_offset b10, -40
1066+
; CHECK-NEXT: .cfi_offset b11, -48
1067+
; CHECK-NEXT: .cfi_offset b12, -56
1068+
; CHECK-NEXT: .cfi_offset b13, -64
1069+
; CHECK-NEXT: .cfi_offset b14, -72
1070+
; CHECK-NEXT: .cfi_offset b15, -80
1071+
; CHECK-NEXT: .cfi_offset vg, -8
1072+
; CHECK-NEXT: smstop sm
1073+
; CHECK-NEXT: bl callee
1074+
; CHECK-NEXT: smstart sm
1075+
; CHECK-NEXT: .cfi_restore vg
1076+
; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
1077+
; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
1078+
; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
1079+
; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
1080+
; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
1081+
; CHECK-NEXT: .cfi_def_cfa_offset 0
1082+
; CHECK-NEXT: .cfi_restore w30
1083+
; CHECK-NEXT: .cfi_restore b8
1084+
; CHECK-NEXT: .cfi_restore b9
1085+
; CHECK-NEXT: .cfi_restore b10
1086+
; CHECK-NEXT: .cfi_restore b11
1087+
; CHECK-NEXT: .cfi_restore b12
1088+
; CHECK-NEXT: .cfi_restore b13
1089+
; CHECK-NEXT: .cfi_restore b14
1090+
; CHECK-NEXT: .cfi_restore b15
1091+
; CHECK-NEXT: ret
1092+
;
1093+
; FP-CHECK-LABEL: vg_unwind_noasync:
1094+
; FP-CHECK: // %bb.0:
1095+
; FP-CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill
1096+
; FP-CHECK-NEXT: .cfi_def_cfa_offset 96
1097+
; FP-CHECK-NEXT: cntd x9
1098+
; FP-CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
1099+
; FP-CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
1100+
; FP-CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
1101+
; FP-CHECK-NEXT: stp x29, x30, [sp, #64] // 16-byte Folded Spill
1102+
; FP-CHECK-NEXT: str x9, [sp, #80] // 8-byte Folded Spill
1103+
; FP-CHECK-NEXT: add x29, sp, #64
1104+
; FP-CHECK-NEXT: .cfi_def_cfa w29, 32
1105+
; FP-CHECK-NEXT: .cfi_offset w30, -24
1106+
; FP-CHECK-NEXT: .cfi_offset w29, -32
1107+
; FP-CHECK-NEXT: .cfi_offset b8, -40
1108+
; FP-CHECK-NEXT: .cfi_offset b9, -48
1109+
; FP-CHECK-NEXT: .cfi_offset b10, -56
1110+
; FP-CHECK-NEXT: .cfi_offset b11, -64
1111+
; FP-CHECK-NEXT: .cfi_offset b12, -72
1112+
; FP-CHECK-NEXT: .cfi_offset b13, -80
1113+
; FP-CHECK-NEXT: .cfi_offset b14, -88
1114+
; FP-CHECK-NEXT: .cfi_offset b15, -96
1115+
; FP-CHECK-NEXT: .cfi_offset vg, -16
1116+
; FP-CHECK-NEXT: smstop sm
1117+
; FP-CHECK-NEXT: bl callee
1118+
; FP-CHECK-NEXT: smstart sm
1119+
; FP-CHECK-NEXT: .cfi_restore vg
1120+
; FP-CHECK-NEXT: .cfi_def_cfa wsp, 96
1121+
; FP-CHECK-NEXT: ldp x29, x30, [sp, #64] // 16-byte Folded Reload
1122+
; FP-CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
1123+
; FP-CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
1124+
; FP-CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
1125+
; FP-CHECK-NEXT: ldp d15, d14, [sp], #96 // 16-byte Folded Reload
1126+
; FP-CHECK-NEXT: .cfi_def_cfa_offset 0
1127+
; FP-CHECK-NEXT: .cfi_restore w30
1128+
; FP-CHECK-NEXT: .cfi_restore w29
1129+
; FP-CHECK-NEXT: .cfi_restore b8
1130+
; FP-CHECK-NEXT: .cfi_restore b9
1131+
; FP-CHECK-NEXT: .cfi_restore b10
1132+
; FP-CHECK-NEXT: .cfi_restore b11
1133+
; FP-CHECK-NEXT: .cfi_restore b12
1134+
; FP-CHECK-NEXT: .cfi_restore b13
1135+
; FP-CHECK-NEXT: .cfi_restore b14
1136+
; FP-CHECK-NEXT: .cfi_restore b15
1137+
; FP-CHECK-NEXT: ret
1138+
call void @callee();
1139+
ret void;
1140+
}
1141+
10491142
attributes #0 = { "aarch64_pstate_sm_enabled" uwtable(async) }
10501143
attributes #1 = { "probe-stack"="inline-asm" "aarch64_pstate_sm_enabled" uwtable(async) }
10511144
attributes #3 = { "aarch64_pstate_sm_body" uwtable(async) }
10521145
attributes #4 = { "aarch64_pstate_sm_compatible" uwtable(async) }
1146+
attributes #5 = { "aarch64_pstate_sm_enabled" }

llvm/test/CodeGen/AArch64/streaming-compatible-memory-ops.ll

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ define void @se_memcpy(i64 noundef %n) "aarch64_pstate_sm_enabled" nounwind {
2424
; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
2525
; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
2626
; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
27-
; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
2827
; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
29-
; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
30-
; CHECK-NO-SME-ROUTINES-NEXT: adrp x1, :got:src
3128
; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
3229
; CHECK-NO-SME-ROUTINES-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
30+
; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
31+
; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
32+
; CHECK-NO-SME-ROUTINES-NEXT: adrp x1, :got:src
3333
; CHECK-NO-SME-ROUTINES-NEXT: ldr x0, [x0, :got_lo12:dst]
3434
; CHECK-NO-SME-ROUTINES-NEXT: ldr x1, [x1, :got_lo12:src]
3535
; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
@@ -73,12 +73,12 @@ define void @se_memset(i64 noundef %n) "aarch64_pstate_sm_enabled" nounwind {
7373
; CHECK-NO-SME-ROUTINES: // %bb.0: // %entry
7474
; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
7575
; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
76-
; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
77-
; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
7876
; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
7977
; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
8078
; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
8179
; CHECK-NO-SME-ROUTINES-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
80+
; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
81+
; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
8282
; CHECK-NO-SME-ROUTINES-NEXT: ldr x0, [x0, :got_lo12:dst]
8383
; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
8484
; CHECK-NO-SME-ROUTINES-NEXT: mov w1, #2 // =0x2
@@ -123,12 +123,12 @@ define void @se_memmove(i64 noundef %n) "aarch64_pstate_sm_enabled" nounwind {
123123
; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
124124
; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
125125
; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
126-
; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
127126
; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
128-
; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
129-
; CHECK-NO-SME-ROUTINES-NEXT: adrp x1, :got:src
130127
; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
131128
; CHECK-NO-SME-ROUTINES-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
129+
; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
130+
; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
131+
; CHECK-NO-SME-ROUTINES-NEXT: adrp x1, :got:src
132132
; CHECK-NO-SME-ROUTINES-NEXT: ldr x0, [x0, :got_lo12:dst]
133133
; CHECK-NO-SME-ROUTINES-NEXT: ldr x1, [x1, :got_lo12:src]
134134
; CHECK-NO-SME-ROUTINES-NEXT: smstop sm
@@ -174,11 +174,11 @@ define void @sc_memcpy(i64 noundef %n) "aarch64_pstate_sm_compatible" nounwind {
174174
; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill
175175
; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
176176
; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
177-
; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
178177
; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
179178
; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
180179
; CHECK-NO-SME-ROUTINES-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
181180
; CHECK-NO-SME-ROUTINES-NEXT: str x19, [sp, #80] // 8-byte Folded Spill
181+
; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
182182
; CHECK-NO-SME-ROUTINES-NEXT: bl __arm_sme_state
183183
; CHECK-NO-SME-ROUTINES-NEXT: adrp x8, :got:dst
184184
; CHECK-NO-SME-ROUTINES-NEXT: and x19, x0, #0x1
@@ -224,13 +224,13 @@ define void @sb_memcpy(i64 noundef %n) "aarch64_pstate_sm_body" nounwind {
224224
; CHECK-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill
225225
; CHECK-NEXT: rdsvl x9, #1
226226
; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
227-
; CHECK-NEXT: mov x2, x0
228227
; CHECK-NEXT: lsr x9, x9, #3
229228
; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
230229
; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
231230
; CHECK-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
232231
; CHECK-NEXT: cntd x9
233232
; CHECK-NEXT: str x9, [sp, #80] // 8-byte Folded Spill
233+
; CHECK-NEXT: mov x2, x0
234234
; CHECK-NEXT: smstart sm
235235
; CHECK-NEXT: adrp x0, :got:dst
236236
; CHECK-NEXT: adrp x1, :got:src
@@ -250,13 +250,13 @@ define void @sb_memcpy(i64 noundef %n) "aarch64_pstate_sm_body" nounwind {
250250
; CHECK-NO-SME-ROUTINES-NEXT: stp d15, d14, [sp, #-96]! // 16-byte Folded Spill
251251
; CHECK-NO-SME-ROUTINES-NEXT: rdsvl x9, #1
252252
; CHECK-NO-SME-ROUTINES-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
253-
; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
254253
; CHECK-NO-SME-ROUTINES-NEXT: lsr x9, x9, #3
255254
; CHECK-NO-SME-ROUTINES-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
256255
; CHECK-NO-SME-ROUTINES-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
257256
; CHECK-NO-SME-ROUTINES-NEXT: stp x30, x9, [sp, #64] // 16-byte Folded Spill
258257
; CHECK-NO-SME-ROUTINES-NEXT: cntd x9
259258
; CHECK-NO-SME-ROUTINES-NEXT: str x9, [sp, #80] // 8-byte Folded Spill
259+
; CHECK-NO-SME-ROUTINES-NEXT: mov x2, x0
260260
; CHECK-NO-SME-ROUTINES-NEXT: smstart sm
261261
; CHECK-NO-SME-ROUTINES-NEXT: adrp x0, :got:dst
262262
; CHECK-NO-SME-ROUTINES-NEXT: adrp x1, :got:src

0 commit comments

Comments
 (0)