//===------- HexagonTfrCleanup.cpp - Hexagon Transfer Cleanup 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 pass is to address a situation that appears after register allocaion // evey now and then, namely a register copy from a source that was defined // as an immediate value in the same block (usually just before the copy). // // Here is an example of actual code emitted that shows this problem: // // .LBB0_5: // { // r5 = zxtb(r8) // r6 = or(r6, ##12345) // } // { // r3 = xor(r1, r2) // r1 = #0 <-- r1 set to #0 // } // { // r7 = r1 <-- r7 set to r1 // r0 = zxtb(r3) // } #define DEBUG_TYPE … #include "HexagonTargetMachine.h" #include "llvm/CodeGen/LiveInterval.h" #include "llvm/CodeGen/LiveIntervals.h" #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineInstrBuilder.h" #include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/TargetInstrInfo.h" #include "llvm/CodeGen/TargetRegisterInfo.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/Debug.h" #include "llvm/Support/raw_ostream.h" #include "llvm/Target/TargetMachine.h" usingnamespacellvm; namespace llvm { FunctionPass *createHexagonTfrCleanup(); void initializeHexagonTfrCleanupPass(PassRegistry &); } // namespace llvm namespace { class HexagonTfrCleanup : public MachineFunctionPass { … }; } // namespace char HexagonTfrCleanup::ID = …; namespace llvm { char &HexagonTfrCleanupID = …; } bool HexagonTfrCleanup::isIntReg(unsigned Reg, bool &Is32) { … } // Assign given value V32 to the specified the register R32 in the map. Only // 32-bit registers are valid arguments. void HexagonTfrCleanup::setReg(unsigned R32, uint32_t V32, ImmediateMap &IMap) { … } // Retrieve a value of the provided register Reg and store it into Val. // Return "true" if a value was found, "false" otherwise. bool HexagonTfrCleanup::getReg(unsigned Reg, uint64_t &Val, ImmediateMap &IMap) { … } // Process an instruction and record the relevant information in the imme- // diate map. bool HexagonTfrCleanup::updateImmMap(MachineInstr *MI, ImmediateMap &IMap) { … } // Rewrite the instruction as A2_tfrsi/A2_tfrpi, it is a copy of a source that // has a known constant value. bool HexagonTfrCleanup::rewriteIfImm(MachineInstr *MI, ImmediateMap &IMap, SlotIndexes *Indexes) { … } // Remove the instruction if it is a self-assignment. bool HexagonTfrCleanup::eraseIfRedundant(MachineInstr *MI, SlotIndexes *Indexes) { … } bool HexagonTfrCleanup::runOnMachineFunction(MachineFunction &MF) { … } //===----------------------------------------------------------------------===// // Public Constructor Functions //===----------------------------------------------------------------------===// INITIALIZE_PASS(…) FunctionPass *llvm::createHexagonTfrCleanup() { … }