From 4a5a80c370cf542cc342fa46bbb3ff28fd7f0b6e Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Mon, 26 Mar 2018 19:04:58 +0000 Subject: [PATCH] [Hexagon] Assertion failure in HexagonSubtarget.cpp In restoreLatency, replace range-for loop with std::find. Patch by Jyotsna Verma. llvm-svn: 328574 --- llvm/lib/Target/Hexagon/HexagonSubtarget.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Target/Hexagon/HexagonSubtarget.cpp b/llvm/lib/Target/Hexagon/HexagonSubtarget.cpp index b264d2616cd9..1c5c7a97b815 100644 --- a/llvm/lib/Target/Hexagon/HexagonSubtarget.cpp +++ b/llvm/lib/Target/Hexagon/HexagonSubtarget.cpp @@ -445,6 +445,7 @@ void HexagonSubtarget::restoreLatency(SUnit *Src, SUnit *Dst) const { } assert(DefIdx >= 0 && "Def Reg not found in Src MI"); MachineInstr *DstI = Dst->getInstr(); + SDep T = I; for (unsigned OpNum = 0; OpNum < DstI->getNumOperands(); OpNum++) { const MachineOperand &MO = DstI->getOperand(OpNum); if (MO.isReg() && MO.isUse() && MO.getReg() == DepR) { @@ -461,11 +462,10 @@ void HexagonSubtarget::restoreLatency(SUnit *Src, SUnit *Dst) const { } // Update the latency of opposite edge too. - for (auto &J : Dst->Preds) { - if (J.getSUnit() != Src) - continue; - J.setLatency(I.getLatency()); - } + T.setSUnit(Src); + auto F = std::find(Dst->Preds.begin(), Dst->Preds.end(), T); + assert(F != Dst->Preds.end()); + F->setLatency(I.getLatency()); } } @@ -473,7 +473,7 @@ void HexagonSubtarget::restoreLatency(SUnit *Src, SUnit *Dst) const { void HexagonSubtarget::changeLatency(SUnit *Src, SUnit *Dst, unsigned Lat) const { for (auto &I : Src->Succs) { - if (I.getSUnit() != Dst) + if (!I.isAssignedRegDep() || I.getSUnit() != Dst) continue; SDep T = I; I.setLatency(Lat); @@ -482,7 +482,7 @@ void HexagonSubtarget::changeLatency(SUnit *Src, SUnit *Dst, unsigned Lat) T.setSUnit(Src); auto F = std::find(Dst->Preds.begin(), Dst->Preds.end(), T); assert(F != Dst->Preds.end()); - F->setLatency(I.getLatency()); + F->setLatency(Lat); } }