Skip to content

Commit ea6577a

Browse files
[AArch64][SME] Disable outlining for functions with streaming-mode changes (#95132)
1 parent 864981d commit ea6577a

File tree

2 files changed

+85
-0
lines changed

2 files changed

+85
-0
lines changed

llvm/lib/Target/AArch64/AArch64InstrInfo.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8701,6 +8701,13 @@ bool AArch64InstrInfo::isFunctionSafeToOutlineFrom(
87018701
if (!AFI || AFI->hasRedZone().value_or(true))
87028702
return false;
87038703

8704+
// FIXME: Determine whether it is safe to outline from functions which contain
8705+
// streaming-mode changes. We may need to ensure any smstart/smstop pairs are
8706+
// outlined together and ensure it is safe to outline with async unwind info,
8707+
// required for saving & restoring VG around calls.
8708+
if (AFI->hasStreamingModeChanges())
8709+
return false;
8710+
87048711
// FIXME: Teach the outliner to generate/handle Windows unwind info.
87058712
if (MF.getTarget().getMCAsmInfo()->usesWindowsCFI())
87068713
return false;
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+sme2 -enable-machine-outliner -verify-machineinstrs < %s | FileCheck %s
2+
; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+sme2 -enable-machine-outliner -verify-machineinstrs < %s | FileCheck %s -check-prefix=OUTLINER
3+
4+
declare void @callee();
5+
6+
define void @streaming_mode_change1() #0 {
7+
; CHECK-LABEL: streaming_mode_change1:
8+
; CHECK: // %bb.0:
9+
; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
10+
; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
11+
; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
12+
; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
13+
; CHECK-NEXT: str x30, [sp, #64] // 8-byte Folded Spill
14+
; CHECK-NEXT: smstop sm
15+
; CHECK-NEXT: bl callee
16+
; CHECK-NEXT: smstart sm
17+
; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
18+
; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
19+
; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
20+
; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
21+
; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
22+
; CHECK-NEXT: ret
23+
;
24+
; OUTLINER-LABEL: streaming_mode_change1:
25+
; OUTLINER-NOT: OUTLINED_FUNCTION_
26+
call void @callee();
27+
ret void;
28+
}
29+
30+
define void @streaming_mode_change2() #0 {
31+
; CHECK-LABEL: streaming_mode_change2:
32+
; CHECK: // %bb.0:
33+
; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
34+
; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
35+
; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
36+
; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
37+
; CHECK-NEXT: str x30, [sp, #64] // 8-byte Folded Spill
38+
; CHECK-NEXT: smstop sm
39+
; CHECK-NEXT: bl callee
40+
; CHECK-NEXT: smstart sm
41+
; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
42+
; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
43+
; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
44+
; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
45+
; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
46+
; CHECK-NEXT: ret
47+
;
48+
; OUTLINER-LABEL: streaming_mode_change2:
49+
; OUTLINER-NOT: OUTLINED_FUNCTION_
50+
call void @callee();
51+
ret void;
52+
}
53+
54+
define void @streaming_mode_change3() #0 {
55+
; CHECK-LABEL: streaming_mode_change3:
56+
; CHECK: // %bb.0:
57+
; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill
58+
; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill
59+
; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill
60+
; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill
61+
; CHECK-NEXT: str x30, [sp, #64] // 8-byte Folded Spill
62+
; CHECK-NEXT: smstop sm
63+
; CHECK-NEXT: bl callee
64+
; CHECK-NEXT: smstart sm
65+
; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload
66+
; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload
67+
; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload
68+
; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload
69+
; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload
70+
; CHECK-NEXT: ret
71+
;
72+
; OUTLINER-LABEL: streaming_mode_change3:
73+
; OUTLINER-NOT: OUTLINED_FUNCTION_
74+
call void @callee();
75+
ret void;
76+
}
77+
78+
attributes #0 = { "aarch64_pstate_sm_enabled" nounwind }

0 commit comments

Comments
 (0)