llvm-reduce: Clone some of the easy function properties
authorMatt Arsenault <Matthew.Arsenault@amd.com>
Thu, 14 Apr 2022 14:59:37 +0000 (10:59 -0400)
committerMatt Arsenault <Matthew.Arsenault@amd.com>
Sat, 16 Apr 2022 00:31:07 +0000 (20:31 -0400)
Error on some of these other fields, since tracking down test cases
for all of these at once is exhausting.

llvm/include/llvm/CodeGen/MachineFunction.h
llvm/test/tools/llvm-reduce/mir/preserve-func-info.mir [new file with mode: 0644]
llvm/tools/llvm-reduce/ReducerWorkItem.cpp

index b2aefa8..6363d3e 100644 (file)
@@ -1110,6 +1110,11 @@ public:
   /// Map the landing pad's EH symbol to the call site indexes.
   void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef<unsigned> Sites);
 
+  /// Return if there is any wasm exception handling.
+  bool hasAnyWasmLandingPadIndex() const {
+    return !WasmLPadToIndexMap.empty();
+  }
+
   /// Map the landing pad to its index. Used for Wasm exception handling.
   void setWasmLandingPadIndex(const MachineBasicBlock *LPad, unsigned Index) {
     WasmLPadToIndexMap[LPad] = Index;
@@ -1126,6 +1131,10 @@ public:
     return WasmLPadToIndexMap.lookup(LPad);
   }
 
+  bool hasAnyCallSiteLandingPad() const {
+    return !LPadToCallSiteMap.empty();
+  }
+
   /// Get the call site indexes for a landing pad EH symbol.
   SmallVectorImpl<unsigned> &getCallSiteLandingPad(MCSymbol *Sym) {
     assert(hasCallSiteLandingPad(Sym) &&
@@ -1138,6 +1147,10 @@ public:
     return !LPadToCallSiteMap[Sym].empty();
   }
 
+  bool hasAnyCallSiteLabel() const {
+    return !CallSiteMap.empty();
+  }
+
   /// Map the begin label for a call site.
   void setCallSiteBeginLabel(MCSymbol *BeginLabel, unsigned Site) {
     CallSiteMap[BeginLabel] = Site;
diff --git a/llvm/test/tools/llvm-reduce/mir/preserve-func-info.mir b/llvm/test/tools/llvm-reduce/mir/preserve-func-info.mir
new file mode 100644 (file)
index 0000000..aa43455
--- /dev/null
@@ -0,0 +1,59 @@
+# REQUIRES: amdgpu-registered-target
+# RUN: llvm-reduce -simplify-mir -mtriple=amdgcn-amd-amdhsa --test FileCheck --test-arg --check-prefix=CHECK-INTERESTINGNESS --test-arg %s --test-arg --input-file %s -o %t 2> %t.log
+# RUN: FileCheck --check-prefix=RESULT %s < %t
+
+# CHECK-INTERESTINGNESS: V_MOV_B32
+
+
+# RESULT: name: func
+# RESULT-NEXT: alignment:       32
+# RESULT-NEXT: exposesReturnsTwice: true
+# RESULT-NEXT: legalized:       true
+# RESULT-NEXT: regBankSelected: true
+# RESULT-NEXT: selected:        true
+# RESULT-NEXT: failedISel:      true
+# RESULT-NEXT: tracksRegLiveness: true
+# RESULT-NEXT: hasWinCFI:       true
+# RESULT-NEXT: callsEHReturn: true
+# RESULT-NEXT: callsUnwindInit: true
+# RESULT-NEXT: hasEHCatchret: true
+# RESULT-NEXT: hasEHScopes: true
+# RESULT-NEXT: hasEHFunclets: true
+# RESULT-NEXT: failsVerification: true
+# RESULT-NEXT: tracksDebugUserValues: true
+
+# RESULT: %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
+# RESULT-NEXT: S_ENDPGM
+
+--- |
+  define void @func(i32 %size)  {
+    ret void
+  }
+
+...
+---
+name: func
+alignment:       32
+exposesReturnsTwice: true
+legalized:       true
+regBankSelected: true
+selected:        true
+failedISel:      true
+tracksRegLiveness: true
+hasWinCFI:       true
+failsVerification: true
+tracksDebugUserValues: true
+callsEHReturn: true
+callsUnwindInit: true
+callsUnwindInit: true
+hasEHCatchret: true
+hasEHScopes: true
+hasEHFunclets: true
+
+body:             |
+  bb.0:
+    S_NOP 0
+    %0:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
+    INLINEASM &"", 1 /* sideeffect attdialect */
+    S_ENDPGM 0, implicit %0
+...
index 93b2ac9..75fef69 100644 (file)
@@ -230,6 +230,36 @@ static std::unique_ptr<MachineFunction> cloneMF(MachineFunction *SrcMF) {
     }
   }
 
+  DstMF->setAlignment(SrcMF->getAlignment());
+  DstMF->setExposesReturnsTwice(SrcMF->exposesReturnsTwice());
+  DstMF->setHasInlineAsm(SrcMF->hasInlineAsm());
+  DstMF->setHasWinCFI(SrcMF->hasWinCFI());
+
+  DstMF->getProperties().reset().set(SrcMF->getProperties());
+
+  if (!SrcMF->getFrameInstructions().empty() ||
+      !SrcMF->getLongjmpTargets().empty() ||
+      !SrcMF->getCatchretTargets().empty())
+    report_fatal_error("cloning not implemented for machine function property");
+
+  DstMF->setCallsEHReturn(SrcMF->callsEHReturn());
+  DstMF->setCallsUnwindInit(SrcMF->callsUnwindInit());
+  DstMF->setHasEHCatchret(SrcMF->hasEHCatchret());
+  DstMF->setHasEHScopes(SrcMF->hasEHScopes());
+  DstMF->setHasEHFunclets(SrcMF->hasEHFunclets());
+
+  if (!SrcMF->getLandingPads().empty() ||
+      !SrcMF->getCodeViewAnnotations().empty() ||
+      !SrcMF->getTypeInfos().empty() ||
+      !SrcMF->getFilterIds().empty() ||
+      SrcMF->hasAnyWasmLandingPadIndex() ||
+      SrcMF->hasAnyCallSiteLandingPad() ||
+      SrcMF->hasAnyCallSiteLabel() ||
+      !SrcMF->getCallSitesInfo().empty())
+    report_fatal_error("cloning not implemented for machine function property");
+
+  DstMF->setDebugInstrNumberingCount(SrcMF->DebugInstrNumberingCount);
+
   DstMF->verify(nullptr, "", /*AbortOnError=*/true);
   return DstMF;
 }