Coverage Report

Created: 2019-07-24 05:18

/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/lib/CodeGen/LiveRangeUtils.h
Line
Count
Source
1
//===-- LiveRangeUtils.h - Live Range modification utilities ----*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
//
9
/// This file contains helper functions to modify live ranges.
10
//
11
//===----------------------------------------------------------------------===//
12
13
#ifndef LLVM_LIB_CODEGEN_LIVERANGEUTILS_H
14
#define LLVM_LIB_CODEGEN_LIVERANGEUTILS_H
15
16
#include "llvm/CodeGen/LiveInterval.h"
17
18
namespace llvm {
19
20
/// Helper function that distributes live range value numbers and the
21
/// corresponding segments of a master live range \p LR to a list of newly
22
/// created live ranges \p SplitLRs. \p VNIClasses maps each value number in \p
23
/// LR to 0 meaning it should stay or to 1..N meaning it should go to a specific
24
/// live range in the \p SplitLRs array.
25
template<typename LiveRangeT, typename EqClassesT>
26
static void DistributeRange(LiveRangeT &LR, LiveRangeT *SplitLRs[],
27
65.5k
                            EqClassesT VNIClasses) {
28
65.5k
  // Move segments to new intervals.
29
65.5k
  typename LiveRangeT::iterator J = LR.begin(), E = LR.end();
30
193k
  while (J != E && 
VNIClasses[J->valno->id] == 0193k
)
31
128k
    ++J;
32
256k
  for (typename LiveRangeT::iterator I = J; I != E; 
++I191k
) {
33
191k
    if (unsigned eq = VNIClasses[I->valno->id]) {
34
163k
      assert((SplitLRs[eq-1]->empty() || SplitLRs[eq-1]->expiredAt(I->start)) &&
35
163k
             "New intervals should be empty");
36
163k
      SplitLRs[eq-1]->segments.push_back(*I);
37
163k
    } else
38
27.4k
      *J++ = *I;
39
191k
  }
40
65.5k
  LR.segments.erase(J, E);
41
65.5k
42
65.5k
  // Transfer VNInfos to their new owners and renumber them.
43
65.5k
  unsigned j = 0, e = LR.getNumValNums();
44
158k
  while (j != e && 
VNIClasses[j] == 0158k
)
45
93.2k
    ++j;
46
198k
  for (unsigned i = j; i != e; 
++i132k
) {
47
132k
    VNInfo *VNI = LR.getValNumInfo(i);
48
132k
    if (unsigned eq = VNIClasses[i]) {
49
118k
      VNI->id = SplitLRs[eq-1]->getNumValNums();
50
118k
      SplitLRs[eq-1]->valnos.push_back(VNI);
51
118k
    } else {
52
13.9k
      VNI->id = j;
53
13.9k
      LR.valnos[j++] = VNI;
54
13.9k
    }
55
132k
  }
56
65.5k
  LR.valnos.resize(j);
57
65.5k
}
LiveInterval.cpp:void llvm::DistributeRange<llvm::LiveInterval::SubRange, llvm::SmallVector<unsigned int, 8u> >(llvm::LiveInterval::SubRange&, llvm::LiveInterval::SubRange**, llvm::SmallVector<unsigned int, 8u>)
Line
Count
Source
27
122
                            EqClassesT VNIClasses) {
28
122
  // Move segments to new intervals.
29
122
  typename LiveRangeT::iterator J = LR.begin(), E = LR.end();
30
240
  while (J != E && VNIClasses[J->valno->id] == 0)
31
118
    ++J;
32
244
  for (typename LiveRangeT::iterator I = J; I != E; 
++I122
) {
33
122
    if (unsigned eq = VNIClasses[I->valno->id]) {
34
122
      assert((SplitLRs[eq-1]->empty() || SplitLRs[eq-1]->expiredAt(I->start)) &&
35
122
             "New intervals should be empty");
36
122
      SplitLRs[eq-1]->segments.push_back(*I);
37
122
    } else
38
0
      *J++ = *I;
39
122
  }
40
122
  LR.segments.erase(J, E);
41
122
42
122
  // Transfer VNInfos to their new owners and renumber them.
43
122
  unsigned j = 0, e = LR.getNumValNums();
44
124
  while (j != e && VNIClasses[j] == 0)
45
2
    ++j;
46
362
  for (unsigned i = j; i != e; 
++i240
) {
47
240
    VNInfo *VNI = LR.getValNumInfo(i);
48
240
    if (unsigned eq = VNIClasses[i]) {
49
122
      VNI->id = SplitLRs[eq-1]->getNumValNums();
50
122
      SplitLRs[eq-1]->valnos.push_back(VNI);
51
122
    } else {
52
118
      VNI->id = j;
53
118
      LR.valnos[j++] = VNI;
54
118
    }
55
240
  }
56
122
  LR.valnos.resize(j);
57
122
}
LiveInterval.cpp:void llvm::DistributeRange<llvm::LiveInterval, llvm::IntEqClasses>(llvm::LiveInterval&, llvm::LiveInterval**, llvm::IntEqClasses)
Line
Count
Source
27
64.5k
                            EqClassesT VNIClasses) {
28
64.5k
  // Move segments to new intervals.
29
64.5k
  typename LiveRangeT::iterator J = LR.begin(), E = LR.end();
30
192k
  while (J != E && VNIClasses[J->valno->id] == 0)
31
127k
    ++J;
32
254k
  for (typename LiveRangeT::iterator I = J; I != E; 
++I190k
) {
33
190k
    if (unsigned eq = VNIClasses[I->valno->id]) {
34
162k
      assert((SplitLRs[eq-1]->empty() || SplitLRs[eq-1]->expiredAt(I->start)) &&
35
162k
             "New intervals should be empty");
36
162k
      SplitLRs[eq-1]->segments.push_back(*I);
37
162k
    } else
38
27.4k
      *J++ = *I;
39
190k
  }
40
64.5k
  LR.segments.erase(J, E);
41
64.5k
42
64.5k
  // Transfer VNInfos to their new owners and renumber them.
43
64.5k
  unsigned j = 0, e = LR.getNumValNums();
44
157k
  while (j != e && VNIClasses[j] == 0)
45
93.0k
    ++j;
46
196k
  for (unsigned i = j; i != e; 
++i131k
) {
47
131k
    VNInfo *VNI = LR.getValNumInfo(i);
48
131k
    if (unsigned eq = VNIClasses[i]) {
49
118k
      VNI->id = SplitLRs[eq-1]->getNumValNums();
50
118k
      SplitLRs[eq-1]->valnos.push_back(VNI);
51
118k
    } else {
52
13.8k
      VNI->id = j;
53
13.8k
      LR.valnos[j++] = VNI;
54
13.8k
    }
55
131k
  }
56
64.5k
  LR.valnos.resize(j);
57
64.5k
}
RenameIndependentSubregs.cpp:void llvm::DistributeRange<llvm::LiveInterval::SubRange, llvm::SmallVector<unsigned int, 8u> >(llvm::LiveInterval::SubRange&, llvm::LiveInterval::SubRange**, llvm::SmallVector<unsigned int, 8u>)
Line
Count
Source
27
818
                            EqClassesT VNIClasses) {
28
818
  // Move segments to new intervals.
29
818
  typename LiveRangeT::iterator J = LR.begin(), E = LR.end();
30
1.05k
  while (J != E && 
VNIClasses[J->valno->id] == 0856
)
31
238
    ++J;
32
1.57k
  for (typename LiveRangeT::iterator I = J; I != E; 
++I752
) {
33
752
    if (unsigned eq = VNIClasses[I->valno->id]) {
34
750
      assert((SplitLRs[eq-1]->empty() || SplitLRs[eq-1]->expiredAt(I->start)) &&
35
750
             "New intervals should be empty");
36
750
      SplitLRs[eq-1]->segments.push_back(*I);
37
750
    } else
38
2
      *J++ = *I;
39
752
  }
40
818
  LR.segments.erase(J, E);
41
818
42
818
  // Transfer VNInfos to their new owners and renumber them.
43
818
  unsigned j = 0, e = LR.getNumValNums();
44
1.06k
  while (j != e && 
VNIClasses[j] == 0862
)
45
244
    ++j;
46
1.57k
  for (unsigned i = j; i != e; 
++i760
) {
47
760
    VNInfo *VNI = LR.getValNumInfo(i);
48
760
    if (unsigned eq = VNIClasses[i]) {
49
760
      VNI->id = SplitLRs[eq-1]->getNumValNums();
50
760
      SplitLRs[eq-1]->valnos.push_back(VNI);
51
760
    } else {
52
0
      VNI->id = j;
53
0
      LR.valnos[j++] = VNI;
54
0
    }
55
760
  }
56
818
  LR.valnos.resize(j);
57
818
}
58
59
} // End llvm namespace
60
61
#endif