diff --git a/llvm/include/llvm/CodeGen/MachineFunction.h b/llvm/include/llvm/CodeGen/MachineFunction.h index b2aefa87f8742..6363d3e0de148 100644 --- a/llvm/include/llvm/CodeGen/MachineFunction.h +++ b/llvm/include/llvm/CodeGen/MachineFunction.h @@ -1110,6 +1110,11 @@ class LLVM_EXTERNAL_VISIBILITY MachineFunction { /// Map the landing pad's EH symbol to the call site indexes. void setCallSiteLandingPad(MCSymbol *Sym, ArrayRef 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 @@ class LLVM_EXTERNAL_VISIBILITY MachineFunction { return WasmLPadToIndexMap.lookup(LPad); } + bool hasAnyCallSiteLandingPad() const { + return !LPadToCallSiteMap.empty(); + } + /// Get the call site indexes for a landing pad EH symbol. SmallVectorImpl &getCallSiteLandingPad(MCSymbol *Sym) { assert(hasCallSiteLandingPad(Sym) && @@ -1138,6 +1147,10 @@ class LLVM_EXTERNAL_VISIBILITY MachineFunction { 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 index 0000000000000..aa43455d732cd --- /dev/null +++ b/llvm/test/tools/llvm-reduce/mir/preserve-func-info.mir @@ -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 +... diff --git a/llvm/tools/llvm-reduce/ReducerWorkItem.cpp b/llvm/tools/llvm-reduce/ReducerWorkItem.cpp index 93b2ac96e723b..75fef698a3b8c 100644 --- a/llvm/tools/llvm-reduce/ReducerWorkItem.cpp +++ b/llvm/tools/llvm-reduce/ReducerWorkItem.cpp @@ -230,6 +230,36 @@ static std::unique_ptr 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; }