39 : AV(0), InsertedPHIs(NewPHI) {
75 return GetValueAtEndOfBlockInternal(BB);
80 SmallVectorImpl<std::pair<MachineBasicBlock*, unsigned> > &PredValues) {
89 for (
unsigned i = 0, e = PredValues.size(); i != e; ++i)
90 AVals[PredValues[i].first] = PredValues[i].second;
91 while (I != BB->
end() && I->isPHI()) {
93 for (
unsigned i = 1, e = I->getNumOperands(); i != e; i += 2) {
94 unsigned SrcReg = I->getOperand(i).getReg();
96 if (AVals[SrcBB] != SrcReg) {
102 return I->getOperand(0).getReg();
144 return GetValueAtEndOfBlockInternal(BB);
158 unsigned SingularValue = 0;
160 bool isFirstPred =
true;
162 E = BB->
pred_end(); PI != E; ++PI) {
164 unsigned PredVal = GetValueAtEndOfBlockInternal(PredBB);
165 PredValues.
push_back(std::make_pair(PredBB, PredVal));
169 SingularValue = PredVal;
171 }
else if (PredVal != SingularValue)
176 if (SingularValue != 0)
177 return SingularValue;
190 for (
unsigned i = 0, e = PredValues.
size(); i != e; ++i)
191 InsertedPHI.
addReg(PredValues[i].second).
addMBB(PredValues[i].first);
201 if (InsertedPHIs) InsertedPHIs->push_back(InsertedPHI);
203 DEBUG(
dbgs() <<
" Inserted PHI: " << *InsertedPHI <<
"\n");
223 if (UseMI->
isPHI()) {
225 NewVR = GetValueAtEndOfBlockInternal(SourceBB);
233 void MachineSSAUpdater::ReplaceRegWith(
unsigned OldReg,
unsigned NewReg) {
238 I = AvailableVals.
begin(), E = AvailableVals.
end();
I != E; ++
I)
239 if (
I->second == OldReg)
267 :
PHI(P), idx(
PHI->getNumOperands()) {}
270 bool operator==(
const PHI_iterator& x)
const {
return idx == x.idx; }
274 return PHI->getOperand(idx+1).getMBB();
279 return PHI_iterator(PHI,
true);
298 Updater->VRC, Updater->MRI,
309 Updater->VRC, Updater->MRI,
332 return InstrIsPHI(Updater->MRI->
getVRegDef(Val));
359 if (
unsigned V = AvailableVals[BB])
363 return Impl.GetValue(BB);
void push_back(const T &Elt)
const MachineFunction * getParent() const
MachineInstr * getParent()
bool operator==(const PHI_iterator &x) const
MachineBasicBlock * getMBB() const
PHI_iterator & operator++()
unsigned createVirtualRegister(const TargetRegisterClass *RegClass)
static MachineInstrBuilder InsertNewDef(unsigned Opcode, MachineBasicBlock *BB, MachineBasicBlock::iterator I, const TargetRegisterClass *RC, MachineRegisterInfo *MRI, const TargetInstrInfo *TII)
iterator getFirstTerminator()
static PHI_iterator PHI_begin(PhiT *PHI)
void RewriteUse(MachineOperand &U)
static void FindPredecessorBlocks(MachineBasicBlock *BB, SmallVectorImpl< MachineBasicBlock * > *Preds)
unsigned GetValueAtEndOfBlock(MachineBasicBlock *BB)
const HexagonInstrInfo * TII
#define llvm_unreachable(msg)
bool HasValueForBlock(MachineBasicBlock *BB) const
const TargetRegisterClass * getRegClass(unsigned Reg) const
std::vector< MachineBasicBlock * >::iterator succ_iterator
PHI_iterator(MachineInstr *P, bool)
unsigned getNumOperands() const
bool operator!=(const PHI_iterator &x) const
static MachineInstr * ValueIsNewPHI(unsigned Val, MachineSSAUpdater *Updater)
std::vector< MachineBasicBlock * >::iterator pred_iterator
void Initialize(unsigned V)
const MachineBasicBlock * getParent() const
bundle_iterator< MachineInstr, instr_iterator > iterator
const MachineOperand & getOperand(unsigned i) const
bool count(const KeyT &Val) const
count - Return true if the specified key is in the map.
MachineInstrBuilder BuildMI(MachineFunction &MF, DebugLoc DL, const MCInstrDesc &MCID)
succ_iterator succ_begin()
static BlkSucc_iterator BlkSucc_end(BlkT *BB)
pred_iterator pred_begin()
static void AddPHIOperand(MachineInstr *PHI, unsigned Val, MachineBasicBlock *Pred)
const MCInstrDesc & get(unsigned Opcode) const
virtual const TargetInstrInfo * getInstrInfo() const
MachineSSAUpdater(MachineFunction &MF, SmallVectorImpl< MachineInstr * > *InsertedPHIs=0)
static MachineBasicBlock * findCorrespondingPred(const MachineInstr *MI, MachineOperand *U)
static unsigned CreateEmptyPHI(MachineBasicBlock *BB, unsigned NumPreds, MachineSSAUpdater *Updater)
static MachineInstr * ValueIsPHI(unsigned Val, MachineSSAUpdater *Updater)
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
void replaceRegWith(unsigned FromReg, unsigned ToReg)
MachineBasicBlock::succ_iterator BlkSucc_iterator
static PHI_iterator PHI_end(PhiT *PHI)
static unsigned LookForIdenticalPHI(MachineBasicBlock *BB, SmallVectorImpl< std::pair< MachineBasicBlock *, unsigned > > &PredValues)
static unsigned GetUndefVal(MachineBasicBlock *BB, MachineSSAUpdater *Updater)
MachineRegisterInfo & getRegInfo()
IMPLICIT_DEF - This is the MachineInstr-level equivalent of undef.
void setReg(unsigned Reg)
const TargetMachine & getTarget() const
unsigned GetValueInMiddleOfBlock(MachineBasicBlock *BB)
void AddAvailableValue(MachineBasicBlock *BB, unsigned V)
MachineInstr * getVRegDef(unsigned Reg) const
DenseMap< MachineBasicBlock *, unsigned > AvailableValsTy
unsigned getReg() const
getReg - Returns the register number.
unsigned getIncomingValue()
unsigned isConstantValuePHI() const
const MachineInstrBuilder & addMBB(MachineBasicBlock *MBB, unsigned char TargetFlags=0) const
static MachineInstr * InstrIsPHI(MachineInstr *I)
MachineBasicBlock * getIncomingBlock()
const MCRegisterInfo & MRI
static unsigned GetPHIValue(MachineInstr *PHI)
bool operator==(uint64_t V1, const APInt &V2)
static AvailableValsTy & getAvailableVals(void *AV)
static BlkSucc_iterator BlkSucc_begin(BlkT *BB)
const MachineInstrBuilder & addReg(unsigned RegNo, unsigned flags=0, unsigned SubReg=0) const
PHI_iterator(MachineInstr *P)