Home | History | Annotate | Line # | Download | only in CodeGen
      1 //===- LiveIntervalCalc.cpp - Calculate live interval --------------------===//
      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 // Implementation of the LiveIntervalCalc class.
     10 //
     11 //===----------------------------------------------------------------------===//
     12 
     13 #include "llvm/CodeGen/LiveIntervalCalc.h"
     14 #include "llvm/ADT/STLExtras.h"
     15 #include "llvm/ADT/SetVector.h"
     16 #include "llvm/ADT/SmallVector.h"
     17 #include "llvm/CodeGen/LiveInterval.h"
     18 #include "llvm/CodeGen/MachineBasicBlock.h"
     19 #include "llvm/CodeGen/MachineDominators.h"
     20 #include "llvm/CodeGen/MachineFunction.h"
     21 #include "llvm/CodeGen/MachineInstr.h"
     22 #include "llvm/CodeGen/MachineOperand.h"
     23 #include "llvm/CodeGen/MachineRegisterInfo.h"
     24 #include "llvm/CodeGen/SlotIndexes.h"
     25 #include "llvm/CodeGen/TargetRegisterInfo.h"
     26 #include "llvm/MC/LaneBitmask.h"
     27 #include "llvm/Support/ErrorHandling.h"
     28 #include "llvm/Support/raw_ostream.h"
     29 #include <algorithm>
     30 #include <cassert>
     31 #include <iterator>
     32 #include <tuple>
     33 #include <utility>
     34 
     35 using namespace llvm;
     36 
     37 #define DEBUG_TYPE "regalloc"
     38 
     39 // Reserve an address that indicates a value that is known to be "undef".
     40 static VNInfo UndefVNI(0xbad, SlotIndex());
     41 
     42 static void createDeadDef(SlotIndexes &Indexes, VNInfo::Allocator &Alloc,
     43                           LiveRange &LR, const MachineOperand &MO) {
     44   const MachineInstr &MI = *MO.getParent();
     45   SlotIndex DefIdx =
     46       Indexes.getInstructionIndex(MI).getRegSlot(MO.isEarlyClobber());
     47 
     48   // Create the def in LR. This may find an existing def.
     49   LR.createDeadDef(DefIdx, Alloc);
     50 }
     51 
     52 void LiveIntervalCalc::calculate(LiveInterval &LI, bool TrackSubRegs) {
     53   const MachineRegisterInfo *MRI = getRegInfo();
     54   SlotIndexes *Indexes = getIndexes();
     55   VNInfo::Allocator *Alloc = getVNAlloc();
     56 
     57   assert(MRI && Indexes && "call reset() first");
     58 
     59   // Step 1: Create minimal live segments for every definition of Reg.
     60   // Visit all def operands. If the same instruction has multiple defs of Reg,
     61   // createDeadDef() will deduplicate.
     62   const TargetRegisterInfo &TRI = *MRI->getTargetRegisterInfo();
     63   unsigned Reg = LI.reg();
     64   for (const MachineOperand &MO : MRI->reg_nodbg_operands(Reg)) {
     65     if (!MO.isDef() && !MO.readsReg())
     66       continue;
     67 
     68     unsigned SubReg = MO.getSubReg();
     69     if (LI.hasSubRanges() || (SubReg != 0 && TrackSubRegs)) {
     70       LaneBitmask SubMask = SubReg != 0 ? TRI.getSubRegIndexLaneMask(SubReg)
     71                                         : MRI->getMaxLaneMaskForVReg(Reg);
     72       // If this is the first time we see a subregister def, initialize
     73       // subranges by creating a copy of the main range.
     74       if (!LI.hasSubRanges() && !LI.empty()) {
     75         LaneBitmask ClassMask = MRI->getMaxLaneMaskForVReg(Reg);
     76         LI.createSubRangeFrom(*Alloc, ClassMask, LI);
     77       }
     78 
     79       LI.refineSubRanges(
     80           *Alloc, SubMask,
     81           [&MO, Indexes, Alloc](LiveInterval::SubRange &SR) {
     82             if (MO.isDef())
     83               createDeadDef(*Indexes, *Alloc, SR, MO);
     84           },
     85           *Indexes, TRI);
     86     }
     87 
     88     // Create the def in the main liverange. We do not have to do this if
     89     // subranges are tracked as we recreate the main range later in this case.
     90     if (MO.isDef() && !LI.hasSubRanges())
     91       createDeadDef(*Indexes, *Alloc, LI, MO);
     92   }
     93 
     94   // We may have created empty live ranges for partially undefined uses, we
     95   // can't keep them because we won't find defs in them later.
     96   LI.removeEmptySubRanges();
     97 
     98   const MachineFunction *MF = getMachineFunction();
     99   MachineDominatorTree *DomTree = getDomTree();
    100   // Step 2: Extend live segments to all uses, constructing SSA form as
    101   // necessary.
    102   if (LI.hasSubRanges()) {
    103     for (LiveInterval::SubRange &S : LI.subranges()) {
    104       LiveIntervalCalc SubLIC;
    105       SubLIC.reset(MF, Indexes, DomTree, Alloc);
    106       SubLIC.extendToUses(S, Reg, S.LaneMask, &LI);
    107     }
    108     LI.clear();
    109     constructMainRangeFromSubranges(LI);
    110   } else {
    111     resetLiveOutMap();
    112     extendToUses(LI, Reg, LaneBitmask::getAll());
    113   }
    114 }
    115 
    116 void LiveIntervalCalc::constructMainRangeFromSubranges(LiveInterval &LI) {
    117   // First create dead defs at all defs found in subranges.
    118   LiveRange &MainRange = LI;
    119   assert(MainRange.segments.empty() && MainRange.valnos.empty() &&
    120          "Expect empty main liverange");
    121 
    122   VNInfo::Allocator *Alloc = getVNAlloc();
    123   for (const LiveInterval::SubRange &SR : LI.subranges()) {
    124     for (const VNInfo *VNI : SR.valnos) {
    125       if (!VNI->isUnused() && !VNI->isPHIDef())
    126         MainRange.createDeadDef(VNI->def, *Alloc);
    127     }
    128   }
    129   resetLiveOutMap();
    130   extendToUses(MainRange, LI.reg(), LaneBitmask::getAll(), &LI);
    131 }
    132 
    133 void LiveIntervalCalc::createDeadDefs(LiveRange &LR, Register Reg) {
    134   const MachineRegisterInfo *MRI = getRegInfo();
    135   SlotIndexes *Indexes = getIndexes();
    136   VNInfo::Allocator *Alloc = getVNAlloc();
    137   assert(MRI && Indexes && "call reset() first");
    138 
    139   // Visit all def operands. If the same instruction has multiple defs of Reg,
    140   // LR.createDeadDef() will deduplicate.
    141   for (MachineOperand &MO : MRI->def_operands(Reg))
    142     createDeadDef(*Indexes, *Alloc, LR, MO);
    143 }
    144 
    145 void LiveIntervalCalc::extendToUses(LiveRange &LR, Register Reg,
    146                                     LaneBitmask Mask, LiveInterval *LI) {
    147   const MachineRegisterInfo *MRI = getRegInfo();
    148   SlotIndexes *Indexes = getIndexes();
    149   SmallVector<SlotIndex, 4> Undefs;
    150   if (LI != nullptr)
    151     LI->computeSubRangeUndefs(Undefs, Mask, *MRI, *Indexes);
    152 
    153   // Visit all operands that read Reg. This may include partial defs.
    154   bool IsSubRange = !Mask.all();
    155   const TargetRegisterInfo &TRI = *MRI->getTargetRegisterInfo();
    156   for (MachineOperand &MO : MRI->reg_nodbg_operands(Reg)) {
    157     // Clear all kill flags. They will be reinserted after register allocation
    158     // by LiveIntervals::addKillFlags().
    159     if (MO.isUse())
    160       MO.setIsKill(false);
    161     // MO::readsReg returns "true" for subregister defs. This is for keeping
    162     // liveness of the entire register (i.e. for the main range of the live
    163     // interval). For subranges, definitions of non-overlapping subregisters
    164     // do not count as uses.
    165     if (!MO.readsReg() || (IsSubRange && MO.isDef()))
    166       continue;
    167 
    168     unsigned SubReg = MO.getSubReg();
    169     if (SubReg != 0) {
    170       LaneBitmask SLM = TRI.getSubRegIndexLaneMask(SubReg);
    171       if (MO.isDef())
    172         SLM = ~SLM;
    173       // Ignore uses not reading the current (sub)range.
    174       if ((SLM & Mask).none())
    175         continue;
    176     }
    177 
    178     // Determine the actual place of the use.
    179     const MachineInstr *MI = MO.getParent();
    180     unsigned OpNo = (&MO - &MI->getOperand(0));
    181     SlotIndex UseIdx;
    182     if (MI->isPHI()) {
    183       assert(!MO.isDef() && "Cannot handle PHI def of partial register.");
    184       // The actual place where a phi operand is used is the end of the pred
    185       // MBB. PHI operands are paired: (Reg, PredMBB).
    186       UseIdx = Indexes->getMBBEndIdx(MI->getOperand(OpNo + 1).getMBB());
    187     } else {
    188       // Check for early-clobber redefs.
    189       bool isEarlyClobber = false;
    190       unsigned DefIdx;
    191       if (MO.isDef())
    192         isEarlyClobber = MO.isEarlyClobber();
    193       else if (MI->isRegTiedToDefOperand(OpNo, &DefIdx)) {
    194         // FIXME: This would be a lot easier if tied early-clobber uses also
    195         // had an early-clobber flag.
    196         isEarlyClobber = MI->getOperand(DefIdx).isEarlyClobber();
    197       }
    198       UseIdx = Indexes->getInstructionIndex(*MI).getRegSlot(isEarlyClobber);
    199     }
    200 
    201     // MI is reading Reg. We may have visited MI before if it happens to be
    202     // reading Reg multiple times. That is OK, extend() is idempotent.
    203     extend(LR, UseIdx, Reg, Undefs);
    204   }
    205 }
    206