diff options
Diffstat (limited to 'llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp b/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp index 0f1d4b51062e..9f1fece1b9dd 100644 --- a/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp +++ b/llvm/lib/Target/X86/X86AvoidStoreForwardingBlocks.cpp @@ -1,4 +1,4 @@ -//===- X86AvoidStoreForwardingBlockis.cpp - Avoid HW Store Forward Block --===// +//===- X86AvoidStoreForwardingBlocks.cpp - Avoid HW Store Forward Block ---===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. @@ -33,6 +33,7 @@ // transformation done here is correct regardless to other memory accesses. //===----------------------------------------------------------------------===// +#include "X86.h" #include "X86InstrInfo.h" #include "X86Subtarget.h" #include "llvm/Analysis/AliasAnalysis.h" @@ -287,7 +288,7 @@ static unsigned getYMMtoXMMStoreOpcode(unsigned StoreOpcode) { return 0; } -static int getAddrOffset(MachineInstr *MI) { +static int getAddrOffset(const MachineInstr *MI) { const MCInstrDesc &Descl = MI->getDesc(); int AddrOffset = X86II::getMemoryOperandNo(Descl.TSFlags); assert(AddrOffset != -1 && "Expected Memory Operand"); @@ -310,11 +311,11 @@ static MachineOperand &getDispOperand(MachineInstr *MI) { // TODO: Consider expanding to other addressing modes in the future static bool isRelevantAddressingMode(MachineInstr *MI) { int AddrOffset = getAddrOffset(MI); - MachineOperand &Base = getBaseOperand(MI); - MachineOperand &Disp = getDispOperand(MI); - MachineOperand &Scale = MI->getOperand(AddrOffset + X86::AddrScaleAmt); - MachineOperand &Index = MI->getOperand(AddrOffset + X86::AddrIndexReg); - MachineOperand &Segment = MI->getOperand(AddrOffset + X86::AddrSegmentReg); + const MachineOperand &Base = getBaseOperand(MI); + const MachineOperand &Disp = getDispOperand(MI); + const MachineOperand &Scale = MI->getOperand(AddrOffset + X86::AddrScaleAmt); + const MachineOperand &Index = MI->getOperand(AddrOffset + X86::AddrIndexReg); + const MachineOperand &Segment = MI->getOperand(AddrOffset + X86::AddrSegmentReg); if (!((Base.isReg() && Base.getReg() != X86::NoRegister) || Base.isFI())) return false; @@ -410,9 +411,8 @@ void X86AvoidSFBPass::buildCopy(MachineInstr *LoadInst, unsigned NLoadOpcode, // If the load and store are consecutive, use the loadInst location to // reduce register pressure. MachineInstr *StInst = StoreInst; - auto PrevInstrIt = skipDebugInstructionsBackward( - std::prev(MachineBasicBlock::instr_iterator(StoreInst)), - MBB->instr_begin()); + auto PrevInstrIt = prev_nodbg(MachineBasicBlock::instr_iterator(StoreInst), + MBB->instr_begin()); if (PrevInstrIt.getNodePtr() == LoadInst) StInst = LoadInst; MachineInstr *NewStore = @@ -498,9 +498,10 @@ void X86AvoidSFBPass::buildCopies(int Size, MachineInstr *LoadInst, static void updateKillStatus(MachineInstr *LoadInst, MachineInstr *StoreInst) { MachineOperand &LoadBase = getBaseOperand(LoadInst); MachineOperand &StoreBase = getBaseOperand(StoreInst); - auto StorePrevNonDbgInstr = skipDebugInstructionsBackward( - std::prev(MachineBasicBlock::instr_iterator(StoreInst)), - LoadInst->getParent()->instr_begin()).getNodePtr(); + auto *StorePrevNonDbgInstr = + prev_nodbg(MachineBasicBlock::instr_iterator(StoreInst), + LoadInst->getParent()->instr_begin()) + .getNodePtr(); if (LoadBase.isReg()) { MachineInstr *LastLoad = LoadInst->getPrevNode(); // If the original load and store to xmm/ymm were consecutive @@ -550,11 +551,8 @@ void X86AvoidSFBPass::findPotentiallylBlockedCopies(MachineFunction &MF) { if (StoreMI.getParent() == MI.getParent() && isPotentialBlockedMemCpyPair(MI.getOpcode(), StoreMI.getOpcode()) && isRelevantAddressingMode(&MI) && - isRelevantAddressingMode(&StoreMI)) { - assert(MI.hasOneMemOperand() && - "Expected one memory operand for load instruction"); - assert(StoreMI.hasOneMemOperand() && - "Expected one memory operand for store instruction"); + isRelevantAddressingMode(&StoreMI) && + MI.hasOneMemOperand() && StoreMI.hasOneMemOperand()) { if (!alias(**MI.memoperands_begin(), **StoreMI.memoperands_begin())) BlockedLoadsStoresPairs.push_back(std::make_pair(&MI, &StoreMI)); } @@ -563,7 +561,7 @@ void X86AvoidSFBPass::findPotentiallylBlockedCopies(MachineFunction &MF) { } unsigned X86AvoidSFBPass::getRegSizeInBytes(MachineInstr *LoadInst) { - auto TRC = TII->getRegClass(TII->get(LoadInst->getOpcode()), 0, TRI, + const auto *TRC = TII->getRegClass(TII->get(LoadInst->getOpcode()), 0, TRI, *LoadInst->getParent()->getParent()); return TRI->getRegSizeInBits(*TRC) / 8; } @@ -616,8 +614,8 @@ void X86AvoidSFBPass::breakBlockedCopies( static bool hasSameBaseOpValue(MachineInstr *LoadInst, MachineInstr *StoreInst) { - MachineOperand &LoadBase = getBaseOperand(LoadInst); - MachineOperand &StoreBase = getBaseOperand(StoreInst); + const MachineOperand &LoadBase = getBaseOperand(LoadInst); + const MachineOperand &StoreBase = getBaseOperand(StoreInst); if (LoadBase.isReg() != StoreBase.isReg()) return false; if (LoadBase.isReg()) @@ -691,13 +689,12 @@ bool X86AvoidSFBPass::runOnMachineFunction(MachineFunction &MF) { SmallVector<MachineInstr *, 2> PotentialBlockers = findPotentialBlockers(LoadInst); - for (auto PBInst : PotentialBlockers) { + for (auto *PBInst : PotentialBlockers) { if (!isPotentialBlockingStoreInst(PBInst->getOpcode(), LoadInst->getOpcode()) || - !isRelevantAddressingMode(PBInst)) + !isRelevantAddressingMode(PBInst) || !PBInst->hasOneMemOperand()) continue; int64_t PBstDispImm = getDispOperand(PBInst).getImm(); - assert(PBInst->hasOneMemOperand() && "Expected One Memory Operand"); unsigned PBstSize = (*PBInst->memoperands_begin())->getSize(); // This check doesn't cover all cases, but it will suffice for now. // TODO: take branch probability into consideration, if the blocking @@ -727,7 +724,7 @@ bool X86AvoidSFBPass::runOnMachineFunction(MachineFunction &MF) { ForRemoval.push_back(LoadInst); ForRemoval.push_back(StoreInst); } - for (auto RemovedInst : ForRemoval) { + for (auto *RemovedInst : ForRemoval) { RemovedInst->eraseFromParent(); } ForRemoval.clear(); |