xref: /openbsd-src/gnu/llvm/llvm/lib/CodeGen/LiveRangeUtils.h (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
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)2609467b48Spatrick static 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