X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FCodeGen%2FPHIElimination.cpp;h=ffec6ca6d78ce8d70dff0cc3a57f83f6e93f995f;hb=2b4c279a8e203fa8b13adf7ba3a5d4c8bef70df3;hp=0314ae569cecd7d3511ecda0ad0468ee48ded2eb;hpb=4da1abb311b424d581cc1a67cde3aa0233da99b5;p=oota-llvm.git diff --git a/lib/CodeGen/PHIElimination.cpp b/lib/CodeGen/PHIElimination.cpp index 0314ae569ce..ffec6ca6d78 100644 --- a/lib/CodeGen/PHIElimination.cpp +++ b/lib/CodeGen/PHIElimination.cpp @@ -13,6 +13,7 @@ // //===----------------------------------------------------------------------===// +#define DEBUG_TYPE "phielim" #include "llvm/CodeGen/LiveVariables.h" #include "llvm/CodeGen/Passes.h" #include "llvm/CodeGen/MachineFunctionPass.h" @@ -20,7 +21,6 @@ #include "llvm/CodeGen/SSARegMap.h" #include "llvm/Target/TargetInstrInfo.h" #include "llvm/Target/TargetMachine.h" -#include "llvm/ADT/DenseMap.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/Statistic.h" #include "llvm/Support/Compiler.h" @@ -28,11 +28,14 @@ #include using namespace llvm; +STATISTIC(NumAtomic, "Number of atomic phis lowered"); +//STATISTIC(NumSimple, "Number of simple phis lowered"); + namespace { - static Statistic<> NumAtomic("phielim", "Number of atomic phis lowered"); - static Statistic<> NumSimple("phielim", "Number of simple phis lowered"); - struct VISIBILITY_HIDDEN PNE : public MachineFunctionPass { + static char ID; // Pass identification, replacement for typeid + PNE() : MachineFunctionPass((intptr_t)&ID) {} + bool runOnMachineFunction(MachineFunction &Fn) { analyzePHINodes(Fn); @@ -73,6 +76,7 @@ namespace { VRegPHIUse VRegPHIUseCount; }; + char PNE::ID = 0; RegisterPass X("phi-node-elimination", "Eliminate PHI nodes for register allocation"); } @@ -121,7 +125,7 @@ void PNE::LowerAtomicPHINode(MachineBasicBlock &MBB, unsigned DestReg = MPhi->getOperand(0).getReg(); - // Create a new register for the incoming PHI arguments/ + // Create a new register for the incoming PHI arguments. MachineFunction &MF = *MBB.getParent(); const TargetRegisterClass *RC = MF.getSSARegMap()->getRegClass(DestReg); unsigned IncomingReg = MF.getSSARegMap()->createVirtualRegister(RC); @@ -131,13 +135,16 @@ void PNE::LowerAtomicPHINode(MachineBasicBlock &MBB, // into the phi node destination. // const MRegisterInfo *RegInfo = MF.getTarget().getRegisterInfo(); - RegInfo->copyRegToReg(MBB, AfterPHIsIt, DestReg, IncomingReg, RC); + RegInfo->copyRegToReg(MBB, AfterPHIsIt, DestReg, IncomingReg, RC, RC); // Update live variable information if there is any... LiveVariables *LV = getAnalysisToUpdate(); if (LV) { MachineInstr *PHICopy = prior(AfterPHIsIt); + // Increment use count of the newly created virtual register. + LV->getVarInfo(IncomingReg).NumUses++; + // Add information to LiveVariables to know that the incoming value is // killed. Note that because the value is defined in several places (once // each for each incoming block), the "def" block and instruction fields @@ -164,11 +171,10 @@ void PNE::LowerAtomicPHINode(MachineBasicBlock &MBB, // Adjust the VRegPHIUseCount map to account for the removal of this PHI // node. - unsigned NumPreds = (MPhi->getNumOperands()-1)/2; for (unsigned i = 1; i != MPhi->getNumOperands(); i += 2) - VRegPHIUseCount[BBVRegPair( - MPhi->getOperand(i + 1).getMachineBasicBlock(), - MPhi->getOperand(i).getReg())] -= NumPreds; + --VRegPHIUseCount[BBVRegPair( + MPhi->getOperand(i + 1).getMachineBasicBlock(), + MPhi->getOperand(i).getReg())]; // Now loop over all of the incoming arguments, changing them to copy into // the IncomingReg register in the corresponding predecessor basic block. @@ -194,7 +200,7 @@ void PNE::LowerAtomicPHINode(MachineBasicBlock &MBB, MachineBasicBlock::iterator I = opBlock.getFirstTerminator(); // Insert the copy. - RegInfo->copyRegToReg(opBlock, I, IncomingReg, SrcReg, RC); + RegInfo->copyRegToReg(opBlock, I, IncomingReg, SrcReg, RC, RC); // Now update live variable information if we have it. Otherwise we're done if (!LV) continue; @@ -220,10 +226,7 @@ void PNE::LowerAtomicPHINode(MachineBasicBlock &MBB, // // Is it used by any PHI instructions in this block? - bool ValueIsLive = - VRegPHIUseCount[BBVRegPair( - MPhi->getOperand(i).getMachineBasicBlock(), - SrcReg)] != 0; + bool ValueIsLive = VRegPHIUseCount[BBVRegPair(&opBlock, SrcReg)] != 0; std::vector OpSuccBlocks; @@ -333,7 +336,7 @@ void PNE::analyzePHINodes(const MachineFunction& Fn) { for (MachineBasicBlock::const_iterator BBI = I->begin(), BBE = I->end(); BBI != BBE && BBI->getOpcode() == TargetInstrInfo::PHI; ++BBI) for (unsigned i = 1, e = BBI->getNumOperands(); i != e; i += 2) - VRegPHIUseCount[BBVRegPair( - BBI->getOperand(i + 1).getMachineBasicBlock(), - BBI->getOperand(i).getReg())]++; + ++VRegPHIUseCount[BBVRegPair( + BBI->getOperand(i + 1).getMachineBasicBlock(), + BBI->getOperand(i).getReg())]; }