109467b48Spatrick //===-- LiveRangeUtils.h - Live Range modification utilities ----*- C++ -*-===// 209467b48Spatrick // 309467b48Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 409467b48Spatrick // See https://llvm.org/LICENSE.txt for license information. 509467b48Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 609467b48Spatrick // 709467b48Spatrick //===----------------------------------------------------------------------===// 873471bf0Spatrick /// \file 909467b48Spatrick /// This file contains helper functions to modify live ranges. 1073471bf0Spatrick /// 1109467b48Spatrick //===----------------------------------------------------------------------===// 1209467b48Spatrick 1309467b48Spatrick #ifndef LLVM_LIB_CODEGEN_LIVERANGEUTILS_H 1409467b48Spatrick #define LLVM_LIB_CODEGEN_LIVERANGEUTILS_H 1509467b48Spatrick 1609467b48Spatrick #include "llvm/CodeGen/LiveInterval.h" 1709467b48Spatrick 1809467b48Spatrick namespace llvm { 1909467b48Spatrick 2009467b48Spatrick /// Helper function that distributes live range value numbers and the 21*d415bd75Srobert /// corresponding segments of a primary live range \p LR to a list of newly 2209467b48Spatrick /// created live ranges \p SplitLRs. \p VNIClasses maps each value number in \p 2309467b48Spatrick /// LR to 0 meaning it should stay or to 1..N meaning it should go to a specific 2409467b48Spatrick /// live range in the \p SplitLRs array. 2509467b48Spatrick template<typename LiveRangeT, typename EqClassesT> DistributeRange(LiveRangeT & LR,LiveRangeT * SplitLRs[],EqClassesT VNIClasses)2609467b48Spatrickstatic void DistributeRange(LiveRangeT &LR, LiveRangeT *SplitLRs[], 2709467b48Spatrick EqClassesT VNIClasses) { 2809467b48Spatrick // Move segments to new intervals. 2909467b48Spatrick typename LiveRangeT::iterator J = LR.begin(), E = LR.end(); 3009467b48Spatrick while (J != E && VNIClasses[J->valno->id] == 0) 3109467b48Spatrick ++J; 3209467b48Spatrick for (typename LiveRangeT::iterator I = J; I != E; ++I) { 3309467b48Spatrick if (unsigned eq = VNIClasses[I->valno->id]) { 3409467b48Spatrick assert((SplitLRs[eq-1]->empty() || SplitLRs[eq-1]->expiredAt(I->start)) && 3509467b48Spatrick "New intervals should be empty"); 3609467b48Spatrick SplitLRs[eq-1]->segments.push_back(*I); 3709467b48Spatrick } else 3809467b48Spatrick *J++ = *I; 3909467b48Spatrick } 4009467b48Spatrick LR.segments.erase(J, E); 4109467b48Spatrick 4209467b48Spatrick // Transfer VNInfos to their new owners and renumber them. 4309467b48Spatrick unsigned j = 0, e = LR.getNumValNums(); 4409467b48Spatrick while (j != e && VNIClasses[j] == 0) 4509467b48Spatrick ++j; 4609467b48Spatrick for (unsigned i = j; i != e; ++i) { 4709467b48Spatrick VNInfo *VNI = LR.getValNumInfo(i); 4809467b48Spatrick if (unsigned eq = VNIClasses[i]) { 4909467b48Spatrick VNI->id = SplitLRs[eq-1]->getNumValNums(); 5009467b48Spatrick SplitLRs[eq-1]->valnos.push_back(VNI); 5109467b48Spatrick } else { 5209467b48Spatrick VNI->id = j; 5309467b48Spatrick LR.valnos[j++] = VNI; 5409467b48Spatrick } 5509467b48Spatrick } 5609467b48Spatrick LR.valnos.resize(j); 5709467b48Spatrick } 5809467b48Spatrick 5909467b48Spatrick } // End llvm namespace 6009467b48Spatrick 6109467b48Spatrick #endif 62