diff options
Diffstat (limited to 'llvm/lib/CodeGen/IfConversion.cpp')
| -rw-r--r-- | llvm/lib/CodeGen/IfConversion.cpp | 55 | 
1 files changed, 3 insertions, 52 deletions
| diff --git a/llvm/lib/CodeGen/IfConversion.cpp b/llvm/lib/CodeGen/IfConversion.cpp index a0ce2541583..05600bbc0a8 100644 --- a/llvm/lib/CodeGen/IfConversion.cpp +++ b/llvm/lib/CodeGen/IfConversion.cpp @@ -179,7 +179,6 @@ namespace {      MachineRegisterInfo *MRI;      LivePhysRegs Redefs; -    LivePhysRegs DontKill;      bool PreRegAlloc;      bool MadeChange; @@ -461,6 +460,9 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) {        }        } +      if (RetVal && MRI->tracksLiveness()) +        recomputeLivenessFlags(*BBI.BB); +        Change |= RetVal;        NumIfCvts = NumSimple + NumSimpleFalse + NumTriangle + NumTriangleRev + @@ -1380,13 +1382,6 @@ static void UpdatePredRedefs(MachineInstr &MI, LivePhysRegs &Redefs) {        MIB.addReg(Reg, RegState::Implicit | RegState::Define);        continue;      } -    assert(Op.isReg() && "Register operand required"); -    if (Op.isDead()) { -      // If we found a dead def, but it needs to be live, then remove the dead -      // flag. -      if (Redefs.contains(Op.getReg())) -        Op.setIsDead(false); -    }      if (LiveBeforeMI.count(Reg))        MIB.addReg(Reg, RegState::Implicit);      else { @@ -1403,26 +1398,6 @@ static void UpdatePredRedefs(MachineInstr &MI, LivePhysRegs &Redefs) {    }  } -/// Remove kill flags from operands with a registers in the \p DontKill set. -static void RemoveKills(MachineInstr &MI, const LivePhysRegs &DontKill) { -  for (MIBundleOperands O(MI); O.isValid(); ++O) { -    if (!O->isReg() || !O->isKill()) -      continue; -    if (DontKill.contains(O->getReg())) -      O->setIsKill(false); -  } -} - -/// Walks a range of machine instructions and removes kill flags for registers -/// in the \p DontKill set. -static void RemoveKills(MachineBasicBlock::iterator I, -                        MachineBasicBlock::iterator E, -                        const LivePhysRegs &DontKill, -                        const MCRegisterInfo &MCRI) { -  for (MachineInstr &MI : make_range(I, E)) -    RemoveKills(MI, DontKill); -} -  /// If convert a simple (split, no rejoin) sub-CFG.  bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {    BBInfo &TrueBBI  = BBAnalysis[BBI.TrueBB->getNumber()]; @@ -1453,16 +1428,12 @@ bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {        llvm_unreachable("Unable to reverse branch condition!");    Redefs.init(*TRI); -  DontKill.init(*TRI);    if (MRI->tracksLiveness()) {      // Initialize liveins to the first BB. These are potentiall redefined by      // predicated instructions.      Redefs.addLiveIns(CvtMBB);      Redefs.addLiveIns(NextMBB); -    // Compute a set of registers which must not be killed by instructions in -    // BB1: This is everything live-in to BB2. -    DontKill.addLiveIns(NextMBB);    }    // Remove the branches from the entry so we can add the contents of the true @@ -1478,7 +1449,6 @@ bool IfConverter::IfConvertSimple(BBInfo &BBI, IfcvtKind Kind) {      BBI.BB->removeSuccessor(&CvtMBB, true);    } else {      // Predicate the instructions in the true block. -    RemoveKills(CvtMBB.begin(), CvtMBB.end(), DontKill, *TRI);      PredicateBlock(*CvtBBI, CvtMBB.end(), Cond);      // Merge converted block into entry block. The BB to Cvt edge is removed @@ -1567,8 +1537,6 @@ bool IfConverter::IfConvertTriangle(BBInfo &BBI, IfcvtKind Kind) {      Redefs.addLiveIns(NextMBB);    } -  DontKill.clear(); -    bool HasEarlyExit = CvtBBI->FalseBB != nullptr;    BranchProbability CvtNext, CvtFalse, BBNext, BBCvt; @@ -1751,25 +1719,12 @@ bool IfConverter::IfConvertDiamondCommon(        --NumDups1;    } -  // Compute a set of registers which must not be killed by instructions in BB1: -  // This is everything used+live in BB2 after the duplicated instructions. We -  // can compute this set by simulating liveness backwards from the end of BB2. -  DontKill.init(*TRI);    if (MRI->tracksLiveness()) { -    for (const MachineInstr &MI : make_range(MBB2.rbegin(), ++DI2.getReverse())) -      DontKill.stepBackward(MI); -      for (const MachineInstr &MI : make_range(MBB1.begin(), DI1)) {        SmallVector<std::pair<unsigned, const MachineOperand*>, 4> Dummy;        Redefs.stepForward(MI, Dummy);      }    } -  // Kill flags in the true block for registers living into the false block -  // must be removed. This should be done before extracting the common -  // instructions from the beginning of the MBB1, since these instructions -  // can actually differ between MBB1 and MBB2 in terms of <kill> flags. -  RemoveKills(MBB1.begin(), MBB1.end(), DontKill, *TRI); -    BBI.BB->splice(BBI.BB->end(), &MBB1, MBB1.begin(), DI1);    MBB2.erase(MBB2.begin(), DI2); @@ -2085,10 +2040,6 @@ void IfConverter::CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,      // If the predicated instruction now redefines a register as the result of      // if-conversion, add an implicit kill.      UpdatePredRedefs(*MI, Redefs); - -    // Some kill flags may not be correct anymore. -    if (!DontKill.empty()) -      RemoveKills(*MI, DontKill);    }    if (!IgnoreBr) { | 

