//===---- RemoveLoadsIntoFakeUses.cpp - Remove loads with no real uses ----===// // // 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 // //===----------------------------------------------------------------------===// /// /// \file /// The FAKE_USE instruction is used to preserve certain values through /// optimizations for the sake of debugging. This may result in spilled values /// being loaded into registers that are only used by FAKE_USEs; this is not /// necessary for debugging purposes, because at that point the value must be on /// the stack and hence available for debugging. Therefore, this pass removes /// loads that are only used by FAKE_USEs. /// /// This pass should run very late, to ensure that we don't inadvertently /// shorten stack lifetimes by removing these loads, since the FAKE_USEs will /// also no longer be in effect. Running immediately before LiveDebugValues /// ensures that LDV will have accurate information of the machine location of /// debug values. /// //===----------------------------------------------------------------------===// #include "llvm/ADT/PostOrderIterator.h" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/LiveRegUnits.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/IR/Function.h" #include "llvm/InitializePasses.h" #include "llvm/Support/Debug.h" usingnamespacellvm; #define DEBUG_TYPE … STATISTIC(NumLoadsDeleted, "Number of dead load instructions deleted"); STATISTIC(NumFakeUsesDeleted, "Number of FAKE_USE instructions deleted"); class RemoveLoadsIntoFakeUses : public MachineFunctionPass { … }; char RemoveLoadsIntoFakeUses::ID = …; char &llvm::RemoveLoadsIntoFakeUsesID = …; INITIALIZE_PASS_BEGIN(RemoveLoadsIntoFakeUses, DEBUG_TYPE, "Remove Loads Into Fake Uses", false, false) INITIALIZE_PASS_END(RemoveLoadsIntoFakeUses, DEBUG_TYPE, "Remove Loads Into Fake Uses", false, false) bool RemoveLoadsIntoFakeUses::runOnMachineFunction(MachineFunction &MF) { … }