diff options
author | Kerry McLaughlin <kerry.mclaughlin@arm.com> | 2024-06-12 10:35:29 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-12 10:35:29 +0100 |
commit | ea6577a74baebcc287f8b24d8b098f1d70085911 (patch) | |
tree | e264331fd2b9e40011a333a404f6a9675120a68f | |
parent | 864981d72b3b4077053479def6a43b5826aea462 (diff) | |
download | llvm-ea6577a74baebcc287f8b24d8b098f1d70085911.zip llvm-ea6577a74baebcc287f8b24d8b098f1d70085911.tar.gz llvm-ea6577a74baebcc287f8b24d8b098f1d70085911.tar.bz2 |
[AArch64][SME] Disable outlining for functions with streaming-mode changes (#95132)
-rw-r--r-- | llvm/lib/Target/AArch64/AArch64InstrInfo.cpp | 7 | ||||
-rw-r--r-- | llvm/test/CodeGen/AArch64/outlining-with-streaming-mode-changes.ll | 78 |
2 files changed, 85 insertions, 0 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp index a5135b7..1a795b5 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -8701,6 +8701,13 @@ bool AArch64InstrInfo::isFunctionSafeToOutlineFrom( if (!AFI || AFI->hasRedZone().value_or(true)) return false; + // FIXME: Determine whether it is safe to outline from functions which contain + // streaming-mode changes. We may need to ensure any smstart/smstop pairs are + // outlined together and ensure it is safe to outline with async unwind info, + // required for saving & restoring VG around calls. + if (AFI->hasStreamingModeChanges()) + return false; + // FIXME: Teach the outliner to generate/handle Windows unwind info. if (MF.getTarget().getMCAsmInfo()->usesWindowsCFI()) return false; diff --git a/llvm/test/CodeGen/AArch64/outlining-with-streaming-mode-changes.ll b/llvm/test/CodeGen/AArch64/outlining-with-streaming-mode-changes.ll new file mode 100644 index 0000000..44d47a0 --- /dev/null +++ b/llvm/test/CodeGen/AArch64/outlining-with-streaming-mode-changes.ll @@ -0,0 +1,78 @@ +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+sme2 -enable-machine-outliner -verify-machineinstrs < %s | FileCheck %s +; RUN: llc -mtriple=aarch64-linux-gnu -mattr=+sve -mattr=+sme2 -enable-machine-outliner -verify-machineinstrs < %s | FileCheck %s -check-prefix=OUTLINER + +declare void @callee(); + +define void @streaming_mode_change1() #0 { +; CHECK-LABEL: streaming_mode_change1: +; CHECK: // %bb.0: +; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill +; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill +; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill +; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill +; CHECK-NEXT: str x30, [sp, #64] // 8-byte Folded Spill +; CHECK-NEXT: smstop sm +; CHECK-NEXT: bl callee +; CHECK-NEXT: smstart sm +; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload +; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload +; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload +; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload +; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload +; CHECK-NEXT: ret +; +; OUTLINER-LABEL: streaming_mode_change1: +; OUTLINER-NOT: OUTLINED_FUNCTION_ + call void @callee(); + ret void; +} + +define void @streaming_mode_change2() #0 { +; CHECK-LABEL: streaming_mode_change2: +; CHECK: // %bb.0: +; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill +; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill +; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill +; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill +; CHECK-NEXT: str x30, [sp, #64] // 8-byte Folded Spill +; CHECK-NEXT: smstop sm +; CHECK-NEXT: bl callee +; CHECK-NEXT: smstart sm +; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload +; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload +; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload +; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload +; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload +; CHECK-NEXT: ret +; +; OUTLINER-LABEL: streaming_mode_change2: +; OUTLINER-NOT: OUTLINED_FUNCTION_ + call void @callee(); + ret void; +} + +define void @streaming_mode_change3() #0 { +; CHECK-LABEL: streaming_mode_change3: +; CHECK: // %bb.0: +; CHECK-NEXT: stp d15, d14, [sp, #-80]! // 16-byte Folded Spill +; CHECK-NEXT: stp d13, d12, [sp, #16] // 16-byte Folded Spill +; CHECK-NEXT: stp d11, d10, [sp, #32] // 16-byte Folded Spill +; CHECK-NEXT: stp d9, d8, [sp, #48] // 16-byte Folded Spill +; CHECK-NEXT: str x30, [sp, #64] // 8-byte Folded Spill +; CHECK-NEXT: smstop sm +; CHECK-NEXT: bl callee +; CHECK-NEXT: smstart sm +; CHECK-NEXT: ldp d9, d8, [sp, #48] // 16-byte Folded Reload +; CHECK-NEXT: ldr x30, [sp, #64] // 8-byte Folded Reload +; CHECK-NEXT: ldp d11, d10, [sp, #32] // 16-byte Folded Reload +; CHECK-NEXT: ldp d13, d12, [sp, #16] // 16-byte Folded Reload +; CHECK-NEXT: ldp d15, d14, [sp], #80 // 16-byte Folded Reload +; CHECK-NEXT: ret +; +; OUTLINER-LABEL: streaming_mode_change3: +; OUTLINER-NOT: OUTLINED_FUNCTION_ + call void @callee(); + ret void; +} + +attributes #0 = { "aarch64_pstate_sm_enabled" nounwind } |