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 // Look for an inline ld or ldf instruction. 65 StringRef AsmString = 66 MI.getOperand(InlineAsm::MIOp_AsmString).getSymbolName(); 67 if (AsmString.startswith_lower("ld")) { 68 //errs() << "Inserting NOP after LD instruction\n"; 69 MachineBasicBlock::iterator NMBBI = std::next(MBBI); 70 BuildMI(MBB, NMBBI, DL, TII.get(SP::NOP)); 71 Modified = true; 72 } 73 } 74 } 75 } 76 77 return Modified; 78 } 79