Add a linear scan register allocator to the optimizing compiler.
This is a "by-the-book" implementation. It currently only deals
with allocating registers, with no hint optimizations.
The changes remaining to make it functional are:
- Allocate spill slots.
- Resolution and placements of Move instructions.
- Connect it to the code generator.
Change-Id: Ie0b2f6ba1b98da85425be721ce4afecd6b4012a4
diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc
index 286f48a..dfbb488 100644
--- a/compiler/optimizing/optimizing_compiler.cc
+++ b/compiler/optimizing/optimizing_compiler.cc
@@ -24,6 +24,7 @@
#include "driver/dex_compilation_unit.h"
#include "graph_visualizer.h"
#include "nodes.h"
+#include "register_allocator.h"
#include "ssa_liveness_analysis.h"
#include "utils/arena_allocator.h"
@@ -96,8 +97,6 @@
}
return nullptr;
}
- HGraphVisualizer visualizer(visualizer_output_.get(), graph, kStringFilter, dex_compilation_unit);
- visualizer.DumpGraph("builder");
InstructionSet instruction_set = GetCompilerDriver()->GetInstructionSet();
// The optimizing compiler currently does not have a Thumb2 assembler.
@@ -112,6 +111,10 @@
return nullptr;
}
+ HGraphVisualizer visualizer(
+ visualizer_output_.get(), graph, kStringFilter, *codegen, dex_compilation_unit);
+ visualizer.DumpGraph("builder");
+
CodeVectorAllocator allocator;
codegen->Compile(&allocator);
@@ -128,9 +131,13 @@
visualizer.DumpGraph("ssa");
graph->FindNaturalLoops();
- SsaLivenessAnalysis(*graph).Analyze();
+ SsaLivenessAnalysis liveness(*graph);
+ liveness.Analyze();
visualizer.DumpGraph("liveness");
+ RegisterAllocator(graph->GetArena(), *codegen).AllocateRegisters(liveness);
+ visualizer.DumpGraph("register");
+
return new CompiledMethod(GetCompilerDriver(),
instruction_set,
allocator.GetMemory(),