From 6f503b96fb75f271b5081d6535941ae96a19b112 Mon Sep 17 00:00:00 2001 From: Krzysztof Parzyszek Date: Fri, 23 Mar 2018 19:39:37 +0000 Subject: [PATCH] [Hexagon] Incorrectly removing dead flag and adding kill flag The HexagonExpandCondsets pass is incorrectly removing the dead flag on a definition that is really dead, and adding a kill flag to a use that is tied to a definition. This causes an assert later during the machine scheduler when querying the live interval information. Patch by Brendon Cahoon. llvm-svn: 328357 --- llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp b/llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp index c2feaf5..f46f610 100644 --- a/llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp +++ b/llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp @@ -316,8 +316,10 @@ void HexagonExpandCondsets::updateKillFlags(unsigned Reg) { auto KillAt = [this,Reg] (SlotIndex K, LaneBitmask LM) -> void { // Set the flag on a use of Reg whose lane mask is contained in LM. MachineInstr *MI = LIS->getInstructionFromIndex(K); - for (auto &Op : MI->operands()) { - if (!Op.isReg() || !Op.isUse() || Op.getReg() != Reg) + for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) { + MachineOperand &Op = MI->getOperand(i); + if (!Op.isReg() || !Op.isUse() || Op.getReg() != Reg || + MI->isRegTiedToDefOperand(i)) continue; LaneBitmask SLM = getLaneMask(Reg, Op.getSubReg()); if ((SLM & LM) == SLM) { @@ -1324,7 +1326,6 @@ bool HexagonExpandCondsets::runOnMachineFunction(MachineFunction &MF) { //===----------------------------------------------------------------------===// // Public Constructor Functions //===----------------------------------------------------------------------===// - FunctionPass *llvm::createHexagonExpandCondsets() { return new HexagonExpandCondsets(); } -- 2.7.4