diff options
author | David Tellenbach <dtellenbach@apple.com> | 2024-05-01 10:07:51 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-01 10:07:51 -0700 |
commit | cf2f32c97f8fece105557c2357be4809cb9c14a1 (patch) | |
tree | c8befa904f8da25667cd389603c6d943ea42e597 | |
parent | 6c369cf937b7d9acb98a1fc46b1340cef7703e12 (diff) |
[MIR] Serialize MachineFrameInfo::isCalleeSavedInfoValid() (#90561)
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.
-rw-r--r-- | llvm/include/llvm/CodeGen/MIRYamlMapping.h | 6 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRParser/MIRParser.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/CodeGen/MIRPrinter.cpp | 1 | ||||
-rw-r--r-- | llvm/test/CodeGen/MIR/AArch64/calleesavedinfovalid.mir | 41 | ||||
-rw-r--r-- | llvm/test/CodeGen/MIR/Generic/frame-info.mir | 1 |
5 files changed, 49 insertions, 1 deletions
diff --git a/llvm/include/llvm/CodeGen/MIRYamlMapping.h b/llvm/include/llvm/CodeGen/MIRYamlMapping.h index bb8dbb0478ff..304db57eca49 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 b65fc8cf5099..a5d6a40392d0 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 6751fcf97087..26d534f369ae 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 000000000000..829eccddb27f --- /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 4a897a9ec5e3..d5e014cf6299 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: '' |