[llvm] [MIR] Serialize MachineFrameInfo::isCalleeSavedInfoValid() (PR #90561)
David Tellenbach via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 30 20:42:11 PDT 2024
https://github.com/dtellenbach updated https://github.com/llvm/llvm-project/pull/90561
>From 3586507df1c0163cff5c807359c317709efaf470 Mon Sep 17 00:00:00 2001
From: David Tellenbach <dtellenbach at apple.com>
Date: Mon, 29 Apr 2024 21:52:02 -0700
Subject: [PATCH] [MIR] Serialize MachineFrameInfo::isCalleeSavedInfoValid()
In case of functions without a stack frame no "stack" field is
serialized into MIR which leads to isCalleeSavedInfoValid being false
when reading a MIR file back in. To fix this we should serialize
MachineFrameInfo::isCalleeSavedInfoValid() into MIR.
---
llvm/include/llvm/CodeGen/MIRYamlMapping.h | 6 ++-
llvm/lib/CodeGen/MIRParser/MIRParser.cpp | 1 +
llvm/lib/CodeGen/MIRPrinter.cpp | 1 +
.../MIR/AArch64/calleesavedinfovalid.mir | 41 +++++++++++++++++++
llvm/test/CodeGen/MIR/Generic/frame-info.mir | 1 +
5 files changed, 49 insertions(+), 1 deletion(-)
create mode 100644 llvm/test/CodeGen/MIR/AArch64/calleesavedinfovalid.mir
diff --git a/llvm/include/llvm/CodeGen/MIRYamlMapping.h b/llvm/include/llvm/CodeGen/MIRYamlMapping.h
index bb8dbb0478ff54..304db57eca4994 100644
--- a/llvm/include/llvm/CodeGen/MIRYamlMapping.h
+++ b/llvm/include/llvm/CodeGen/MIRYamlMapping.h
@@ -640,6 +640,7 @@ struct MachineFrameInfo {
bool HasVAStart = false;
bool HasMustTailInVarArgFunc = false;
bool HasTailCall = false;
+ bool IsCalleeSavedInfoValid = false;
unsigned LocalFrameSize = 0;
StringValue SavePoint;
StringValue RestorePoint;
@@ -663,7 +664,8 @@ struct MachineFrameInfo {
HasMustTailInVarArgFunc == Other.HasMustTailInVarArgFunc &&
HasTailCall == Other.HasTailCall &&
LocalFrameSize == Other.LocalFrameSize &&
- SavePoint == Other.SavePoint && RestorePoint == Other.RestorePoint;
+ SavePoint == Other.SavePoint && RestorePoint == Other.RestorePoint &&
+ IsCalleeSavedInfoValid == Other.IsCalleeSavedInfoValid;
}
};
@@ -691,6 +693,8 @@ template <> struct MappingTraits<MachineFrameInfo> {
YamlIO.mapOptional("hasMustTailInVarArgFunc", MFI.HasMustTailInVarArgFunc,
false);
YamlIO.mapOptional("hasTailCall", MFI.HasTailCall, false);
+ YamlIO.mapOptional("isCalleeSavedInfoValid", MFI.IsCalleeSavedInfoValid,
+ false);
YamlIO.mapOptional("localFrameSize", MFI.LocalFrameSize, (unsigned)0);
YamlIO.mapOptional("savePoint", MFI.SavePoint,
StringValue()); // Don't print it out when it's empty.
diff --git a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
index b65fc8cf5099b8..a5d6a40392d0cb 100644
--- a/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
+++ b/llvm/lib/CodeGen/MIRParser/MIRParser.cpp
@@ -779,6 +779,7 @@ bool MIRParserImpl::initializeFrameInfo(PerFunctionMIParsingState &PFS,
MFI.setHasVAStart(YamlMFI.HasVAStart);
MFI.setHasMustTailInVarArgFunc(YamlMFI.HasMustTailInVarArgFunc);
MFI.setHasTailCall(YamlMFI.HasTailCall);
+ MFI.setCalleeSavedInfoValid(YamlMFI.IsCalleeSavedInfoValid);
MFI.setLocalFrameSize(YamlMFI.LocalFrameSize);
if (!YamlMFI.SavePoint.Value.empty()) {
MachineBasicBlock *MBB = nullptr;
diff --git a/llvm/lib/CodeGen/MIRPrinter.cpp b/llvm/lib/CodeGen/MIRPrinter.cpp
index 6751fcf97087c7..26d534f369ae5f 100644
--- a/llvm/lib/CodeGen/MIRPrinter.cpp
+++ b/llvm/lib/CodeGen/MIRPrinter.cpp
@@ -368,6 +368,7 @@ void MIRPrinter::convert(ModuleSlotTracker &MST,
YamlMFI.HasVAStart = MFI.hasVAStart();
YamlMFI.HasMustTailInVarArgFunc = MFI.hasMustTailInVarArgFunc();
YamlMFI.HasTailCall = MFI.hasTailCall();
+ YamlMFI.IsCalleeSavedInfoValid = MFI.isCalleeSavedInfoValid();
YamlMFI.LocalFrameSize = MFI.getLocalFrameSize();
if (MFI.getSavePoint()) {
raw_string_ostream StrOS(YamlMFI.SavePoint.Value);
diff --git a/llvm/test/CodeGen/MIR/AArch64/calleesavedinfovalid.mir b/llvm/test/CodeGen/MIR/AArch64/calleesavedinfovalid.mir
new file mode 100644
index 00000000000000..829eccddb27f3e
--- /dev/null
+++ b/llvm/test/CodeGen/MIR/AArch64/calleesavedinfovalid.mir
@@ -0,0 +1,41 @@
+
+# RUN: llc -run-pass=none -mtriple=aarch64-- -o - %s | FileCheck %s
+
+---
+# CHECK-LABEL: name: no_stack_no_calleesavedinfo
+# CHECK: isCalleeSavedInfoValid: false
+name: no_stack_no_calleesavedinfo
+frameInfo:
+ isCalleeSavedInfoValid: false
+stack: []
+
+...
+---
+# CHECK-LABEL: name: no_stack_calleesavedinfo
+# CHECK: isCalleeSavedInfoValid: true
+name: no_stack_calleesavedinfo
+frameInfo:
+ isCalleeSavedInfoValid: true
+stack: []
+
+...
+---
+# CHECK-LABEL: name: stack_no_calleesavedinfo
+# CHECK: isCalleeSavedInfoValid: true
+name: stack_no_calleesavedinfo
+frameInfo:
+ isCalleeSavedInfoValid: false
+stack:
+ - { id: 0, type: spill-slot, offset: -8, size: 8, alignment: 8, callee-saved-register: '$lr' }
+
+...
+---
+# CHECK-LABEL: name: stack_calleesavedinfo
+# CHECK: isCalleeSavedInfoValid: true
+name: stack_calleesavedinfo
+frameInfo:
+ isCalleeSavedInfoValid: true
+stack:
+ - { id: 0, type: spill-slot, offset: -8, size: 8, alignment: 8, callee-saved-register: '$lr' }
+
+...
diff --git a/llvm/test/CodeGen/MIR/Generic/frame-info.mir b/llvm/test/CodeGen/MIR/Generic/frame-info.mir
index 4a897a9ec5e3bb..d5e014cf629915 100644
--- a/llvm/test/CodeGen/MIR/Generic/frame-info.mir
+++ b/llvm/test/CodeGen/MIR/Generic/frame-info.mir
@@ -44,6 +44,7 @@ tracksRegLiveness: true
# CHECK-NEXT: hasVAStart: false
# CHECK-NEXT: hasMustTailInVarArgFunc: false
# CHECK-NEXT: hasTailCall: false
+# CHECK-NEXT: isCalleeSavedInfoValid: false
# CHECK-NEXT: localFrameSize: 0
# CHECK-NEXT: savePoint: ''
# CHECK-NEXT: restorePoint: ''
More information about the llvm-commits
mailing list