blob: 0a99a9825f1f44cc218365161bfc28f79123bc90 [file] [log] [blame]
Chris Dewhurst4f7cac32016-05-23 10:56:36 +00001//===------ 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
22LEONMachineFunctionPass::LEONMachineFunctionPass(TargetMachine &tm, char& ID) :
23 MachineFunctionPass(ID)
24{
25}
26
27LEONMachineFunctionPass::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//
37char InsertNOPLoad::ID = 0;
38
39InsertNOPLoad::InsertNOPLoad(TargetMachine &tm) :
40 LEONMachineFunctionPass(tm, ID)
41{
42}
43
44bool 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}