aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJakob Stoklund Olesen <stoklund@2pi.dk>2012-07-30 18:34:14 +0000
committerJakob Stoklund Olesen <stoklund@2pi.dk>2012-07-30 18:34:14 +0000
commit3f63a589788995a724bc4587d022fe15ea8576ba (patch)
treec017ccce3ee57858e9607baf5adb76f32e7feac8
parenta1b2bf79796d8c44b1321a69a7236b85c33ef7ca (diff)
downloadexternal_llvm-3f63a589788995a724bc4587d022fe15ea8576ba.zip
external_llvm-3f63a589788995a724bc4587d022fe15ea8576ba.tar.gz
external_llvm-3f63a589788995a724bc4587d022fe15ea8576ba.tar.bz2
Add MachineInstr::isTransient().
This is a cleaned up version of the isFree() function in MachineTraceMetrics.cpp. Transient instructions are very unlikely to produce any code in the final output. Either because they get eliminated by RegisterCoalescing, or because they are pseudo-instructions like labels and debug values. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160977 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/CodeGen/MachineInstr.h24
-rw-r--r--lib/CodeGen/MachineTraceMetrics.cpp24
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())