SplitKit.cpp revision 8ae0263471cc29c5f8278ee1ea5b678042ec6dce
1//===---------- SplitKit.cpp - Toolkit for splitting live ranges ----------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file contains the SplitAnalysis class as well as mutator functions for 11// live range splitting. 12// 13//===----------------------------------------------------------------------===// 14 15#define DEBUG_TYPE "splitter" 16#include "SplitKit.h" 17#include "llvm/CodeGen/LiveIntervalAnalysis.h" 18#include "llvm/CodeGen/MachineFunctionPass.h" 19#include "llvm/CodeGen/MachineLoopInfo.h" 20#include "llvm/CodeGen/MachineRegisterInfo.h" 21#include "llvm/Support/Debug.h" 22#include "llvm/Support/raw_ostream.h" 23 24using namespace llvm; 25 26 27//===----------------------------------------------------------------------===// 28// Split Analysis 29//===----------------------------------------------------------------------===// 30 31SplitAnalysis::SplitAnalysis(const MachineFunction *mf, 32 const LiveIntervals *lis, 33 const MachineLoopInfo *mli) 34 : mf_(*mf), 35 lis_(*lis), 36 loops_(*mli), 37 curli_(0) {} 38 39void SplitAnalysis::clear() { 40 usingInstrs_.clear(); 41 usingBlocks_.clear(); 42 usingLoops_.clear(); 43} 44 45/// analyseUses - Count instructions, basic blocks, and loops using curli. 46void SplitAnalysis::analyseUses() { 47 const MachineRegisterInfo &MRI = mf_.getRegInfo(); 48 for (MachineRegisterInfo::reg_iterator I = MRI.reg_begin(curli_->reg); 49 MachineInstr *MI = I.skipInstruction();) { 50 if (MI->isDebugValue() || !usingInstrs_.insert(MI)) 51 continue; 52 MachineBasicBlock *MBB = MI->getParent(); 53 if (usingBlocks_[MBB]++) 54 continue; 55 if (MachineLoop *Loop = loops_.getLoopFor(MBB)) 56 usingLoops_.insert(Loop); 57 } 58 DEBUG(dbgs() << "Counted " 59 << usingInstrs_.size() << " instrs, " 60 << usingBlocks_.size() << " blocks, " 61 << usingLoops_.size() << " loops in " 62 << *curli_ << "\n"); 63} 64 65SplitAnalysis::LoopPeripheralUse 66SplitAnalysis::analyzeLoopPeripheralUse(const MachineLoop *Loop) { 67 // Peripheral blocks. 68 SmallVector<MachineBasicBlock*, 16> Peri; 69 Loop->getExitBlocks(Peri); 70 if (MachineBasicBlock *PredBB = Loop->getLoopPredecessor()) 71 Peri.push_back(PredBB); 72 array_pod_sort(Peri.begin(), Peri.end()); 73 Peri.erase(std::unique(Peri.begin(), Peri.end()), Peri.end()); 74 75 LoopPeripheralUse use = ContainedInLoop; 76 for (BlockCountMap::iterator I = usingBlocks_.begin(), E = usingBlocks_.end(); 77 I != E; ++I) { 78 const MachineBasicBlock *MBB = I->first; 79 // Is this a peripheral block? 80 if (use < MultiPeripheral && 81 std::binary_search(Peri.begin(), Peri.end(), MBB)) { 82 if (I->second > 1) use = MultiPeripheral; 83 else use = SinglePeripheral; 84 continue; 85 } 86 // Is it a loop block? 87 if (Loop->contains(MBB)) 88 continue; 89 // It must be an unrelated block. 90 return OutsideLoop; 91 } 92 return use; 93} 94 95void SplitAnalysis::analyze(const LiveInterval *li) { 96 clear(); 97 curli_ = li; 98 analyseUses(); 99} 100 101const MachineLoop *SplitAnalysis::getBestSplitLoop() { 102 LoopPtrSet Loops, SecondLoops; 103 104 // Find first-class and second class candidate loops. 105 // We prefer to split around loops where curli is used outside the periphery. 106 for (LoopPtrSet::const_iterator I = usingLoops_.begin(), 107 E = usingLoops_.end(); I != E; ++I) 108 switch(analyzeLoopPeripheralUse(*I)) { 109 case OutsideLoop: 110 Loops.insert(*I); 111 break; 112 case MultiPeripheral: 113 SecondLoops.insert(*I); 114 break; 115 default: 116 continue; 117 } 118 119 // If there are no first class loops available, look at second class loops. 120 if (Loops.empty()) 121 Loops = SecondLoops; 122 123 if (Loops.empty()) 124 return 0; 125 126 // Pick the earliest loop. 127 // FIXME: Are there other heuristics to consider? 128 // - avoid breaking critical edges. 129 // - avoid impossible loops. 130 const MachineLoop *Best = 0; 131 SlotIndex BestIdx; 132 for (LoopPtrSet::const_iterator I = Loops.begin(), E = Loops.end(); I != E; 133 ++I) { 134 SlotIndex Idx = lis_.getMBBStartIdx((*I)->getHeader()); 135 if (!Best || Idx < BestIdx) 136 Best = *I, BestIdx = Idx; 137 } 138 return Best; 139} 140 141//===----------------------------------------------------------------------===// 142// Loop Splitting 143//===----------------------------------------------------------------------===// 144 145bool llvm::splitAroundLoop(SplitAnalysis &sa, const MachineLoop *loop) { 146 return false; 147} 148 149