blob: e3e79f01f5cd13151f554de19e607565c7d6f636 [file] [log] [blame]
Alkis Evlogimenos71499de2003-12-18 13:06:04 +00001//===-- TwoAddressInstructionPass.cpp - Two-Address instruction pass ------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Alkis Evlogimenos50c047d2004-01-04 23:09:24 +000010// This file implements the TwoAddress instruction pass which is used
11// by most register allocators. Two-Address instructions are rewritten
12// from:
13//
14// A = B op C
15//
16// to:
17//
18// A = B
Alkis Evlogimenos14be6402004-02-04 22:17:40 +000019// A op= C
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000020//
Alkis Evlogimenos14be6402004-02-04 22:17:40 +000021// Note that if a register allocator chooses to use this pass, that it
22// has to be capable of handling the non-SSA nature of these rewritten
23// virtual registers.
24//
25// It is also worth noting that the duplicate operand of the two
26// address instruction is removed.
Chris Lattnerbd91c1c2004-01-31 21:07:15 +000027//
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000028//===----------------------------------------------------------------------===//
29
30#define DEBUG_TYPE "twoaddrinstr"
Chris Lattnerbd91c1c2004-01-31 21:07:15 +000031#include "llvm/CodeGen/Passes.h"
Chris Lattner1e313632004-07-21 23:17:57 +000032#include "llvm/Function.h"
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000033#include "llvm/CodeGen/LiveVariables.h"
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000034#include "llvm/CodeGen/MachineFunctionPass.h"
35#include "llvm/CodeGen/MachineInstr.h"
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000036#include "llvm/CodeGen/SSARegMap.h"
37#include "llvm/Target/MRegisterInfo.h"
38#include "llvm/Target/TargetInstrInfo.h"
39#include "llvm/Target/TargetMachine.h"
Reid Spencer551ccae2004-09-01 22:55:40 +000040#include "llvm/Support/Debug.h"
41#include "llvm/ADT/Statistic.h"
42#include "llvm/ADT/STLExtras.h"
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000043using namespace llvm;
44
45namespace {
Misha Brukman75fa4e42004-07-22 15:26:23 +000046 Statistic<> numTwoAddressInstrs("twoaddressinstruction",
47 "Number of two-address instructions");
Chris Lattnerbd91c1c2004-01-31 21:07:15 +000048
Misha Brukman75fa4e42004-07-22 15:26:23 +000049 struct TwoAddressInstructionPass : public MachineFunctionPass {
50 virtual void getAnalysisUsage(AnalysisUsage &AU) const;
Alkis Evlogimenos4c080862003-12-18 22:40:24 +000051
Misha Brukman75fa4e42004-07-22 15:26:23 +000052 /// runOnMachineFunction - pass entry point
53 bool runOnMachineFunction(MachineFunction&);
54 };
Alkis Evlogimenos4c080862003-12-18 22:40:24 +000055
Misha Brukman75fa4e42004-07-22 15:26:23 +000056 RegisterPass<TwoAddressInstructionPass>
57 X("twoaddressinstruction", "Two-Address instruction pass");
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000058};
59
Alkis Evlogimenos4c080862003-12-18 22:40:24 +000060const PassInfo *llvm::TwoAddressInstructionPassID = X.getPassInfo();
61
Misha Brukman75fa4e42004-07-22 15:26:23 +000062void TwoAddressInstructionPass::getAnalysisUsage(AnalysisUsage &AU) const {
63 AU.addPreserved<LiveVariables>();
64 AU.addPreservedID(PHIEliminationID);
65 MachineFunctionPass::getAnalysisUsage(AU);
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000066}
67
68/// runOnMachineFunction - Reduce two-address instructions to two
Chris Lattner163c1e72004-01-31 21:14:04 +000069/// operands.
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000070///
Chris Lattner163c1e72004-01-31 21:14:04 +000071bool TwoAddressInstructionPass::runOnMachineFunction(MachineFunction &MF) {
Misha Brukman75fa4e42004-07-22 15:26:23 +000072 DEBUG(std::cerr << "Machine Function\n");
73 const TargetMachine &TM = MF.getTarget();
74 const MRegisterInfo &MRI = *TM.getRegisterInfo();
75 const TargetInstrInfo &TII = *TM.getInstrInfo();
76 LiveVariables* LV = getAnalysisToUpdate<LiveVariables>();
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000077
Misha Brukman75fa4e42004-07-22 15:26:23 +000078 bool MadeChange = false;
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000079
Misha Brukman75fa4e42004-07-22 15:26:23 +000080 DEBUG(std::cerr << "********** REWRITING TWO-ADDR INSTRS **********\n");
81 DEBUG(std::cerr << "********** Function: "
82 << MF.getFunction()->getName() << '\n');
Alkis Evlogimenos3a9986f2004-02-18 00:35:06 +000083
Misha Brukman75fa4e42004-07-22 15:26:23 +000084 for (MachineFunction::iterator mbbi = MF.begin(), mbbe = MF.end();
85 mbbi != mbbe; ++mbbi) {
86 for (MachineBasicBlock::iterator mi = mbbi->begin(), me = mbbi->end();
87 mi != me; ++mi) {
88 unsigned opcode = mi->getOpcode();
Chris Lattner163c1e72004-01-31 21:14:04 +000089
Misha Brukman75fa4e42004-07-22 15:26:23 +000090 // ignore if it is not a two-address instruction
91 if (!TII.isTwoAddrInstr(opcode))
92 continue;
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000093
Misha Brukman75fa4e42004-07-22 15:26:23 +000094 ++numTwoAddressInstrs;
95 DEBUG(std::cerr << '\t'; mi->print(std::cerr, &TM));
96 assert(mi->getOperand(1).isRegister() && mi->getOperand(1).getReg() &&
97 mi->getOperand(1).isUse() && "two address instruction invalid");
Alkis Evlogimenos71499de2003-12-18 13:06:04 +000098
Misha Brukman75fa4e42004-07-22 15:26:23 +000099 // if the two operands are the same we just remove the use
100 // and mark the def as def&use, otherwise we have to insert a copy.
101 if (mi->getOperand(0).getReg() != mi->getOperand(1).getReg()) {
102 // rewrite:
103 // a = b op c
104 // to:
105 // a = b
106 // a = a op c
107 unsigned regA = mi->getOperand(0).getReg();
108 unsigned regB = mi->getOperand(1).getReg();
Alkis Evlogimenos71499de2003-12-18 13:06:04 +0000109
Misha Brukman75fa4e42004-07-22 15:26:23 +0000110 assert(MRegisterInfo::isVirtualRegister(regA) &&
111 MRegisterInfo::isVirtualRegister(regB) &&
112 "cannot update physical register live information");
Chris Lattner6b507672004-01-31 21:21:43 +0000113
Misha Brukman75fa4e42004-07-22 15:26:23 +0000114 // first make sure we do not have a use of a in the
115 // instruction (a = b + a for example) because our
116 // transformation will not work. This should never occur
117 // because we are in SSA form.
Chris Lattner1e313632004-07-21 23:17:57 +0000118#ifndef NDEBUG
Misha Brukman75fa4e42004-07-22 15:26:23 +0000119 for (unsigned i = 1; i != mi->getNumOperands(); ++i)
120 assert(!mi->getOperand(i).isRegister() ||
121 mi->getOperand(i).getReg() != regA);
Chris Lattner1e313632004-07-21 23:17:57 +0000122#endif
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000123
Misha Brukman75fa4e42004-07-22 15:26:23 +0000124 const TargetRegisterClass* rc = MF.getSSARegMap()->getRegClass(regA);
Chris Lattner078fee32004-08-15 22:14:31 +0000125 MRI.copyRegToReg(*mbbi, mi, regA, regB, rc);
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000126
Misha Brukman75fa4e42004-07-22 15:26:23 +0000127 MachineBasicBlock::iterator prevMi = prior(mi);
128 DEBUG(std::cerr << "\t\tprepend:\t"; prevMi->print(std::cerr, &TM));
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000129
Misha Brukman75fa4e42004-07-22 15:26:23 +0000130 if (LV) {
131 // update live variables for regA
Misha Brukman75fa4e42004-07-22 15:26:23 +0000132 LiveVariables::VarInfo& varInfo = LV->getVarInfo(regA);
133 varInfo.DefInst = prevMi;
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000134
Misha Brukman75fa4e42004-07-22 15:26:23 +0000135 // update live variables for regB
136 if (LV->removeVirtualRegisterKilled(regB, mbbi, mi))
137 LV->addVirtualRegisterKilled(regB, prevMi);
Alkis Evlogimenos14be6402004-02-04 22:17:40 +0000138
Misha Brukman75fa4e42004-07-22 15:26:23 +0000139 if (LV->removeVirtualRegisterDead(regB, mbbi, mi))
140 LV->addVirtualRegisterDead(regB, prevMi);
Alkis Evlogimenos71499de2003-12-18 13:06:04 +0000141 }
Alkis Evlogimenos71499de2003-12-18 13:06:04 +0000142
Misha Brukman75fa4e42004-07-22 15:26:23 +0000143 // replace all occurences of regB with regA
144 for (unsigned i = 1, e = mi->getNumOperands(); i != e; ++i) {
145 if (mi->getOperand(i).isRegister() &&
146 mi->getOperand(i).getReg() == regB)
147 mi->SetMachineOperandReg(i, regA);
148 }
149 }
150
151 assert(mi->getOperand(0).isDef());
152 mi->getOperand(0).setUse();
153 mi->RemoveOperand(1);
154 MadeChange = true;
155
156 DEBUG(std::cerr << "\t\trewrite to:\t"; mi->print(std::cerr, &TM));
157 }
158 }
159
160 return MadeChange;
Alkis Evlogimenos71499de2003-12-18 13:06:04 +0000161}