mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2026-01-31 01:35:20 +01:00
This new MIR pass removes redundant DBG_VALUEs. After the register allocator is done, more precisely, after the Virtual Register Rewriter, we end up having duplicated DBG_VALUEs, since some virtual registers are being rewritten into the same physical register as some of existing DBG_VALUEs. Each DBG_VALUE should indicate (at least before the LiveDebugValues) variables assignment, but it is being clobbered for function parameters during the SelectionDAG since it generates new DBG_VALUEs after COPY instructions, even though the parameter has no assignment. For example, if we had a DBG_VALUE $regX as an entry debug value representing the parameter, and a COPY and after the COPY, DBG_VALUE $virt_reg, and after the virtregrewrite the $virt_reg gets rewritten into $regX, we'd end up having redundant DBG_VALUE. This breaks the definition of the DBG_VALUE since some analysis passes might be built on top of that premise..., and this patch tries to fix the MIR with the respect to that. This first patch performs bacward scan, by trying to detect a sequence of consecutive DBG_VALUEs, and to remove all DBG_VALUEs describing one variable but the last one: For example: (1) DBG_VALUE $edi, !"var1", ... (2) DBG_VALUE $esi, !"var2", ... (3) DBG_VALUE $edi, !"var1", ... ... in this case, we can remove (1). By combining the forward scan that will be introduced in the next patch (from this stack), by inspecting the statistics, the RemoveRedundantDebugValues removes 15032 instructions by using gdb-7.11 as a testbed. Differential Revision: https://reviews.llvm.org/D105279
201 lines
10 KiB
C++
201 lines
10 KiB
C++
//===- MachinePassRegistry.def - Registry of passes -------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file is used as the registry of passes that are for target-independent
|
|
// code generator.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// NOTE: NO INCLUDE GUARD DESIRED!
|
|
|
|
#ifndef MODULE_ANALYSIS
|
|
#define MODULE_ANALYSIS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
MODULE_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis, (PIC))
|
|
#undef MODULE_ANALYSIS
|
|
|
|
#ifndef MODULE_PASS
|
|
#define MODULE_PASS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
MODULE_PASS("pre-isel-intrinsic-lowering", PreISelIntrinsicLoweringPass, ())
|
|
#undef MODULE_PASS
|
|
|
|
#ifndef FUNCTION_ANALYSIS
|
|
#define FUNCTION_ANALYSIS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis, (PIC))
|
|
FUNCTION_ANALYSIS("targetir", TargetIRAnalysis, (std::move(TM.getTargetIRAnalysis())))
|
|
#undef FUNCTION_ANALYSIS
|
|
|
|
#ifndef FUNCTION_PASS
|
|
#define FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
FUNCTION_PASS("mergeicmps", MergeICmpsPass, ())
|
|
FUNCTION_PASS("lower-constant-intrinsics", LowerConstantIntrinsicsPass, ())
|
|
FUNCTION_PASS("unreachableblockelim", UnreachableBlockElimPass, ())
|
|
FUNCTION_PASS("consthoist", ConstantHoistingPass, ())
|
|
FUNCTION_PASS("replace-with-veclib", ReplaceWithVeclib, ())
|
|
FUNCTION_PASS("partially-inline-libcalls", PartiallyInlineLibCallsPass, ())
|
|
FUNCTION_PASS("ee-instrument", EntryExitInstrumenterPass, (false))
|
|
FUNCTION_PASS("post-inline-ee-instrument", EntryExitInstrumenterPass, (true))
|
|
FUNCTION_PASS("expand-reductions", ExpandReductionsPass, ())
|
|
FUNCTION_PASS("expandvp", ExpandVectorPredicationPass, ())
|
|
FUNCTION_PASS("lowerinvoke", LowerInvokePass, ())
|
|
FUNCTION_PASS("scalarize-masked-mem-intrin", ScalarizeMaskedMemIntrinPass, ())
|
|
FUNCTION_PASS("verify", VerifierPass, ())
|
|
#undef FUNCTION_PASS
|
|
|
|
#ifndef LOOP_PASS
|
|
#define LOOP_PASS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
LOOP_PASS("loop-reduce", LoopStrengthReducePass, ())
|
|
#undef LOOP_PASS
|
|
|
|
#ifndef MACHINE_MODULE_PASS
|
|
#define MACHINE_MODULE_PASS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
#undef MACHINE_MODULE_PASS
|
|
|
|
#ifndef MACHINE_FUNCTION_ANALYSIS
|
|
#define MACHINE_FUNCTION_ANALYSIS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
MACHINE_FUNCTION_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis, (PIC))
|
|
// LiveVariables currently requires pure SSA form.
|
|
// FIXME: Once TwoAddressInstruction pass no longer uses kill flags,
|
|
// LiveVariables can be removed completely, and LiveIntervals can be directly
|
|
// computed. (We still either need to regenerate kill flags after regalloc, or
|
|
// preferably fix the scavenger to not depend on them).
|
|
// MACHINE_FUNCTION_ANALYSIS("live-vars", LiveVariablesAnalysis())
|
|
|
|
// MACHINE_FUNCTION_ANALYSIS("live-stacks", LiveStacksPass())
|
|
// MACHINE_FUNCTION_ANALYSIS("slot-indexes", SlotIndexesAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("edge-bundles", EdgeBundlesAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("lazy-machine-bfi", LazyMachineBlockFrequencyInfoAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("machine-bfi", MachineBlockFrequencyInfoAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("machine-loops", MachineLoopInfoAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("machine-dom-frontier", MachineDominanceFrontierAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("machine-dom-tree", MachineDominatorTreeAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("machine-ore", MachineOptimizationRemarkEmitterPassAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("machine-post-dom-tree", MachinePostDominatorTreeAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("machine-region-info", MachineRegionInfoPassAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("machine-trace-metrics", MachineTraceMetricsAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("reaching-def", ReachingDefAnalysisAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("live-reg-matrix", LiveRegMatrixAnalysis())
|
|
// MACHINE_FUNCTION_ANALYSIS("gc-analysis", GCMachineCodeAnalysisPass())
|
|
#undef MACHINE_FUNCTION_ANALYSIS
|
|
|
|
#ifndef MACHINE_FUNCTION_PASS
|
|
#define MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
// MACHINE_FUNCTION_PASS("mir-printer", PrintMIRPass, ())
|
|
// MACHINE_FUNCTION_PASS("free-machine-function", FreeMachineFunctionPass, ())
|
|
#undef MACHINE_FUNCTION_PASS
|
|
|
|
// After a pass is converted to new pass manager, its entry should be moved from
|
|
// dummy table to the normal one. For example, for a machine function pass,
|
|
// DUMMY_MACHINE_FUNCTION_PASS to MACHINE_FUNCTION_PASS.
|
|
|
|
#ifndef DUMMY_FUNCTION_PASS
|
|
#define DUMMY_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
DUMMY_FUNCTION_PASS("expandmemcmp", ExpandMemCmpPass, ())
|
|
DUMMY_FUNCTION_PASS("gc-lowering", GCLoweringPass, ())
|
|
DUMMY_FUNCTION_PASS("shadow-stack-gc-lowering", ShadowStackGCLoweringPass, ())
|
|
DUMMY_FUNCTION_PASS("sjljehprepare", SjLjEHPreparePass, ())
|
|
DUMMY_FUNCTION_PASS("dwarfehprepare", DwarfEHPass, ())
|
|
DUMMY_FUNCTION_PASS("winehprepare", WinEHPass, ())
|
|
DUMMY_FUNCTION_PASS("wasmehprepare", WasmEHPass, ())
|
|
DUMMY_FUNCTION_PASS("codegenprepare", CodeGenPreparePass, ())
|
|
DUMMY_FUNCTION_PASS("safe-stack", SafeStackPass, ())
|
|
DUMMY_FUNCTION_PASS("stack-protector", StackProtectorPass, ())
|
|
DUMMY_FUNCTION_PASS("atomic-expand", AtomicExpandPass, ())
|
|
DUMMY_FUNCTION_PASS("interleaved-access", InterleavedAccessPass, ())
|
|
DUMMY_FUNCTION_PASS("indirectbr-expand", IndirectBrExpandPass, ())
|
|
DUMMY_FUNCTION_PASS("cfguard-dispatch", CFGuardDispatchPass, ())
|
|
DUMMY_FUNCTION_PASS("cfguard-check", CFGuardCheckPass, ())
|
|
DUMMY_FUNCTION_PASS("gc-info-printer", GCInfoPrinterPass, ())
|
|
#undef DUMMY_FUNCTION_PASS
|
|
|
|
#ifndef DUMMY_MODULE_PASS
|
|
#define DUMMY_MODULE_PASS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
DUMMY_MODULE_PASS("lower-emutls", LowerEmuTLSPass, ())
|
|
#undef DUMMY_MODULE_PASS
|
|
|
|
#ifndef DUMMY_MACHINE_MODULE_PASS
|
|
#define DUMMY_MACHINE_MODULE_PASS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
DUMMY_MACHINE_MODULE_PASS("machine-outliner", MachineOutlinerPass, ())
|
|
#undef DUMMY_MACHINE_MODULE_PASS
|
|
|
|
#ifndef DUMMY_MACHINE_FUNCTION_PASS
|
|
#define DUMMY_MACHINE_FUNCTION_PASS(NAME, PASS_NAME, CONSTRUCTOR)
|
|
#endif
|
|
DUMMY_MACHINE_FUNCTION_PASS("mir-printer", PrintMIRPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("free-machine-function", FreeMachineFunctionPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("finalize-isel", FinalizeISelPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("localstackalloc", LocalStackSlotPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("shrink-wrap", ShrinkWrapPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("prologepilog", PrologEpilogInserterPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("postrapseudos", ExpandPostRAPseudosPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("implicit-null-checks", ImplicitNullChecksPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("postmisched", PostMachineSchedulerPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("machine-scheduler", MachineSchedulerPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("machine-cp", MachineCopyPropagationPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("post-RA-sched", PostRASchedulerPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("fentry-insert", FEntryInserterPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("xray-instrumentation", XRayInstrumentationPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("patchable-function", PatchableFunctionPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("reg-usage-propagation", RegUsageInfoPropagationPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("reg-usage-collector", RegUsageInfoCollectorPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("funclet-layout", FuncletLayoutPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("stackmap-liveness", StackMapLivenessPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("removeredundantdebugvalues", RemoveRedundantDebugValuesPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("livedebugvalues", LiveDebugValuesPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("early-tailduplication", EarlyTailDuplicatePass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("opt-phis", OptimizePHIsPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("stack-coloring", StackColoringPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("dead-mi-elimination", DeadMachineInstructionElimPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("early-machinelicm", EarlyMachineLICMPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("machinelicm", MachineLICMPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("machine-cse", MachineCSEPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("machine-sink", MachineSinkingPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("postra-machine-sink", PostRAMachineSinkingPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("peephole-opt", PeepholeOptimizerPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("regalloc", RegAllocPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("virtregrewriter", VirtRegRewriterPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("stack-slot-coloring", StackSlotColoringPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("phi-node-elimination", PHIEliminationPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("twoaddressinstruction", TwoAddressInstructionPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("detect-dead-lanes", DetectDeadLanesPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("processimpdefs", ProcessImplicitDefsPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("liveintervals", LiveIntervalsPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("simple-register-coalescing", RegisterCoalescerPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("rename-independent-subregs", RenameIndependentSubregsPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("branch-folder", BranchFolderPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("tailduplication", TailDuplicatePass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("block-placement", MachineBlockPlacementPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("block-placement-stats", MachineBlockPlacementStatsPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("early-ifcvt", EarlyIfConverterPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("machine-combiner", MachineCombinerPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("lrshrink", LiveRangeShrinkPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("break-false-deps", BreakFalseDepsPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("cfi-instr-inserter", CFIInstrInserterPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("cfguard-longjmp", CFGuardLongjmpPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("ra-basic", RABasicPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("ra-fast", RAFastPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("ra-greedy", RAGreedyPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("ra-pbqp", RAPBQPPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("legalizer", LegalizerPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("irtranslator", IRTranslatorPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("regbankselect", RegBankSelectPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("instruction-select", InstructionSelectPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("reset-machine-function", ResetMachineFunctionPass, ())
|
|
DUMMY_MACHINE_FUNCTION_PASS("machineverifier", MachineVerifierPass, ())
|
|
#undef DUMMY_MACHINE_FUNCTION_PASS
|