//===- RemoveRedundantDebugValues.cpp - Remove Redundant Debug Value MIs --===// // // 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 // //===----------------------------------------------------------------------===// #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/Function.h" #include "llvm/InitializePasses.h" #include "llvm/Pass.h" #include "llvm/PassRegistry.h" /// \file RemoveRedundantDebugValues.cpp /// /// The RemoveRedundantDebugValues pass removes redundant DBG_VALUEs that /// appear in MIR after the register allocator. #define DEBUG_TYPE … usingnamespacellvm; STATISTIC(NumRemovedBackward, "Number of DBG_VALUEs removed (backward scan)"); STATISTIC(NumRemovedForward, "Number of DBG_VALUEs removed (forward scan)"); namespace { class RemoveRedundantDebugValues : public MachineFunctionPass { … }; } // namespace //===----------------------------------------------------------------------===// // Implementation //===----------------------------------------------------------------------===// char RemoveRedundantDebugValues::ID = …; char &llvm::RemoveRedundantDebugValuesID = …; INITIALIZE_PASS(…) /// Default construct and initialize the pass. RemoveRedundantDebugValues::RemoveRedundantDebugValues() : … { … } // This analysis aims to remove redundant DBG_VALUEs by going forward // in the basic block by considering the first DBG_VALUE as a valid // until its first (location) operand is not clobbered/modified. // For example: // (1) DBG_VALUE $edi, !"var1", ... // (2) <block of code that does affect $edi> // (3) DBG_VALUE $edi, !"var1", ... // ... // in this case, we can remove (3). // TODO: Support DBG_VALUE_LIST and other debug instructions. static bool reduceDbgValsForwardScan(MachineBasicBlock &MBB) { … } // This analysis aims to remove redundant DBG_VALUEs by going backward // in the basic block and removing all but the last DBG_VALUE for any // given variable in a set of consecutive DBG_VALUE instructions. // For example: // (1) DBG_VALUE $edi, !"var1", ... // (2) DBG_VALUE $esi, !"var2", ... // (3) DBG_VALUE $edi, !"var1", ... // ... // in this case, we can remove (1). static bool reduceDbgValsBackwardScan(MachineBasicBlock &MBB) { … } bool RemoveRedundantDebugValues::reduceDbgValues(MachineFunction &MF) { … } bool RemoveRedundantDebugValues::runOnMachineFunction(MachineFunction &MF) { … }