diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:01:25 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-01-19 10:01:25 +0000 |
| commit | d8e91e46262bc44006913e6796843909f1ac7bcd (patch) | |
| tree | 7d0c143d9b38190e0fa0180805389da22cd834c5 /lib/CodeGen/GlobalISel/RegBankSelect.cpp | |
| parent | b7eb8e35e481a74962664b63dfb09483b200209a (diff) | |
Notes
Diffstat (limited to 'lib/CodeGen/GlobalISel/RegBankSelect.cpp')
| -rw-r--r-- | lib/CodeGen/GlobalISel/RegBankSelect.cpp | 36 |
1 files changed, 21 insertions, 15 deletions
diff --git a/lib/CodeGen/GlobalISel/RegBankSelect.cpp b/lib/CodeGen/GlobalISel/RegBankSelect.cpp index 9e2d48d1dc42..dcc8b7cc23c5 100644 --- a/lib/CodeGen/GlobalISel/RegBankSelect.cpp +++ b/lib/CodeGen/GlobalISel/RegBankSelect.cpp @@ -115,8 +115,8 @@ bool RegBankSelect::assignmentMatch( // By default we assume we will have to repair something. OnlyAssign = false; // Each part of a break down needs to end up in a different register. - // In other word, Reg assignement does not match. - if (ValMapping.NumBreakDowns > 1) + // In other word, Reg assignment does not match. + if (ValMapping.NumBreakDowns != 1) return false; const RegisterBank *CurRegBank = RBI->getRegBank(Reg, *MRI, *TRI); @@ -140,7 +140,7 @@ bool RegBankSelect::repairReg( return false; assert(ValMapping.NumBreakDowns == 1 && "Not yet implemented"); // An empty range of new register means no repairing. - assert(NewVRegs.begin() != NewVRegs.end() && "We should not have to repair"); + assert(!empty(NewVRegs) && "We should not have to repair"); // Assume we are repairing a use and thus, the original reg will be // the source of the repairing. @@ -528,7 +528,7 @@ RegBankSelect::MappingCost RegBankSelect::computeMapping( bool RegBankSelect::applyMapping( MachineInstr &MI, const RegisterBankInfo::InstructionMapping &InstrMapping, SmallVectorImpl<RegBankSelect::RepairingPlacement> &RepairPts) { - // OpdMapper will hold all the information needed for the rewritting. + // OpdMapper will hold all the information needed for the rewriting. RegisterBankInfo::OperandsMapper OpdMapper(MI, InstrMapping, *MRI); // First, place the repairing code. @@ -714,18 +714,23 @@ RegBankSelect::RepairingPlacement::RepairingPlacement( // - Terminators must be the last instructions: // * Before, move the insert point before the first terminator. // * After, we have to split the outcoming edges. - unsigned Reg = MO.getReg(); if (Before) { // Check whether Reg is defined by any terminator. - MachineBasicBlock::iterator It = MI; - for (auto Begin = MI.getParent()->begin(); - --It != Begin && It->isTerminator();) - if (It->modifiesRegister(Reg, &TRI)) { - // Insert the repairing code right after the definition. - addInsertPoint(*It, /*Before*/ false); - return; - } - addInsertPoint(*It, /*Before*/ true); + MachineBasicBlock::reverse_iterator It = MI; + auto REnd = MI.getParent()->rend(); + + for (; It != REnd && It->isTerminator(); ++It) { + assert(!It->modifiesRegister(MO.getReg(), &TRI) && + "copy insertion in middle of terminators not handled"); + } + + if (It == REnd) { + addInsertPoint(*MI.getParent()->begin(), true); + return; + } + + // We are sure to be right before the first terminator. + addInsertPoint(*It, /*Before*/ false); return; } // Make sure Reg is not redefined by other terminators, otherwise @@ -733,7 +738,8 @@ RegBankSelect::RepairingPlacement::RepairingPlacement( for (MachineBasicBlock::iterator It = MI, End = MI.getParent()->end(); ++It != End;) // The machine verifier should reject this kind of code. - assert(It->modifiesRegister(Reg, &TRI) && "Do not know where to split"); + assert(It->modifiesRegister(MO.getReg(), &TRI) && + "Do not know where to split"); // Split each outcoming edges. MachineBasicBlock &Src = *MI.getParent(); for (auto &Succ : Src.successors()) |
