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 22 LEONMachineFunctionPass::LEONMachineFunctionPass(TargetMachine &tm, char& ID) : 23 MachineFunctionPass(ID) 24 { 25 } 26 27 LEONMachineFunctionPass::LEONMachineFunctionPass(char& ID) : 28 MachineFunctionPass(ID) 29 { 30 } 31 32 //***************************************************************************** 33 //**** InsertNOPLoad pass 34 //***************************************************************************** 35 //This pass inserts a NOP after any LD or LDF instruction. 36 // 37 char InsertNOPLoad::ID = 0; 38 39 InsertNOPLoad::InsertNOPLoad(TargetMachine &tm) : 40 LEONMachineFunctionPass(tm, ID) 41 { 42 } 43 44 bool InsertNOPLoad::runOnMachineFunction(MachineFunction& MF) 45 { 46 Subtarget = &MF.getSubtarget<SparcSubtarget>(); 47 const TargetInstrInfo& TII = *Subtarget->getInstrInfo(); 48 DebugLoc DL = DebugLoc(); 49 50 bool Modified = false; 51 for (auto MFI = MF.begin(), E = MF.end(); MFI != E; ++MFI) { 52 MachineBasicBlock &MBB = *MFI; 53 for (auto MBBI = MBB.begin(), E = MBB.end(); MBBI != E; ++ MBBI) { 54 MachineInstr &MI = *MBBI; 55 unsigned Opcode = MI.getOpcode(); 56 if (Opcode >= SP::LDDArr && Opcode <= SP::LDrr) { 57 //errs() << "Inserting NOP after LD instruction\n"; 58 MachineBasicBlock::iterator NMBBI = std::next(MBBI); 59 BuildMI(MBB, NMBBI, DL, TII.get(SP::NOP)); 60 Modified = true; 61 } 62 else if (MI.isInlineAsm()) { 63 std::string AsmString (MI.getOperand(InlineAsm::MIOp_AsmString) 64 .getSymbolName()); 65 std::string LDOpCoode ("ld"); 66 std::transform(AsmString.begin(), AsmString.end(), AsmString.begin(), 67 ::tolower); 68 if (AsmString.find(LDOpCoode) == 0) { // an inline ld or ldf instruction 69 //errs() << "Inserting NOP after LD instruction\n"; 70 MachineBasicBlock::iterator NMBBI = std::next(MBBI); 71 BuildMI(MBB, NMBBI, DL, TII.get(SP::NOP)); 72 Modified = true; 73 } 74 } 75 } 76 } 77 78 return Modified; 79 } 80