1 //===------ LeonPasses.cpp - Define passes specific to LEON ---------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // 11 //===----------------------------------------------------------------------===// 12 13 #include "LeonPasses.h" 14 #include "llvm/CodeGen/MachineFunction.h" 15 #include "llvm/CodeGen/ISDOpcodes.h" 16 #include "llvm/Support/raw_ostream.h" 17 #include "llvm/IR/LLVMContext.h" 18 #include "llvm/CodeGen/MachineInstrBuilder.h" 19 #include "llvm/CodeGen/MachineInstr.h" 20 #include "llvm/CodeGen/MachineRegisterInfo.h" 21 using namespace llvm; 22 23 LEONMachineFunctionPass::LEONMachineFunctionPass(TargetMachine &tm, char& ID) : 24 MachineFunctionPass(ID) 25 { 26 } 27 28 LEONMachineFunctionPass::LEONMachineFunctionPass(char& ID) : 29 MachineFunctionPass(ID) 30 { 31 } 32 33 //***************************************************************************** 34 //**** InsertNOPLoad pass 35 //***************************************************************************** 36 //This pass inserts a NOP after any LD or LDF instruction. 37 // 38 char InsertNOPLoad::ID = 0; 39 40 InsertNOPLoad::InsertNOPLoad(TargetMachine &tm) : 41 LEONMachineFunctionPass(tm, ID) 42 { 43 } 44 45 bool InsertNOPLoad::runOnMachineFunction(MachineFunction& MF) 46 { 47 Subtarget = &MF.getSubtarget<SparcSubtarget>(); 48 const TargetInstrInfo& TII = *Subtarget->getInstrInfo(); 49 DebugLoc DL = DebugLoc(); 50 51 bool Modified = false; 52 for (auto MFI = MF.begin(), E = MF.end(); MFI != E; ++MFI) { 53 MachineBasicBlock &MBB = *MFI; 54 for (auto MBBI = MBB.begin(), E = MBB.end(); MBBI != E; ++ MBBI) { 55 MachineInstr &MI = *MBBI; 56 unsigned Opcode = MI.getOpcode(); 57 if (Opcode >= SP::LDDArr && Opcode <= SP::LDrr) { 58 //errs() << "Inserting NOP after LD instruction\n"; 59 MachineBasicBlock::iterator NMBBI = std::next(MBBI); 60 BuildMI(MBB, NMBBI, DL, TII.get(SP::NOP)); 61 Modified = true; 62 } 63 else if (MI.isInlineAsm()) { 64 std::string AsmString (MI.getOperand(InlineAsm::MIOp_AsmString) 65 .getSymbolName()); 66 std::string LDOpCoode ("ld"); 67 std::transform(AsmString.begin(), AsmString.end(), AsmString.begin(), 68 ::tolower); 69 if (AsmString.find(LDOpCoode) == 0) { // an inline ld or ldf instruction 70 //errs() << "Inserting NOP after LD instruction\n"; 71 MachineBasicBlock::iterator NMBBI = std::next(MBBI); 72 BuildMI(MBB, NMBBI, DL, TII.get(SP::NOP)); 73 Modified = true; 74 } 75 } 76 } 77 } 78 79 return Modified; 80 } 81