MIR: Serialize a few bool function fields
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 14 Apr 2022 20:16:08 +0000 (16:16 -0400)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Sat, 16 Apr 2022 00:31:07 +0000 (20:31 -0400)
llvm/include/llvm/CodeGen/MIRYamlMapping.h
llvm/lib/CodeGen/MIRParser/MIRParser.cpp
llvm/lib/CodeGen/MIRPrinter.cpp
llvm/test/CodeGen/MIR/X86/exception-function-state.mir [new file with mode: 0644]

index 02eb5d24271df4644168f1a7bb19c2c366fb608f..94198628518acc32c89cfe6e1114d5a35f25d482 100644 (file)
@@ -694,6 +694,13 @@ struct MachineFunction {
   // Register information
   bool TracksRegLiveness = false;
   bool HasWinCFI = false;
+
+  bool CallsEHReturn = false;
+  bool CallsUnwindInit = false;
+  bool HasEHCatchret = false;
+  bool HasEHScopes = false;
+  bool HasEHFunclets = false;
+
   bool FailsVerification = false;
   bool TracksDebugUserValues = false;
   std::vector<VirtualRegisterDefinition> VirtualRegisters;
@@ -724,6 +731,13 @@ template <> struct MappingTraits<MachineFunction> {
     YamlIO.mapOptional("failedISel", MF.FailedISel, false);
     YamlIO.mapOptional("tracksRegLiveness", MF.TracksRegLiveness, false);
     YamlIO.mapOptional("hasWinCFI", MF.HasWinCFI, false);
+
+    YamlIO.mapOptional("callsEHReturn", MF.CallsEHReturn, false);
+    YamlIO.mapOptional("callsUnwindInit", MF.CallsUnwindInit, false);
+    YamlIO.mapOptional("hasEHCatchret", MF.HasEHCatchret, false);
+    YamlIO.mapOptional("hasEHScopes", MF.HasEHScopes, false);
+    YamlIO.mapOptional("hasEHFunclets", MF.HasEHFunclets, false);
+
     YamlIO.mapOptional("failsVerification", MF.FailsVerification, false);
     YamlIO.mapOptional("tracksDebugUserValues", MF.TracksDebugUserValues,
                        false);
index c0af85b0a16005841dafbb4adf1141bcf53fb3d8..3f1b194358c278df38812d0790516089d1b96e72 100644 (file)
@@ -458,6 +458,12 @@ MIRParserImpl::initializeMachineFunction(const yaml::MachineFunction &YamlMF,
   MF.setExposesReturnsTwice(YamlMF.ExposesReturnsTwice);
   MF.setHasWinCFI(YamlMF.HasWinCFI);
 
+  MF.setCallsEHReturn(YamlMF.CallsEHReturn);
+  MF.setCallsUnwindInit(YamlMF.CallsUnwindInit);
+  MF.setHasEHCatchret(YamlMF.HasEHCatchret);
+  MF.setHasEHScopes(YamlMF.HasEHScopes);
+  MF.setHasEHFunclets(YamlMF.HasEHFunclets);
+
   if (YamlMF.Legalized)
     MF.getProperties().set(MachineFunctionProperties::Property::Legalized);
   if (YamlMF.RegBankSelected)
index d1eec74e2131cd0ca64109b37bb651959d105bfa..2fa4c45abe91fce7677f4f91b15e5c3eab495d09 100644 (file)
@@ -195,6 +195,12 @@ void MIRPrinter::print(const MachineFunction &MF) {
   YamlMF.ExposesReturnsTwice = MF.exposesReturnsTwice();
   YamlMF.HasWinCFI = MF.hasWinCFI();
 
+  YamlMF.CallsEHReturn = MF.callsEHReturn();
+  YamlMF.CallsUnwindInit = MF.callsUnwindInit();
+  YamlMF.HasEHCatchret = MF.hasEHCatchret();
+  YamlMF.HasEHScopes = MF.hasEHScopes();
+  YamlMF.HasEHFunclets = MF.hasEHFunclets();
+
   YamlMF.Legalized = MF.getProperties().hasProperty(
       MachineFunctionProperties::Property::Legalized);
   YamlMF.RegBankSelected = MF.getProperties().hasProperty(
diff --git a/llvm/test/CodeGen/MIR/X86/exception-function-state.mir b/llvm/test/CodeGen/MIR/X86/exception-function-state.mir
new file mode 100644 (file)
index 0000000..f401da1
--- /dev/null
@@ -0,0 +1,71 @@
+# RUN: llc -simplify-mir=0 -march=x86-64 -run-pass=none -o - %s | FileCheck -check-prefixes=FULL,ALL %s
+# RUN: llc -simplify-mir=1 -march=x86-64 -run-pass=none -o - %s | FileCheck -check-prefixes=SIMPLE,ALL %s
+
+# This test ensures that the MIR parser parses callee saved information in the
+# stack objects correctly.
+
+# ALL: name: func0
+# ALL: callsEHReturn:   true
+# ALL: callsUnwindInit: true
+# ALL: hasEHCatchret:   true
+# ALL: hasEHScopes:     true
+# ALL: hasEHFunclets:   true
+
+---
+name: func0
+callsEHReturn: true
+callsUnwindInit: true
+hasEHCatchret: true
+hasEHScopes: true
+hasEHFunclets: true
+body: |
+  bb.0:
+...
+
+# ALL: name: func1
+# FULL: callsEHReturn: false
+# FULL: callsUnwindInit: true
+# FULL: hasEHCatchret: false
+# FULL: hasEHScopes: true
+# FULL: hasEHFunclets: false
+
+# SIMPLE-NOT: callsEHReturn
+# SIMPLE: callsUnwindInit: true
+# SIMPLE-NOT: hasEHCatchret
+# SIMPLE: hasEHScopes: true
+# SIMPLE-NOT: hasEHFunclets
+---
+name: func1
+tracksRegLiveness: true
+callsEHReturn: false
+callsUnwindInit: true
+hasEHCatchret: false
+hasEHScopes: true
+hasEHFunclets: false
+body: |
+  bb.0:
+...
+
+# ALL: name: func2
+# FULL: callsEHReturn: true
+# FULL: callsUnwindInit: false
+# FULL: hasEHCatchret: true
+# FULL: hasEHScopes: false
+# FULL: hasEHFunclets: false
+
+# SIMPLE: callsEHReturn: true
+# SIMPLE-NOT: callsUnwindInit
+# SIMPLE: hasEHCatchret: true
+# SIMPLE-NOT hasEHScopes
+# SIMPLE-NOT: hasEHFunclets
+---
+name: func2
+tracksRegLiveness: true
+callsEHReturn: true
+callsUnwindInit: false
+hasEHCatchret: true
+hasEHScopes: false
+hasEHFunclets: false
+body: |
+  bb.0:
+...