1*9880d681SAndroid Build Coastguard Worker //===-- LiveRangeUtils.h - Live Range modification utilities ----*- C++ -*-===// 2*9880d681SAndroid Build Coastguard Worker // 3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker // 5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker // 8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker // 10*9880d681SAndroid Build Coastguard Worker /// This file contains helper functions to modify live ranges. 11*9880d681SAndroid Build Coastguard Worker // 12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===// 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker #ifndef LLVM_LIB_CODEGEN_LIVERANGEUTILS_H 15*9880d681SAndroid Build Coastguard Worker #define LLVM_LIB_CODEGEN_LIVERANGEUTILS_H 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Worker #include "llvm/CodeGen/LiveInterval.h" 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker namespace llvm { 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Worker /// Helper function that distributes live range value numbers and the 22*9880d681SAndroid Build Coastguard Worker /// corresponding segments of a master live range \p LR to a list of newly 23*9880d681SAndroid Build Coastguard Worker /// created live ranges \p SplitLRs. \p VNIClasses maps each value number in \p 24*9880d681SAndroid Build Coastguard Worker /// LR to 0 meaning it should stay or to 1..N meaning it should go to a specific 25*9880d681SAndroid Build Coastguard Worker /// live range in the \p SplitLRs array. 26*9880d681SAndroid Build Coastguard Worker template<typename LiveRangeT, typename EqClassesT> DistributeRange(LiveRangeT & LR,LiveRangeT * SplitLRs[],EqClassesT VNIClasses)27*9880d681SAndroid Build Coastguard Workerstatic void DistributeRange(LiveRangeT &LR, LiveRangeT *SplitLRs[], 28*9880d681SAndroid Build Coastguard Worker EqClassesT VNIClasses) { 29*9880d681SAndroid Build Coastguard Worker // Move segments to new intervals. 30*9880d681SAndroid Build Coastguard Worker typename LiveRangeT::iterator J = LR.begin(), E = LR.end(); 31*9880d681SAndroid Build Coastguard Worker while (J != E && VNIClasses[J->valno->id] == 0) 32*9880d681SAndroid Build Coastguard Worker ++J; 33*9880d681SAndroid Build Coastguard Worker for (typename LiveRangeT::iterator I = J; I != E; ++I) { 34*9880d681SAndroid Build Coastguard Worker if (unsigned eq = VNIClasses[I->valno->id]) { 35*9880d681SAndroid Build Coastguard Worker assert((SplitLRs[eq-1]->empty() || SplitLRs[eq-1]->expiredAt(I->start)) && 36*9880d681SAndroid Build Coastguard Worker "New intervals should be empty"); 37*9880d681SAndroid Build Coastguard Worker SplitLRs[eq-1]->segments.push_back(*I); 38*9880d681SAndroid Build Coastguard Worker } else 39*9880d681SAndroid Build Coastguard Worker *J++ = *I; 40*9880d681SAndroid Build Coastguard Worker } 41*9880d681SAndroid Build Coastguard Worker LR.segments.erase(J, E); 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker // Transfer VNInfos to their new owners and renumber them. 44*9880d681SAndroid Build Coastguard Worker unsigned j = 0, e = LR.getNumValNums(); 45*9880d681SAndroid Build Coastguard Worker while (j != e && VNIClasses[j] == 0) 46*9880d681SAndroid Build Coastguard Worker ++j; 47*9880d681SAndroid Build Coastguard Worker for (unsigned i = j; i != e; ++i) { 48*9880d681SAndroid Build Coastguard Worker VNInfo *VNI = LR.getValNumInfo(i); 49*9880d681SAndroid Build Coastguard Worker if (unsigned eq = VNIClasses[i]) { 50*9880d681SAndroid Build Coastguard Worker VNI->id = SplitLRs[eq-1]->getNumValNums(); 51*9880d681SAndroid Build Coastguard Worker SplitLRs[eq-1]->valnos.push_back(VNI); 52*9880d681SAndroid Build Coastguard Worker } else { 53*9880d681SAndroid Build Coastguard Worker VNI->id = j; 54*9880d681SAndroid Build Coastguard Worker LR.valnos[j++] = VNI; 55*9880d681SAndroid Build Coastguard Worker } 56*9880d681SAndroid Build Coastguard Worker } 57*9880d681SAndroid Build Coastguard Worker LR.valnos.resize(j); 58*9880d681SAndroid Build Coastguard Worker } 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Worker } // End llvm namespace 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker #endif 63