diff options
author | David Greene <greened@obbligato.org> | 2009-07-21 18:56:32 +0000 |
---|---|---|
committer | David Greene <greened@obbligato.org> | 2009-07-21 18:56:32 +0000 |
commit | a358c1db5c744f7c524b18f2860c2d48613adbd1 (patch) | |
tree | c816f557985523cf306248c626013ae8db1bfeea /include/llvm | |
parent | 6762d91c05324d7f931bb8dedf64e1559f66d0fa (diff) | |
download | external_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')
-rw-r--r-- | include/llvm/CodeGen/LiveIntervalAnalysis.h | 26 |
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 |