[llvm-commits] [llvm] r43805 - /llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
Evan Cheng
evan.cheng at apple.com
Tue Nov 6 23:10:16 PST 2007
Hi Owen,
Please use SmallPtrSet and / or SmallSet instead of std::set.
Thanks,
Evan
On Nov 6, 2007, at 9:17 PM, Owen Anderson wrote:
> Author: resistor
> Date: Tue Nov 6 23:17:15 2007
> New Revision: 43805
>
> URL: http://llvm.org/viewvc/llvm-project?rev=43805&view=rev
> Log:
> Add some more of StrongPHIElim.
>
> Modified:
> llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
>
> Modified: llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/
> StrongPHIElimination.cpp?rev=43805&r1=43804&r2=43805&view=diff
>
> ======================================================================
> ========
> --- llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp (original)
> +++ llvm/trunk/lib/CodeGen/StrongPHIElimination.cpp Tue Nov 6
> 23:17:15 2007
> @@ -89,7 +89,7 @@
>
>
> void computeDFS(MachineFunction& MF);
> - void processPHI(MachineInstr* P);
> + void processBlock(MachineBasicBlock* MBB);
>
> std::vector<DomForestNode*> computeDomForest
> (std::set<unsigned>& instrs);
>
> @@ -219,23 +219,85 @@
> return ret;
> }
>
> -/// processPHI - Eliminate the given PHI node
> -void StrongPHIElimination::processPHI(MachineInstr* P) {
> +/// isLiveIn - helper method that determines, from a VarInfo, if a
> register
> +/// is live into a block
> +bool isLiveIn(LiveVariables::VarInfo& V, MachineBasicBlock* MBB) {
> + if (V.AliveBlocks.test(MBB->getNumber()))
> + return true;
> +
> + for (std::vector<MachineInstr*>::iterator I = V.Kills.begin(),
> + E = V.Kills.end(); I != E; ++I)
> + if ((*I)->getParent() == MBB)
> + return true;
>
> + return false;
> }
>
> -bool StrongPHIElimination::runOnMachineFunction(MachineFunction
> &Fn) {
> - computeDFS(Fn);
> +/// isLiveOut - help method that determines, from a VarInfo, if a
> register is
> +/// live out of a block.
> +bool isLiveOut(LiveVariables::VarInfo& V, MachineBasicBlock* MBB) {
> + if (V.AliveBlocks.test(MBB->getNumber()))
> + return true;
>
> - for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I !
> = E; ++I) {
> - for (MachineBasicBlock::iterator BI = I->begin(), BE = I->end
> (); BI != BE;
> - ++BI) {
> - if (BI->getOpcode() == TargetInstrInfo::PHI)
> - processPHI(BI);
> - else
> - break;
> + if (V.DefInst->getParent() == MBB)
> + return true;
> +
> + return false;
> +}
> +
> +/// processBlock - Eliminate PHIs in the given block
> +void StrongPHIElimination::processBlock(MachineBasicBlock* MBB) {
> + LiveVariables& LV = getAnalysis<LiveVariables>();
> +
> + // Holds names that have been added to a set in any PHI within
> this block
> + // before the current one.
> + std::set<unsigned> ProcessedNames;
> +
> + MachineBasicBlock::iterator P = MBB->begin();
> + while (P->getOpcode() == TargetInstrInfo::PHI) {
> + LiveVariables::VarInfo& PHIInfo = LV.getVarInfo(P->getOperand
> (0).getReg());
> +
> + // Hold the names that are currently in the candidate set.
> + std::set<unsigned> PHIUnion;
> + std::set<MachineBasicBlock*> UnionedBlocks;
> +
> + for (int i = P->getNumOperands() - 1; i >= 2; i-=2) {
> + unsigned SrcReg = P->getOperand(i-1).getReg();
> + LiveVariables::VarInfo& SrcInfo = LV.getVarInfo(SrcReg);
> +
> + if (isLiveIn(SrcInfo, P->getParent())) {
> + // add a copy from a_i to p in Waiting[From[a_i]]
> + } else if (isLiveOut(PHIInfo, SrcInfo.DefInst->getParent())) {
> + // add a copy to Waiting[From[a_i]]
> + } else if (PHIInfo.DefInst->getOpcode() ==
> TargetInstrInfo::PHI &&
> + isLiveIn(PHIInfo, SrcInfo.DefInst->getParent())) {
> + // add a copy to Waiting[From[a_i]]
> + } else if (ProcessedNames.count(SrcReg)) {
> + // add a copy to Waiting[From[a_i]]
> + } else if (UnionedBlocks.count(SrcInfo.DefInst->getParent())) {
> + // add a copy to Waiting[From[a_i]]
> + } else {
> + PHIUnion.insert(SrcReg);
> + UnionedBlocks.insert(SrcInfo.DefInst->getParent());
> +
> + // DO STUFF HERE
> +
> + }
> +
> + ProcessedNames.insert(PHIUnion.begin(), PHIUnion.end());
> }
> +
> + ++P;
> }
> +}
> +
> +bool StrongPHIElimination::runOnMachineFunction(MachineFunction
> &Fn) {
> + computeDFS(Fn);
> +
> + for (MachineFunction::iterator I = Fn.begin(), E = Fn.end(); I !
> = E; ++I)
> + if (!I->empty() &&
> + I->begin()->getOpcode() == TargetInstrInfo::PHI)
> + processBlock(I);
>
> return false;
> }
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list