//===------- RISCVPushPopOptimizer.cpp - RISC-V Push/Pop opt. pass --------===// // // 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 contains a pass that replaces Zcmp POP instructions with // POPRET[Z] where possible. // //===----------------------------------------------------------------------===// #include "RISCVInstrInfo.h" #include "RISCVMachineFunctionInfo.h" usingnamespacellvm; #define RISCV_PUSH_POP_OPT_NAME … namespace { struct RISCVPushPopOpt : public MachineFunctionPass { … }; char RISCVPushPopOpt::ID = …; } // end of anonymous namespace INITIALIZE_PASS(…) // Check if POP instruction was inserted into the MBB and return iterator to it. static MachineBasicBlock::iterator containsPop(MachineBasicBlock &MBB) { … } bool RISCVPushPopOpt::usePopRet(MachineBasicBlock::iterator &MBBI, MachineBasicBlock::iterator &NextI, bool IsReturnZero) { … } // Search for last assignment to a0 and if possible use ret_val slot of POP to // store return value. bool RISCVPushPopOpt::adjustRetVal(MachineBasicBlock::iterator &MBBI) { … } bool RISCVPushPopOpt::runOnMachineFunction(MachineFunction &Fn) { … } /// createRISCVPushPopOptimizationPass - returns an instance of the /// Push/Pop optimization pass. FunctionPass *llvm::createRISCVPushPopOptimizationPass() { … }