diff options
Diffstat (limited to 'lib/Target/Mips/MipsDelaySlotFiller.cpp')
-rw-r--r-- | lib/Target/Mips/MipsDelaySlotFiller.cpp | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/lib/Target/Mips/MipsDelaySlotFiller.cpp b/lib/Target/Mips/MipsDelaySlotFiller.cpp index e3823e0dfdb8..aa07dac86828 100644 --- a/lib/Target/Mips/MipsDelaySlotFiller.cpp +++ b/lib/Target/Mips/MipsDelaySlotFiller.cpp @@ -1,9 +1,8 @@ //===- MipsDelaySlotFiller.cpp - Mips Delay Slot Filler -------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // @@ -493,14 +492,12 @@ MemDefsUses::MemDefsUses(const DataLayout &DL, const MachineFrameInfo *MFI_) bool MemDefsUses::hasHazard_(const MachineInstr &MI) { bool HasHazard = false; - SmallVector<ValueType, 4> Objs; // Check underlying object list. + SmallVector<ValueType, 4> Objs; if (getUnderlyingObjects(MI, Objs)) { - for (SmallVectorImpl<ValueType>::const_iterator I = Objs.begin(); - I != Objs.end(); ++I) - HasHazard |= updateDefsUses(*I, MI.mayStore()); - + for (ValueType VT : Objs) + HasHazard |= updateDefsUses(VT, MI.mayStore()); return HasHazard; } @@ -526,33 +523,32 @@ bool MemDefsUses::updateDefsUses(ValueType V, bool MayStore) { bool MemDefsUses:: getUnderlyingObjects(const MachineInstr &MI, SmallVectorImpl<ValueType> &Objects) const { - if (!MI.hasOneMemOperand() || - (!(*MI.memoperands_begin())->getValue() && - !(*MI.memoperands_begin())->getPseudoValue())) + if (!MI.hasOneMemOperand()) return false; - if (const PseudoSourceValue *PSV = - (*MI.memoperands_begin())->getPseudoValue()) { + auto & MMO = **MI.memoperands_begin(); + + if (const PseudoSourceValue *PSV = MMO.getPseudoValue()) { if (!PSV->isAliased(MFI)) return false; Objects.push_back(PSV); return true; } - const Value *V = (*MI.memoperands_begin())->getValue(); + if (const Value *V = MMO.getValue()) { + SmallVector<const Value *, 4> Objs; + GetUnderlyingObjects(V, Objs, DL); - SmallVector<Value *, 4> Objs; - GetUnderlyingObjects(const_cast<Value *>(V), Objs, DL); + for (const Value *UValue : Objs) { + if (!isIdentifiedObject(V)) + return false; - for (SmallVectorImpl<Value *>::iterator I = Objs.begin(), E = Objs.end(); - I != E; ++I) { - if (!isIdentifiedObject(V)) - return false; - - Objects.push_back(*I); + Objects.push_back(UValue); + } + return true; } - return true; + return false; } // Replace Branch with the compact branch instruction. @@ -726,6 +722,7 @@ bool MipsDelaySlotFiller::searchRange(MachineBasicBlock &MBB, IterTy Begin, // but we don't have enough information to make that decision. if (InMicroMipsMode && TII->getInstSizeInBytes(*CurrI) == 2 && (Opcode == Mips::JR || Opcode == Mips::PseudoIndirectBranch || + Opcode == Mips::PseudoIndirectBranch_MM || Opcode == Mips::PseudoReturn || Opcode == Mips::TAILCALL)) continue; // Instructions LWP/SWP and MOVEP should not be in a delay slot as that |