aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/CodeGen/LiveIntervalAnalysis.h
diff options
context:
space:
mode:
authorDavid Greene <greened@obbligato.org>2009-07-21 18:56:32 +0000
committerDavid Greene <greened@obbligato.org>2009-07-21 18:56:32 +0000
commita358c1db5c744f7c524b18f2860c2d48613adbd1 (patch)
treec816f557985523cf306248c626013ae8db1bfeea /include/llvm/CodeGen/LiveIntervalAnalysis.h
parent6762d91c05324d7f931bb8dedf64e1559f66d0fa (diff)
downloadexternal_llvm-a358c1db5c744f7c524b18f2860c2d48613adbd1.zip
external_llvm-a358c1db5c744f7c524b18f2860c2d48613adbd1.tar.gz
external_llvm-a358c1db5c744f7c524b18f2860c2d48613adbd1.tar.bz2
Prefix IR dumps with LiveInterval indices when possible. This turns
this: %ESI<def> = MOV32rr %EDI<kill> ADJCALLSTACKDOWN64 0, %RSP<imp-def>, %EFLAGS<imp-def,dead>, %RSP<imp-use> %reg1027<def> = MOVZX64rr32 %ESI %reg1027<def> = ADD64ri8 %reg1027, 15, %EFLAGS<imp-def,dead> %reg1027<def> = AND64ri8 %reg1027, -16, %EFLAGS<imp-def,dead> %RDI<def> = MOV64rr %RSP %RDI<def> = SUB64rr %RDI, %reg1027<kill>, %EFLAGS<imp-def,dead> %RSP<def> = MOV64rr %RDI into this: 4 %reg1024<def> = MOV32rr %EDI<kill> 12 ADJCALLSTACKDOWN64 0, %RSP<imp-def>, %EFLAGS<imp-def,dead>, %RSP<imp-use> 20 %reg1025<def> = MOVZX64rr32 %reg1024 28 %reg1026<def> = MOV64rr %reg1025<kill> 36 %reg1026<def> = ADD64ri8 %reg1026, 15, %EFLAGS<imp-def,dead> 44 %reg1027<def> = MOV64rr %reg1026<kill> 52 %reg1027<def> = AND64ri8 %reg1027, -16, %EFLAGS<imp-def,dead> 60 %reg1028<def> = MOV64rr %RSP 68 %reg1029<def> = MOV64rr %reg1028<kill> 76 %reg1029<def> = SUB64rr %reg1029, %reg1027<kill>, %EFLAGS<imp-def,dead> 84 %RSP<def> = MOV64rr %reg1029 This helps greatly when debugging register allocation and coalescing problems. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@76615 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/CodeGen/LiveIntervalAnalysis.h')
-rw-r--r--include/llvm/CodeGen/LiveIntervalAnalysis.h26
1 files changed, 24 insertions, 2 deletions
diff --git a/include/llvm/CodeGen/LiveIntervalAnalysis.h b/include/llvm/CodeGen/LiveIntervalAnalysis.h
index 40991e7..ea67cdb 100644
--- a/include/llvm/CodeGen/LiveIntervalAnalysis.h
+++ b/include/llvm/CodeGen/LiveIntervalAnalysis.h
@@ -27,7 +27,9 @@
#include "llvm/ADT/SmallPtrSet.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/Support/Allocator.h"
+#include "llvm/Support/Dump.h"
#include <cmath>
+#include <sstream>
namespace llvm {
@@ -79,7 +81,7 @@ namespace llvm {
/// FunctionSize - The number of instructions present in the function
uint64_t FunctionSize;
- typedef DenseMap<MachineInstr*, unsigned> Mi2IndexMap;
+ typedef DenseMap<const MachineInstr*, unsigned> Mi2IndexMap;
Mi2IndexMap mi2iMap_;
typedef std::vector<MachineInstr*> Index2MiMap;
@@ -198,7 +200,7 @@ namespace llvm {
}
/// getInstructionIndex - returns the base index of instr
- unsigned getInstructionIndex(MachineInstr* instr) const {
+ unsigned getInstructionIndex(const MachineInstr* instr) const {
Mi2IndexMap::const_iterator it = mi2iMap_.find(instr);
assert(it != mi2iMap_.end() && "Invalid instruction!");
return it->second;
@@ -538,6 +540,26 @@ namespace llvm {
void printRegName(unsigned reg) const;
};
+ // IntervalPrefixPrinter - Print live interval indices before each
+ // instruction.
+ class IntervalPrefixPrinter : public PrefixPrinter {
+ private:
+ const LiveIntervals &liinfo;
+
+ public:
+ IntervalPrefixPrinter(const LiveIntervals &lii)
+ : liinfo(lii) {};
+
+ std::string operator()(const MachineBasicBlock &) const {
+ return("");
+ };
+
+ std::string operator()(const MachineInstr &instr) const {
+ std::stringstream out;
+ out << liinfo.getInstructionIndex(&instr);
+ return(out.str());
+ };
+ };
} // End llvm namespace
#endif