Author: dpatel Date: Wed Aug 8 17:25:28 2007 New Revision: 40952 URL: http://llvm.org/viewvc/llvm-project?rev=40952&view=rev Log: Add cost analysis.
Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Modified: llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp?rev=40952&r1=40951&r2=40952&view=diff ============================================================================== --- llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp (original) +++ llvm/trunk/lib/Transforms/Scalar/LoopIndexSplit.cpp Wed Aug 8 17:25:28 2007 @@ -44,6 +44,7 @@ AU.addPreserved<LoopInfo>(); AU.addRequiredID(LoopSimplifyID); AU.addPreservedID(LoopSimplifyID); + AU.addRequired<DominatorTree>(); AU.addPreserved<DominatorTree>(); AU.addPreserved<DominanceFrontier>(); } @@ -90,14 +91,16 @@ /// such case eliminate loop structure surrounding this loop body. For bool processOneIterationLoop(SplitInfo &SD, LPPassManager &LPM); - // If loop header includes loop variant instruction operands then - // this loop may not be eliminated. + /// If loop header includes loop variant instruction operands then + /// this loop may not be eliminated. bool safeHeader(SplitInfo &SD, BasicBlock *BB); - // If Exit block includes loop variant instructions then this - // loop may not be eliminated. + /// If Exit block includes loop variant instructions then this + /// loop may not be eliminated. bool safeExitBlock(SplitInfo &SD, BasicBlock *BB); + /// Find cost of spliting loop L. + unsigned findSplitCost(Loop *L, SplitInfo &SD); bool splitLoop(SplitInfo &SD); private: @@ -105,7 +108,7 @@ // Current Loop. Loop *L; ScalarEvolution *SE; - + DominatorTree *DT; SmallVector<SplitInfo, 4> SplitData; }; @@ -123,6 +126,7 @@ L = IncomingLoop; SE = &getAnalysis<ScalarEvolution>(); + DT = &getAnalysis<DominatorTree>(); findSplitCondition(); @@ -143,18 +147,25 @@ } } + unsigned MaxCost = 99; + unsigned Index = 0; + unsigned MostProfitableSDIndex = 0; for (SmallVector<SplitInfo, 4>::iterator SI = SplitData.begin(), - E = SplitData.end(); SI != E; ++SI) { - SplitInfo &SD = *SI; + E = SplitData.end(); SI != E; ++SI, ++Index) { + SplitInfo SD = *SI; // ICM_EQs are already handled above. - if (SD.SplitCondition->getPredicate() == ICmpInst::ICMP_EQ) + if (SD.SplitCondition->getPredicate() == ICmpInst::ICMP_EQ) continue; - - // FIXME : Collect Spliting cost for all SD. Only operate on profitable SDs. - Changed = splitLoop(SD); + + unsigned Cost = findSplitCost(L, SD); + if (Cost < MaxCost) + MostProfitableSDIndex = Index; } + // Split most profitiable condition. + Changed = splitLoop(SplitData[MostProfitableSDIndex]); + if (Changed) ++NumIndexSplit; @@ -439,6 +450,25 @@ return true; } +/// Find cost of spliting loop L. Cost is measured in terms of size growth. +/// Size is growth is calculated based on amount of code duplicated in second +/// loop. +unsigned LoopIndexSplit::findSplitCost(Loop *L, SplitInfo &SD) { + + unsigned Cost = 0; + BasicBlock *SDBlock = SD.SplitCondition->getParent(); + for (Loop::block_iterator I = L->block_begin(), E = L->block_end(); + I != E; ++I) { + BasicBlock *BB = *I; + // If a block is not dominated by split condition block then + // it must be duplicated in both loops. + if (!DT->dominates(SDBlock, BB)) + Cost += BB->size(); + } + + return Cost; +} + bool LoopIndexSplit::splitLoop(SplitInfo &SD) { // FIXME :) return false; _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits