LLVM
8.0.1
|
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MachineDominators.h"
#include "llvm/CodeGen/MachineFunction.h"
#include "llvm/CodeGen/MachineFunctionPass.h"
#include "llvm/CodeGen/MachineInstr.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
#include "llvm/CodeGen/MachineLoopInfo.h"
#include "llvm/CodeGen/MachineOperand.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/TargetInstrInfo.h"
#include "llvm/CodeGen/TargetOpcodes.h"
#include "llvm/CodeGen/TargetRegisterInfo.h"
#include "llvm/CodeGen/TargetSubtargetInfo.h"
#include "llvm/MC/LaneBitmask.h"
#include "llvm/MC/MCInstrDesc.h"
#include "llvm/Pass.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/raw_ostream.h"
#include <cassert>
#include <cstdint>
#include <memory>
#include <utility>
Go to the source code of this file.
Macros | |
#define | DEBUG_TYPE "peephole-opt" |
Typedefs | |
using | RegSubRegPair = TargetInstrInfo::RegSubRegPair |
using | RegSubRegPairAndIdx = TargetInstrInfo::RegSubRegPairAndIdx |
Functions | |
STATISTIC (NumReuse, "Number of extension results reused") | |
STATISTIC (NumCmps, "Number of compares eliminated") | |
STATISTIC (NumImmFold, "Number of move immediate folded") | |
STATISTIC (NumLoadFold, "Number of loads folded") | |
STATISTIC (NumSelects, "Number of selects optimized") | |
STATISTIC (NumUncoalescableCopies, "Number of uncoalescable copies optimized") | |
STATISTIC (NumRewrittenCopies, "Number of copies rewritten") | |
STATISTIC (NumNAPhysCopies, "Number of non-allocatable physical copies removed") | |
INITIALIZE_PASS_BEGIN (PeepholeOptimizer, DEBUG_TYPE, "Peephole Optimizations", false, false) INITIALIZE_PASS_END(PeepholeOptimizer | |
static MachineInstr & | insertPHI (MachineRegisterInfo &MRI, const TargetInstrInfo &TII, const SmallVectorImpl< RegSubRegPair > &SrcRegs, MachineInstr &OrigPHI) |
Insert a PHI instruction with incoming edges SrcRegs that are guaranteed to have the same register class. More... | |
static Rewriter * | getCopyRewriter (MachineInstr &MI, const TargetInstrInfo &TII) |
Get the appropriated Rewriter for MI . More... | |
static RegSubRegPair | getNewSource (MachineRegisterInfo *MRI, const TargetInstrInfo *TII, RegSubRegPair Def, const PeepholeOptimizer::RewriteMapTy &RewriteMap, bool HandleMultipleSources=true) |
Given a Def.Reg and Def.SubReg pair, use RewriteMap to find the new source to use for rewrite. More... | |
static bool | isVirtualRegisterOperand (MachineOperand &MO) |
Returns true if MO is a virtual register operand. More... | |
Variables | |
static cl::opt< bool > | Aggressive ("aggressive-ext-opt", cl::Hidden, cl::desc("Aggressive extension optimization")) |
static cl::opt< bool > | DisablePeephole ("disable-peephole", cl::Hidden, cl::init(false), cl::desc("Disable the peephole optimizer")) |
static cl::opt< bool > | DisableAdvCopyOpt ("disable-adv-copy-opt", cl::Hidden, cl::init(false), cl::desc("Disable advanced copy optimization")) |
Specifiy whether or not the value tracking looks through complex instructions. More... | |
static cl::opt< bool > | DisableNAPhysCopyOpt ("disable-non-allocatable-phys-copy-opt", cl::Hidden, cl::init(false), cl::desc("Disable non-allocatable physical register copy optimization")) |
static cl::opt< unsigned > | RewritePHILimit ("rewrite-phi-limit", cl::Hidden, cl::init(10), cl::desc("Limit the length of PHI chains to lookup")) |
static cl::opt< unsigned > | MaxRecurrenceChain ("recurrence-chain-limit", cl::Hidden, cl::init(3), cl::desc("Maximum length of recurrence chain when evaluating the benefit " "of commuting operands")) |
DEBUG_TYPE | |
Peephole | Optimizations |
Peephole | false |
#define DEBUG_TYPE "peephole-opt" |
Definition at line 104 of file PeepholeOptimizer.cpp.
Definition at line 101 of file PeepholeOptimizer.cpp.
Definition at line 102 of file PeepholeOptimizer.cpp.
|
static |
Get the appropriated Rewriter for MI
.
MI
. Definition at line 1085 of file PeepholeOptimizer.cpp.
References llvm::MachineInstr::getOpcode(), llvm::MachineInstr::isBitcast(), llvm::MachineInstr::isExtractSubregLike(), llvm::MachineInstr::isInsertSubregLike(), and llvm::MachineInstr::isRegSequenceLike().
Referenced by getNewSource().
|
static |
Given a Def.Reg
and Def.SubReg pair, use RewriteMap
to find the new source to use for rewrite.
If HandleMultipleSources
is true and multiple sources for a given Def
are found along the way, we found a PHI instructions that needs to be rewritten. TODO: HandleMultipleSources should be removed once we test PHI handling with coalescable copies.
Definition at line 1112 of file PeepholeOptimizer.cpp.
References assert(), llvm::BuildMI(), llvm::MachineInstr::canFoldAsLoad(), llvm::MachineRegisterInfo::clearKillFlags(), llvm::SmallSet< T, N, C >::count(), llvm::MachineRegisterInfo::createVirtualRegister(), llvm::dbgs(), llvm::tgtok::Def, DisableNAPhysCopyOpt, llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::erase(), llvm::MachineInstr::eraseFromParent(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::TargetInstrInfo::FoldImmediate(), llvm::MCInstrInfo::get(), getCopyRewriter(), llvm::MachineInstr::getDebugLoc(), llvm::MachineInstr::getDesc(), llvm::MCInstrDesc::getNumDefs(), llvm::MCInstrDesc::getNumOperands(), llvm::MachineInstr::getOperand(), llvm::MachineInstr::getParent(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getRegClass(), llvm::MachineOperand::getSubReg(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), llvm::SmallSet< T, N, C >::insert(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), insertPHI(), llvm::MachineRegisterInfo::isAllocatable(), llvm::MachineInstr::isCopy(), llvm::MachineOperand::isDead(), llvm::MachineOperand::isDef(), llvm::MachineOperand::isImplicit(), llvm::MachineInstr::isMoveImmediate(), llvm::TargetRegisterInfo::isPhysicalRegister(), llvm::MachineOperand::isReg(), llvm::TargetRegisterInfo::isVirtualRegister(), LLVM_DEBUG, llvm::DenseMapBase< DerivedT, KeyT, ValueT, KeyInfoT, BucketT >::lookup(), llvm::MachineInstr::mayLoad(), llvm::SmallVectorTemplateBase< T >::push_back(), llvm::TargetInstrInfo::RegSubRegPair::Reg, llvm::MachineRegisterInfo::replaceRegWith(), llvm::MachineOperand::setIsUndef(), llvm::MachineOperand::setSubReg(), and llvm::TargetInstrInfo::RegSubRegPair::SubReg.
INITIALIZE_PASS_BEGIN | ( | PeepholeOptimizer | , |
DEBUG_TYPE | , | ||
"Peephole Optimizations" | , | ||
false | , | ||
false | |||
) |
|
static |
Insert a PHI instruction with incoming edges SrcRegs
that are guaranteed to have the same register class.
This is necessary whenever we successfully traverse a PHI instruction and find suitable sources coming from its edges. By inserting a new PHI, we provide a rewritten PHI def suitable to be used in a new COPY instruction.
Definition at line 756 of file PeepholeOptimizer.cpp.
References llvm::MachineInstrBuilder::addMBB(), llvm::MachineInstrBuilder::addReg(), assert(), llvm::BuildMI(), llvm::MachineRegisterInfo::clearKillFlags(), llvm::MachineRegisterInfo::createVirtualRegister(), llvm::SmallVectorBase::empty(), llvm::MCInstrInfo::get(), llvm::MachineInstr::getDebugLoc(), llvm::MachineInstr::getDesc(), llvm::MachineOperand::getMBB(), llvm::MCInstrDesc::getNumDefs(), llvm::MachineInstr::getOperand(), llvm::MachineInstr::getParent(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getRegClass(), llvm::MachineOperand::getSubReg(), llvm::MachineInstr::isCopy(), llvm::MachineInstr::isExtractSubreg(), llvm::MachineInstr::isInsertSubreg(), llvm::MachineInstr::isRegSequence(), llvm::TargetInstrInfo::RegSubRegPair::Reg, Rewriter, llvm::MachineOperand::setReg(), llvm::MachineOperand::setSubReg(), SubReg, llvm::TargetInstrInfo::RegSubRegPair::SubReg, and TII.
Referenced by getNewSource().
|
static |
Returns true if MO
is a virtual register operand.
Definition at line 1490 of file PeepholeOptimizer.cpp.
References Aggressive, assert(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::clear(), llvm::SmallSet< T, N, C >::clear(), llvm::MachineOperand::clobbersPhysReg(), llvm::TargetInstrInfo::CommuteAnyOperandIndex, llvm::TargetInstrInfo::commuteInstruction(), llvm::SmallSet< T, N, C >::count(), llvm::HexagonISD::CP, llvm::dbgs(), llvm::MachineRegisterInfo::def_begin(), llvm::MachineRegisterInfo::def_end(), DefMI, DisableAdvCopyOpt, DisablePeephole, llvm::SmallSet< T, N, C >::empty(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::end(), llvm::SmallSet< T, N, C >::erase(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::erase(), llvm::SmallPtrSetImpl< PtrType >::erase(), llvm::MachineInstr::eraseFromParent(), llvm::DenseMapBase< DenseMap< KeyT, ValueT, KeyInfoT, BucketT >, KeyT, ValueT, KeyInfoT, BucketT >::find(), llvm::TargetInstrInfo::findCommutedOpIndices(), llvm::MachineInstr::findRegisterUseOperandIdx(), llvm::MachineInstr::getDesc(), llvm::TargetInstrInfo::getExtractSubregInputs(), llvm::MachineFunction::getFunction(), llvm::TargetInstrInfo::getInsertSubregInputs(), llvm::TargetSubtargetInfo::getInstrInfo(), llvm::MachineFunction::getName(), llvm::MCInstrDesc::getNumDefs(), llvm::MachineInstr::getNumOperands(), llvm::MachineInstr::getOperand(), llvm::MachineRegisterInfo::defusechain_iterator< ReturnUses, ReturnDefs, SkipDebug, ByOperand, ByInstr, ByBundle >::getOperandNo(), llvm::MachineOperand::getParent(), llvm::MachineOperand::getReg(), llvm::MachineRegisterInfo::getRegClass(), llvm::MachineFunction::getRegInfo(), llvm::TargetSubtargetInfo::getRegisterInfo(), llvm::TargetInstrInfo::getRegSequenceInputs(), llvm::MachineOperand::getSubReg(), llvm::TargetRegisterInfo::getSubRegIndexLaneMask(), llvm::MachineFunction::getSubtarget(), llvm::MachineRegisterInfo::getTargetRegisterInfo(), llvm::MachineRegisterInfo::hasOneNonDBGUse(), llvm::MachineInstr::hasUnmodeledSideEffects(), llvm::SmallSet< T, N, C >::insert(), llvm::SmallPtrSetImpl< PtrType >::insert(), llvm::MachineInstr::isCompare(), llvm::MachineInstr::isConditionalBranch(), llvm::MachineInstr::isCopy(), llvm::MachineOperand::isDead(), llvm::MachineInstr::isDebugInstr(), llvm::MachineOperand::isDef(), llvm::MachineOperand::isImplicit(), llvm::MachineInstr::isImplicitDef(), llvm::MachineInstr::isInlineAsm(), llvm::MachineInstr::isKill(), llvm::MachineInstr::isLoadFoldBarrier(), llvm::MachineInstr::isPHI(), llvm::TargetRegisterInfo::isPhysicalRegister(), llvm::MachineInstr::isPosition(), llvm::MachineOperand::isReg(), llvm::MachineInstr::isRegTiedToUseOperand(), llvm::MachineInstr::isSelect(), llvm::MachineOperand::isUndef(), llvm::TargetRegisterInfo::isVirtualRegister(), LLVM_DEBUG, llvm::MachineRegisterInfo::markUsesInDebugValueAsUndef(), MaxRecurrenceChain, MI, llvm::MachineInstr::operands(), llvm::TargetInstrInfo::optimizeLoadInstr(), llvm::TargetInstrInfo::RegSubRegPair::Reg, llvm::TargetInstrInfo::RegSubRegPairAndIdx::SubIdx, llvm::TargetInstrInfo::RegSubRegPair::SubReg, llvm::MachineRegisterInfo::use_instr_nodbg_begin(), llvm::MachineRegisterInfo::use_nodbg_instructions(), and UseMI.
STATISTIC | ( | NumReuse | , |
"Number of extension results reused" | |||
) |
STATISTIC | ( | NumCmps | , |
"Number of compares eliminated" | |||
) |
STATISTIC | ( | NumImmFold | , |
"Number of move immediate folded" | |||
) |
STATISTIC | ( | NumLoadFold | , |
"Number of loads folded" | |||
) |
STATISTIC | ( | NumSelects | , |
"Number of selects optimized" | |||
) |
STATISTIC | ( | NumUncoalescableCopies | , |
"Number of uncoalescable copies optimized" | |||
) |
STATISTIC | ( | NumRewrittenCopies | , |
"Number of copies rewritten" | |||
) |
STATISTIC | ( | NumNAPhysCopies | , |
"Number of non-allocatable physical copies removed" | |||
) |
|
static |
Referenced by isContractable(), and isVirtualRegisterOperand().
DEBUG_TYPE |
Definition at line 446 of file PeepholeOptimizer.cpp.
|
static |
Specifiy whether or not the value tracking looks through complex instructions.
When this is true, the value tracker bails on everything that is not a copy or a bitcast.
Referenced by isVirtualRegisterOperand().
|
static |
Referenced by getNewSource().
|
static |
Referenced by isVirtualRegisterOperand().
Peephole false |
Definition at line 446 of file PeepholeOptimizer.cpp.
|
static |
Referenced by isVirtualRegisterOperand().
Peephole Optimizations |
Definition at line 446 of file PeepholeOptimizer.cpp.