Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Unified Diff: src/compiler/pipeline.cc

Issue 669053002: [turbofan] split compilation stats off from HStatistics and track high water marks (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: src/compiler/pipeline.cc
diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc
index 438f10459524b33113a439c942e0434097f1fdc2..609de0670b16d6795c323efae90afa8f3ff7b7db 100644
--- a/src/compiler/pipeline.cc
+++ b/src/compiler/pipeline.cc
@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "src/compiler/pipeline.h"
-
#include <sstream>
#include "src/base/platform/elapsed-timer.h"
@@ -22,6 +20,8 @@
#include "src/compiler/js-typed-lowering.h"
#include "src/compiler/machine-operator-reducer.h"
#include "src/compiler/phi-reducer.h"
+#include "src/compiler/pipeline.h"
+#include "src/compiler/pipeline-statistics.h"
#include "src/compiler/register-allocator.h"
#include "src/compiler/schedule.h"
#include "src/compiler/scheduler.h"
@@ -31,7 +31,6 @@
#include "src/compiler/value-numbering-reducer.h"
#include "src/compiler/verifier.h"
#include "src/compiler/zone-pool.h"
-#include "src/hydrogen.h"
#include "src/ostreams.h"
#include "src/utils.h"
@@ -39,55 +38,6 @@ namespace v8 {
namespace internal {
namespace compiler {
-class PhaseStats {
- public:
- enum PhaseKind { CREATE_GRAPH, OPTIMIZATION, CODEGEN };
-
- PhaseStats(CompilationInfo* info, ZonePool* zone_pool, PhaseKind kind,
- const char* name)
- : info_(info),
- stats_scope_(zone_pool),
- kind_(kind),
- name_(name),
- size_(0) {
- if (FLAG_turbo_stats) {
- timer_.Start();
- size_ = info_->zone()->allocation_size();
- }
- }
-
- ~PhaseStats() {
- if (FLAG_turbo_stats) {
- base::TimeDelta delta = timer_.Elapsed();
- size_t bytes = info_->zone()->allocation_size() +
- stats_scope_.GetMaxAllocatedBytes() - size_;
- HStatistics* stats = info_->isolate()->GetTStatistics();
- stats->SaveTiming(name_, delta, static_cast<int>(bytes));
-
- switch (kind_) {
- case CREATE_GRAPH:
- stats->IncrementCreateGraph(delta);
- break;
- case OPTIMIZATION:
- stats->IncrementOptimizeGraph(delta);
- break;
- case CODEGEN:
- stats->IncrementGenerateCode(delta);
- break;
- }
- }
- }
-
- private:
- CompilationInfo* info_;
- ZonePool::StatsScope stats_scope_;
- PhaseKind kind_;
- const char* name_;
- size_t size_;
- base::ElapsedTimer timer_;
-};
-
-
static inline bool VerifyGraphs() {
#ifdef DEBUG
return true;
@@ -226,7 +176,13 @@ Handle<Code> Pipeline::GenerateCode() {
return Handle<Code>::null();
}
- if (FLAG_turbo_stats) isolate()->GetTStatistics()->Initialize(info_);
+ ZonePool zone_pool(isolate());
+
+ SmartPointer<PipelineStatistics> pipeline_statistics;
+ if (FLAG_turbo_stats) {
+ pipeline_statistics.Reset(new PipelineStatistics(info(), &zone_pool));
+ pipeline_statistics->BeginPhaseKind("create graph");
+ }
if (FLAG_trace_turbo) {
OFStream os(stdout);
@@ -237,8 +193,6 @@ Handle<Code> Pipeline::GenerateCode() {
PrintCompilationStart();
}
- ZonePool zone_pool(isolate());
-
// Build the graph.
Graph graph(zone());
SourcePositionTable source_positions(&graph);
@@ -253,8 +207,7 @@ Handle<Code> Pipeline::GenerateCode() {
JSGraph jsgraph(&graph, &common, &javascript, &machine);
Node* context_node;
{
- PhaseStats graph_builder_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
- "graph builder");
+ PhaseScope phase_scope(pipeline_statistics.get(), "graph builder");
ZonePool::Scope zone_scope(&zone_pool);
AstGraphBuilderWithPositions graph_builder(zone_scope.zone(), info(),
&jsgraph, &source_positions);
@@ -262,8 +215,7 @@ Handle<Code> Pipeline::GenerateCode() {
context_node = graph_builder.GetFunctionContext();
}
{
- PhaseStats phi_reducer_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
- "phi reduction");
+ PhaseScope phase_scope(pipeline_statistics.get(), "phi reduction");
PhiReducer phi_reducer;
GraphReducer graph_reducer(&graph);
graph_reducer.AddReducer(&phi_reducer);
@@ -285,6 +237,7 @@ Handle<Code> Pipeline::GenerateCode() {
}
if (info()->is_inlining_enabled()) {
+ PhaseScope phase_scope(pipeline_statistics.get(), "inlining");
SourcePositionTable::Scope pos(&source_positions,
SourcePosition::Unknown());
ZonePool::Scope zone_scope(&zone_pool);
@@ -304,15 +257,20 @@ Handle<Code> Pipeline::GenerateCode() {
if (info()->is_typing_enabled()) {
{
// Type the graph.
- PhaseStats typer_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
- "typer");
+ PhaseScope phase_scope(pipeline_statistics.get(), "typer");
typer.Run();
VerifyAndPrintGraph(&graph, "Typed");
}
+ }
+
+ if (!pipeline_statistics.is_empty()) {
+ pipeline_statistics->BeginPhaseKind("lowering");
+ }
+
+ if (info()->is_typing_enabled()) {
{
// Lower JSOperators where we can determine types.
- PhaseStats lowering_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
- "typed lowering");
+ PhaseScope phase_scope(pipeline_statistics.get(), "typed lowering");
SourcePositionTable::Scope pos(&source_positions,
SourcePosition::Unknown());
ValueNumberingReducer vn_reducer(zone());
@@ -328,8 +286,7 @@ Handle<Code> Pipeline::GenerateCode() {
}
{
// Lower simplified operators and insert changes.
- PhaseStats lowering_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
- "simplified lowering");
+ PhaseScope phase_scope(pipeline_statistics.get(), "simplified lowering");
SourcePositionTable::Scope pos(&source_positions,
SourcePosition::Unknown());
SimplifiedLowering lowering(&jsgraph);
@@ -345,8 +302,7 @@ Handle<Code> Pipeline::GenerateCode() {
}
{
// Lower changes that have been inserted before.
- PhaseStats lowering_stats(info(), &zone_pool, PhaseStats::OPTIMIZATION,
- "change lowering");
+ PhaseScope phase_scope(pipeline_statistics.get(), "change lowering");
SourcePositionTable::Scope pos(&source_positions,
SourcePosition::Unknown());
Linkage linkage(info());
@@ -367,10 +323,9 @@ Handle<Code> Pipeline::GenerateCode() {
}
{
+ PhaseScope phase_scope(pipeline_statistics.get(), "control reduction");
SourcePositionTable::Scope pos(&source_positions,
SourcePosition::Unknown());
- PhaseStats control_reducer_stats(
- info(), &zone_pool, PhaseStats::CREATE_GRAPH, "control reduction");
ZonePool::Scope zone_scope(&zone_pool);
ControlReducer::ReduceGraph(zone_scope.zone(), &jsgraph, &common);
@@ -380,8 +335,7 @@ Handle<Code> Pipeline::GenerateCode() {
{
// Lower any remaining generic JSOperators.
- PhaseStats lowering_stats(info(), &zone_pool, PhaseStats::CREATE_GRAPH,
- "generic lowering");
+ PhaseScope phase_scope(pipeline_statistics.get(), "generic lowering");
SourcePositionTable::Scope pos(&source_positions,
SourcePosition::Unknown());
JSGenericLowering lowering(info(), &jsgraph);
@@ -393,18 +347,25 @@ Handle<Code> Pipeline::GenerateCode() {
VerifyAndPrintGraph(&graph, "Lowered generic", true);
}
+ if (!pipeline_statistics.is_empty()) {
+ pipeline_statistics->BeginPhaseKind("code generation");
+ }
+
source_positions.RemoveDecorator();
- Handle<Code> code = Handle<Code>::null();
+ Schedule* schedule;
{
+ PhaseScope phase_scope(pipeline_statistics.get(), "scheduling");
// Compute a schedule.
- Schedule* schedule = ComputeSchedule(&zone_pool, &graph);
+ schedule = ComputeSchedule(&zone_pool, &graph);
+ }
+
+ Handle<Code> code = Handle<Code>::null();
+ {
// Generate optimized code.
- PhaseStats codegen_stats(info(), &zone_pool, PhaseStats::CODEGEN,
- "codegen");
Linkage linkage(info());
- code =
- GenerateCode(&zone_pool, &linkage, &graph, schedule, &source_positions);
+ code = GenerateCode(pipeline_statistics.get(), &zone_pool, &linkage, &graph,
+ schedule, &source_positions);
info()->SetCode(code);
}
@@ -424,8 +385,6 @@ Handle<Code> Pipeline::GenerateCode() {
Schedule* Pipeline::ComputeSchedule(ZonePool* zone_pool, Graph* graph) {
- PhaseStats schedule_stats(info(), zone_pool, PhaseStats::CODEGEN,
- "scheduling");
Schedule* schedule = Scheduler::ComputeSchedule(zone_pool, graph);
TraceSchedule(schedule);
if (VerifyGraphs()) ScheduleVerifier::Run(schedule);
@@ -446,8 +405,8 @@ Handle<Code> Pipeline::GenerateCodeForMachineGraph(Linkage* linkage,
TraceSchedule(schedule);
SourcePositionTable source_positions(graph);
- Handle<Code> code =
- GenerateCode(&zone_pool, linkage, graph, schedule, &source_positions);
+ Handle<Code> code = GenerateCode(NULL, &zone_pool, linkage, graph, schedule,
+ &source_positions);
#if ENABLE_DISASSEMBLER
if (!code.is_null() && FLAG_print_opt_code) {
CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer());
@@ -459,7 +418,8 @@ Handle<Code> Pipeline::GenerateCodeForMachineGraph(Linkage* linkage,
}
-Handle<Code> Pipeline::GenerateCode(ZonePool* zone_pool, Linkage* linkage,
+Handle<Code> Pipeline::GenerateCode(PipelineStatistics* pipeline_statistics,
+ ZonePool* zone_pool, Linkage* linkage,
Graph* graph, Schedule* schedule,
SourcePositionTable* source_positions) {
DCHECK_NOT_NULL(graph);
@@ -477,6 +437,7 @@ Handle<Code> Pipeline::GenerateCode(ZonePool* zone_pool, Linkage* linkage,
// Select and schedule instructions covering the scheduled graph.
{
+ PhaseScope phase_scope(pipeline_statistics, "select instructions");
ZonePool::Scope zone_scope(zone_pool);
InstructionSelector selector(zone_scope.zone(), linkage, &sequence,
schedule, source_positions);
@@ -502,7 +463,7 @@ Handle<Code> Pipeline::GenerateCode(ZonePool* zone_pool, Linkage* linkage,
ZonePool::Scope zone_scope(zone_pool);
RegisterAllocator allocator(zone_scope.zone(), &frame, linkage->info(),
&sequence);
- if (!allocator.Allocate(zone_pool)) {
+ if (!allocator.Allocate(pipeline_statistics)) {
linkage->info()->AbortOptimization(kNotEnoughVirtualRegistersRegalloc);
return Handle<Code>::null();
}
@@ -518,8 +479,12 @@ Handle<Code> Pipeline::GenerateCode(ZonePool* zone_pool, Linkage* linkage,
}
// Generate native sequence.
- CodeGenerator generator(&frame, linkage, &sequence);
- Handle<Code> code = generator.GenerateCode();
+ Handle<Code> code;
+ {
+ PhaseScope phase_scope(pipeline_statistics, "generate code");
+ CodeGenerator generator(&frame, linkage, &sequence);
+ code = generator.GenerateCode();
+ }
if (profiler_data != NULL) {
#if ENABLE_DISASSEMBLER
std::ostringstream os;

Powered by Google App Engine
This is Rietveld 408576698