blob: 7cdf862a3c0b6fcd2caed7dd9c8bc898552b96d2 [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"
Benjamin Kramer797fb962016-05-27 10:06:27 +000021using namespace llvm;
Chris Dewhurst4f7cac32016-05-23 10:56:36 +000022
23LEONMachineFunctionPass::LEONMachineFunctionPass(TargetMachine &tm, char& ID) :
24 MachineFunctionPass(ID)
25{
26}
27
28LEONMachineFunctionPass::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//
38char InsertNOPLoad::ID = 0;
39
40InsertNOPLoad::InsertNOPLoad(TargetMachine &tm) :
41 LEONMachineFunctionPass(tm, ID)
42{
43}
44
45bool 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}