diff options
-rw-r--r-- | include/llvm/CodeGen/MachineInstr.h | 24 | ||||
-rw-r--r-- | lib/CodeGen/MachineTraceMetrics.cpp | 24 |
2 files changed, 25 insertions, 23 deletions
diff --git a/include/llvm/CodeGen/MachineInstr.h b/include/llvm/CodeGen/MachineInstr.h index 65093d7..30433a2 100644 --- a/include/llvm/CodeGen/MachineInstr.h +++ b/include/llvm/CodeGen/MachineInstr.h @@ -635,6 +635,30 @@ public: getOperand(0).getSubReg() == getOperand(1).getSubReg(); } + /// isTransient - Return true if this is a transient instruction that is + /// either very likely to be eliminated during register allocation (such as + /// copy-like instructions), or if this instruction doesn't have an + /// execution-time cost. + bool isTransient() const { + switch(getOpcode()) { + default: return false; + // Copy-like instructions are usually eliminated during register allocation. + case TargetOpcode::PHI: + case TargetOpcode::COPY: + case TargetOpcode::INSERT_SUBREG: + case TargetOpcode::SUBREG_TO_REG: + case TargetOpcode::REG_SEQUENCE: + // Pseudo-instructions that don't produce any real output. + case TargetOpcode::IMPLICIT_DEF: + case TargetOpcode::KILL: + case TargetOpcode::PROLOG_LABEL: + case TargetOpcode::EH_LABEL: + case TargetOpcode::GC_LABEL: + case TargetOpcode::DBG_VALUE: + return true; + } + } + /// getBundleSize - Return the number of instructions inside the MI bundle. unsigned getBundleSize() const; diff --git a/lib/CodeGen/MachineTraceMetrics.cpp b/lib/CodeGen/MachineTraceMetrics.cpp index 3037cb3..cf0d9c6 100644 --- a/lib/CodeGen/MachineTraceMetrics.cpp +++ b/lib/CodeGen/MachineTraceMetrics.cpp @@ -69,28 +69,6 @@ void MachineTraceMetrics::releaseMemory() { // The number of instructions in a basic block and the CPU resources used by // those instructions don't depend on any given trace strategy. -/// Is MI an instruction that should be considered free because it will likely -/// be eliminated by later passes? -static bool isFree(const MachineInstr *MI) { - switch(MI->getOpcode()) { - default: return false; - case TargetOpcode::PHI: - case TargetOpcode::PROLOG_LABEL: - case TargetOpcode::EH_LABEL: - case TargetOpcode::GC_LABEL: - case TargetOpcode::KILL: - case TargetOpcode::EXTRACT_SUBREG: - case TargetOpcode::INSERT_SUBREG: - case TargetOpcode::IMPLICIT_DEF: - case TargetOpcode::SUBREG_TO_REG: - case TargetOpcode::COPY_TO_REGCLASS: - case TargetOpcode::DBG_VALUE: - case TargetOpcode::REG_SEQUENCE: - case TargetOpcode::COPY: - return true; - } -} - /// Compute the resource usage in basic block MBB. const MachineTraceMetrics::FixedBlockInfo* MachineTraceMetrics::getResources(const MachineBasicBlock *MBB) { @@ -106,7 +84,7 @@ MachineTraceMetrics::getResources(const MachineBasicBlock *MBB) { for (MachineBasicBlock::const_iterator I = MBB->begin(), E = MBB->end(); I != E; ++I) { const MachineInstr *MI = I; - if (isFree(MI)) + if (MI->isTransient()) continue; ++InstrCount; if (MI->isCall()) |