LCOV - code coverage report
Current view: top level - lib/CodeGen - LiveIntervalUnion.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 66 73 90.4 %
Date: 2018-10-20 13:21:21 Functions: 6 7 85.7 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===- LiveIntervalUnion.cpp - Live interval union data structure ---------===//
       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             : // LiveIntervalUnion represents a coalesced set of live intervals. This may be
      11             : // used during coalescing to represent a congruence class, or during register
      12             : // allocation to model liveness of a physical register.
      13             : //
      14             : //===----------------------------------------------------------------------===//
      15             : 
      16             : #include "llvm/CodeGen/LiveIntervalUnion.h"
      17             : #include "llvm/ADT/STLExtras.h"
      18             : #include "llvm/ADT/SparseBitVector.h"
      19             : #include "llvm/CodeGen/LiveInterval.h"
      20             : #include "llvm/CodeGen/TargetRegisterInfo.h"
      21             : #include "llvm/Support/raw_ostream.h"
      22             : #include <cassert>
      23             : #include <cstdlib>
      24             : 
      25             : using namespace llvm;
      26             : 
      27             : #define DEBUG_TYPE "regalloc"
      28             : 
      29             : // Merge a LiveInterval's segments. Guarantee no overlaps.
      30     2576532 : void LiveIntervalUnion::unify(LiveInterval &VirtReg, const LiveRange &Range) {
      31     2576532 :   if (Range.empty())
      32      716955 :     return;
      33     2565447 :   ++Tag;
      34             : 
      35             :   // Insert each of the virtual register's live segments into the map.
      36             :   LiveRange::const_iterator RegPos = Range.begin();
      37             :   LiveRange::const_iterator RegEnd = Range.end();
      38     2565447 :   SegmentIter SegPos = Segments.find(RegPos->start);
      39             : 
      40      676532 :   while (SegPos.valid()) {
      41     1382402 :     SegPos.insert(RegPos->start, RegPos->end, &VirtReg);
      42     1382402 :     if (++RegPos == RegEnd)
      43             :       return;
      44      676532 :     SegPos.advanceTo(RegPos->start);
      45             :   }
      46             : 
      47             :   // We have reached the end of Segments, so it is no longer necessary to search
      48             :   // for the insertion position.
      49             :   // It is faster to insert the end first.
      50     1859577 :   --RegEnd;
      51     1859577 :   SegPos.insert(RegEnd->start, RegEnd->end, &VirtReg);
      52     2862826 :   for (; RegPos != RegEnd; ++RegPos, ++SegPos)
      53     1003249 :     SegPos.insert(RegPos->start, RegPos->end, &VirtReg);
      54             : }
      55             : 
      56             : // Remove a live virtual register's segments from this union.
      57      175354 : void LiveIntervalUnion::extract(LiveInterval &VirtReg, const LiveRange &Range) {
      58      175354 :   if (Range.empty())
      59             :     return;
      60      175354 :   ++Tag;
      61             : 
      62             :   // Remove each of the virtual register's live segments from the map.
      63             :   LiveRange::const_iterator RegPos = Range.begin();
      64             :   LiveRange::const_iterator RegEnd = Range.end();
      65      175354 :   SegmentIter SegPos = Segments.find(RegPos->start);
      66             : 
      67             :   while (true) {
      68      325903 :     assert(SegPos.value() == &VirtReg && "Inconsistent LiveInterval");
      69      501257 :     SegPos.erase();
      70             :     if (!SegPos.valid())
      71             :       return;
      72             : 
      73             :     // Skip all segments that may have been coalesced.
      74      368007 :     RegPos = Range.advanceTo(RegPos, SegPos.start());
      75      368007 :     if (RegPos == RegEnd)
      76             :       return;
      77             : 
      78      325903 :     SegPos.advanceTo(RegPos->start);
      79             :   }
      80             : }
      81             : 
      82             : void
      83           0 : LiveIntervalUnion::print(raw_ostream &OS, const TargetRegisterInfo *TRI) const {
      84           0 :   if (empty()) {
      85           0 :     OS << " empty\n";
      86           0 :     return;
      87             :   }
      88           0 :   for (LiveSegments::const_iterator SI = Segments.begin(); SI.valid(); ++SI) {
      89           0 :     OS << " [" << SI.start() << ' ' << SI.stop() << "):"
      90           0 :        << printReg(SI.value()->reg, TRI);
      91             :   }
      92             :   OS << '\n';
      93             : }
      94             : 
      95             : #ifndef NDEBUG
      96             : // Verify the live intervals in this union and add them to the visited set.
      97             : void LiveIntervalUnion::verify(LiveVirtRegBitSet& VisitedVRegs) {
      98             :   for (SegmentIter SI = Segments.begin(); SI.valid(); ++SI)
      99             :     VisitedVRegs.set(SI.value()->reg);
     100             : }
     101             : #endif //!NDEBUG
     102             : 
     103             : // Scan the vector of interfering virtual registers in this union. Assume it's
     104             : // quite small.
     105    22432313 : bool LiveIntervalUnion::Query::isSeenInterference(LiveInterval *VirtReg) const {
     106    22432313 :   return is_contained(InterferingVRegs, VirtReg);
     107             : }
     108             : 
     109             : // Collect virtual registers in this union that interfere with this
     110             : // query's live virtual register.
     111             : //
     112             : // The query state is one of:
     113             : //
     114             : // 1. CheckedFirstInterference == false: Iterators are uninitialized.
     115             : // 2. SeenAllInterferences == true: InterferingVRegs complete, iterators unused.
     116             : // 3. Iterators left at the last seen intersection.
     117             : //
     118    24274733 : unsigned LiveIntervalUnion::Query::
     119             : collectInterferingVRegs(unsigned MaxInterferingRegs) {
     120             :   // Fast path return if we already have the desired information.
     121    24274733 :   if (SeenAllInterferences || InterferingVRegs.size() >= MaxInterferingRegs)
     122      905754 :     return InterferingVRegs.size();
     123             : 
     124             :   // Set up iterators on the first call.
     125    23368979 :   if (!CheckedFirstInterference) {
     126    22731181 :     CheckedFirstInterference = true;
     127             : 
     128             :     // Quickly skip interference check for empty sets.
     129    45462362 :     if (LR->empty() || LiveUnion->empty()) {
     130     1258654 :       SeenAllInterferences = true;
     131     1258654 :       return 0;
     132             :     }
     133             : 
     134             :     // In most cases, the union will start before LR.
     135    21472527 :     LRI = LR->begin();
     136             :     LiveUnionI.setMap(LiveUnion->getMap());
     137    21472527 :     LiveUnionI.find(LRI->start);
     138             :   }
     139             : 
     140    22110325 :   LiveRange::const_iterator LREnd = LR->end();
     141             :   LiveInterval *RecentReg = nullptr;
     142             :   while (LiveUnionI.valid()) {
     143             :     assert(LRI != LREnd && "Reached end of LR");
     144             : 
     145             :     // Check for overlapping interference.
     146    83980626 :     while (LRI->start < LiveUnionI.stop() && LRI->end > LiveUnionI.start()) {
     147             :       // This is an overlap, record the interfering register.
     148    22654510 :       LiveInterval *VReg = LiveUnionI.value();
     149    22654510 :       if (VReg != RecentReg && !isSeenInterference(VReg)) {
     150    20908451 :         RecentReg = VReg;
     151    20908451 :         InterferingVRegs.push_back(VReg);
     152    20908451 :         if (InterferingVRegs.size() >= MaxInterferingRegs)
     153    20533450 :           return InterferingVRegs.size();
     154             :       }
     155             :       // This LiveUnion segment is no longer interesting.
     156     2785523 :       if (!(++LiveUnionI).valid()) {
     157      664463 :         SeenAllInterferences = true;
     158      664463 :         return InterferingVRegs.size();
     159             :       }
     160             :     }
     161             : 
     162             :     // The iterators are now not overlapping, LiveUnionI has been advanced
     163             :     // beyond LRI.
     164             :     assert(LRI->end <= LiveUnionI.start() && "Expected non-overlap");
     165             : 
     166             :     // Advance the iterator that ends first.
     167     9264024 :     LRI = LR->advanceTo(LRI, LiveUnionI.start());
     168     4632012 :     if (LRI == LREnd)
     169             :       break;
     170             : 
     171             :     // Detect overlap, handle above.
     172     3711973 :     if (LRI->start < LiveUnionI.stop())
     173             :       continue;
     174             : 
     175             :     // Still not overlapping. Catch up LiveUnionI.
     176      333904 :     LiveUnionI.advanceTo(LRI->start);
     177             :   }
     178     1576875 :   SeenAllInterferences = true;
     179     1576875 :   return InterferingVRegs.size();
     180             : }
     181             : 
     182      193992 : void LiveIntervalUnion::Array::init(LiveIntervalUnion::Allocator &Alloc,
     183             :                                     unsigned NSize) {
     184             :   // Reuse existing allocation.
     185      193992 :   if (NSize == Size)
     186             :     return;
     187       18827 :   clear();
     188       18827 :   Size = NSize;
     189       18827 :   LIUs = static_cast<LiveIntervalUnion*>(
     190       18827 :       safe_malloc(sizeof(LiveIntervalUnion)*NSize));
     191     3761707 :   for (unsigned i = 0; i != Size; ++i)
     192     3742880 :     new(LIUs + i) LiveIntervalUnion(Alloc);
     193             : }
     194             : 
     195       38232 : void LiveIntervalUnion::Array::clear() {
     196       38232 :   if (!LIUs)
     197             :     return;
     198     3759486 :   for (unsigned i = 0; i != Size; ++i)
     199     3740677 :     LIUs[i].~LiveIntervalUnion();
     200       18809 :   free(LIUs);
     201       18809 :   Size =  0;
     202       18809 :   LIUs = nullptr;
     203             : }

Generated by: LCOV version 1.13