diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2014-06-04 11:12:39 +0100 |
---|---|---|
committer | Nicolas Geoffray <ngeoffray@google.com> | 2014-06-12 10:02:06 +0100 |
commit | 86dbb9a12119273039ce272b41c809fa548b37b6 (patch) | |
tree | a4626e21ae16a9a5e133ea3e5e95b58d2ea4d8e5 /compiler/optimizing/graph_visualizer.cc | |
parent | c936622863a50bdda9b10062515dfc02a8c8b652 (diff) | |
download | art-86dbb9a12119273039ce272b41c809fa548b37b6.zip art-86dbb9a12119273039ce272b41c809fa548b37b6.tar.gz art-86dbb9a12119273039ce272b41c809fa548b37b6.tar.bz2 |
Final CL to enable register allocation on x86.
This CL implements:
1) Resolution after allocation: connecting the locations
allocated to an interval within a block and between blocks.
2) Handling of fixed registers: some instructions require
inputs/output to be at a specific location, and the allocator
needs to deal with them in a special way.
3) ParallelMoveResolver::EmitNativeCode for x86.
Change-Id: I0da6bd7eb66877987148b87c3be6a983b4e3f858
Diffstat (limited to 'compiler/optimizing/graph_visualizer.cc')
-rw-r--r-- | compiler/optimizing/graph_visualizer.cc | 75 |
1 files changed, 57 insertions, 18 deletions
diff --git a/compiler/optimizing/graph_visualizer.cc b/compiler/optimizing/graph_visualizer.cc index 5c5042e..a49ce64 100644 --- a/compiler/optimizing/graph_visualizer.cc +++ b/compiler/optimizing/graph_visualizer.cc @@ -28,8 +28,15 @@ namespace art { */ class HGraphVisualizerPrinter : public HGraphVisitor { public: - HGraphVisualizerPrinter(HGraph* graph, std::ostream& output, const CodeGenerator& codegen) - : HGraphVisitor(graph), output_(output), codegen_(codegen), indent_(0) {} + HGraphVisualizerPrinter(HGraph* graph, + std::ostream& output, + const char* pass_name, + const CodeGenerator& codegen) + : HGraphVisitor(graph), + output_(output), + pass_name_(pass_name), + codegen_(codegen), + indent_(0) {} void StartTag(const char* name) { AddIndent(); @@ -94,6 +101,33 @@ class HGraphVisualizerPrinter : public HGraphVisitor { output_<< std::endl; } + void DumpLocation(Location location, Primitive::Type type) { + if (location.IsRegister()) { + if (type == Primitive::kPrimDouble || type == Primitive::kPrimFloat) { + codegen_.DumpFloatingPointRegister(output_, location.reg().RegId()); + } else { + codegen_.DumpCoreRegister(output_, location.reg().RegId()); + } + } else { + DCHECK(location.IsStackSlot()); + output_ << location.GetStackIndex() << "(sp)"; + } + } + + void VisitParallelMove(HParallelMove* instruction) { + output_ << instruction->DebugName(); + output_ << " ("; + for (size_t i = 0, e = instruction->NumMoves(); i < e; ++i) { + MoveOperands* move = instruction->MoveOperandsAt(i); + DumpLocation(move->GetSource(), Primitive::kPrimInt); + output_ << " -> "; + DumpLocation(move->GetDestination(), Primitive::kPrimInt); + if (i + 1 != e) { + output_ << ", "; + } + } + output_ << ")"; + } void VisitInstruction(HInstruction* instruction) { output_ << instruction->DebugName(); @@ -104,24 +138,28 @@ class HGraphVisualizerPrinter : public HGraphVisitor { } output_ << "]"; } - if (instruction->GetLifetimePosition() != kNoLifetime) { + if (pass_name_ == kLivenessPassName && instruction->GetLifetimePosition() != kNoLifetime) { output_ << " (liveness: " << instruction->GetLifetimePosition(); if (instruction->HasLiveInterval()) { output_ << " "; const LiveInterval& interval = *instruction->GetLiveInterval(); interval.Dump(output_); - if (interval.HasRegister()) { - int reg = interval.GetRegister(); + } + output_ << ")"; + } else if (pass_name_ == kRegisterAllocatorPassName) { + LocationSummary* locations = instruction->GetLocations(); + if (locations != nullptr) { + output_ << " ( "; + for (size_t i = 0; i < instruction->InputCount(); ++i) { + DumpLocation(locations->InAt(i), instruction->InputAt(i)->GetType()); output_ << " "; - if (instruction->GetType() == Primitive::kPrimFloat - || instruction->GetType() == Primitive::kPrimDouble) { - codegen_.DumpFloatingPointRegister(output_, reg); - } else { - codegen_.DumpCoreRegister(output_, reg); - } + } + output_ << ")"; + if (locations->Out().IsValid()) { + output_ << " -> "; + DumpLocation(locations->Out(), instruction->GetType()); } } - output_ << ")"; } } @@ -137,9 +175,9 @@ class HGraphVisualizerPrinter : public HGraphVisitor { } } - void Run(const char* pass_name) { + void Run() { StartTag("cfg"); - PrintProperty("name", pass_name); + PrintProperty("name", pass_name_); VisitInsertionOrder(); EndTag("cfg"); } @@ -188,6 +226,7 @@ class HGraphVisualizerPrinter : public HGraphVisitor { private: std::ostream& output_; + const char* pass_name_; const CodeGenerator& codegen_; size_t indent_; @@ -209,7 +248,7 @@ HGraphVisualizer::HGraphVisualizer(std::ostream* output, } is_enabled_ = true; - HGraphVisualizerPrinter printer(graph, *output_, codegen_); + HGraphVisualizerPrinter printer(graph, *output_, "", codegen_); printer.StartTag("compilation"); printer.PrintProperty("name", pretty_name.c_str()); printer.PrintProperty("method", pretty_name.c_str()); @@ -227,7 +266,7 @@ HGraphVisualizer::HGraphVisualizer(std::ostream* output, } is_enabled_ = true; - HGraphVisualizerPrinter printer(graph, *output_, codegen_); + HGraphVisualizerPrinter printer(graph, *output_, "", codegen_); printer.StartTag("compilation"); printer.PrintProperty("name", name); printer.PrintProperty("method", name); @@ -239,8 +278,8 @@ void HGraphVisualizer::DumpGraph(const char* pass_name) { if (!is_enabled_) { return; } - HGraphVisualizerPrinter printer(graph_, *output_, codegen_); - printer.Run(pass_name); + HGraphVisualizerPrinter printer(graph_, *output_, pass_name, codegen_); + printer.Run(); } } // namespace art |