//===- OptimizePHIs.cpp - Optimize machine instruction PHIs ---------------===// // // 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 pass optimizes machine instruction PHIs to take advantage of // opportunities created during DAG legalization. // //===----------------------------------------------------------------------===// #include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/Statistic.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineOperand.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" #include "llvm/InitializePasses.h" #include "llvm/Pass.h" #include <cassert> usingnamespacellvm; #define DEBUG_TYPE … STATISTIC(NumPHICycles, "Number of PHI cycles replaced"); STATISTIC(NumDeadPHICycles, "Number of dead PHI cycles"); namespace { class OptimizePHIs : public MachineFunctionPass { … }; } // end anonymous namespace char OptimizePHIs::ID = …; char &llvm::OptimizePHIsID = …; INITIALIZE_PASS(…) bool OptimizePHIs::runOnMachineFunction(MachineFunction &Fn) { … } /// IsSingleValuePHICycle - Check if MI is a PHI where all the source operands /// are copies of SingleValReg, possibly via copies through other PHIs. If /// SingleValReg is zero on entry, it is set to the register with the single /// non-copy value. PHIsInCycle is a set used to keep track of the PHIs that /// have been scanned. PHIs may be grouped by cycle, several cycles or chains. bool OptimizePHIs::IsSingleValuePHICycle(MachineInstr *MI, unsigned &SingleValReg, InstrSet &PHIsInCycle) { … } /// IsDeadPHICycle - Check if the register defined by a PHI is only used by /// other PHIs in a cycle. bool OptimizePHIs::IsDeadPHICycle(MachineInstr *MI, InstrSet &PHIsInCycle) { … } /// OptimizeBB - Remove dead PHI cycles and PHI cycles that can be replaced by /// a single value. bool OptimizePHIs::OptimizeBB(MachineBasicBlock &MBB) { … }