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

Unified Diff: src/compiler/pipeline.cc

Issue 1849603002: [turbofan] Effect linearization after representation inference. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Tweaks Created 4 years, 8 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
« no previous file with comments | « src/compiler/graph-reducer.cc ('k') | src/compiler/schedule.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/pipeline.cc
diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc
index d711abefb8338ead3c661268696013612f3a1253..ead750c92c24049ed217f59116289cdf2132984f 100644
--- a/src/compiler/pipeline.cc
+++ b/src/compiler/pipeline.cc
@@ -19,6 +19,7 @@
#include "src/compiler/common-operator-reducer.h"
#include "src/compiler/control-flow-optimizer.h"
#include "src/compiler/dead-code-elimination.h"
+#include "src/compiler/effect-control-linearizer.h"
#include "src/compiler/escape-analysis-reducer.h"
#include "src/compiler/escape-analysis.h"
#include "src/compiler/frame-elider.h"
@@ -225,6 +226,7 @@ class PipelineData {
DCHECK(!schedule_);
schedule_ = schedule;
}
+ void reset_schedule() { schedule_ = nullptr; }
Zone* instruction_zone() const { return instruction_zone_; }
InstructionSequence* sequence() const { return sequence_; }
@@ -503,6 +505,9 @@ PipelineCompilationJob::Status PipelineCompilationJob::CreateGraphImpl() {
if (!info()->shared_info()->asm_function() || FLAG_turbo_asm_deoptimization) {
info()->MarkAsDeoptimizationEnabled();
}
+ if (!info()->shared_info()->asm_function()) {
+ info()->MarkAsEffectSchedulingEnabled();
+ }
if (!info()->shared_info()->HasBytecodeArray()) {
if (!Compiler::EnsureDeoptimizationSupport(info())) return FAILED;
@@ -799,6 +804,35 @@ struct ControlFlowOptimizationPhase {
}
};
+struct EffectControlLinearizationPhase {
+ static const char* phase_name() { return "effect linearization"; }
+
+ void Run(PipelineData* data, Zone* temp_zone) {
+ // The scheduler requires the graphs to be trimmed, so trim now.
+ // TODO(jarin) Remove the trimming once the scheduler can handle untrimmed
+ // graphs.
+ GraphTrimmer trimmer(temp_zone, data->graph());
+ NodeVector roots(temp_zone);
+ data->jsgraph()->GetCachedNodes(&roots);
+ trimmer.TrimGraph(roots.begin(), roots.end());
+
+ // Schedule the graph without node splitting so that we can
+ // fix the effect and control flow for nodes with low-level side
+ // effects (such as changing representation to tagged or
+ // 'floating' allocation regions.)
+ Schedule* schedule = Scheduler::ComputeSchedule(temp_zone, data->graph(),
+ Scheduler::kNoFlags);
+ if (FLAG_turbo_verify) ScheduleVerifier::Run(schedule);
+
+ // Post-pass for wiring the control/effects
+ // - connect allocating representation changes into the control&effect
+ // chains and lower them,
+ // - get rid of the region markers,
+ // - introduce effect phis and rewire effects to get SSA again.
+ EffectControlLinearizer introducer(data->jsgraph(), schedule, temp_zone);
+ introducer.Run();
+ }
+};
struct ChangeLoweringPhase {
static const char* phase_name() { return "change lowering"; }
@@ -823,6 +857,26 @@ struct ChangeLoweringPhase {
}
};
+struct ComputeEffectSchedulePhase {
+ static const char* phase_name() { return "effect scheduling"; }
+
+ void Run(PipelineData* data, Zone* temp_zone) {
+ Schedule* schedule = Scheduler::ComputeSchedule(temp_zone, data->graph(),
+ Scheduler::kNoFlags);
+ if (FLAG_turbo_verify) ScheduleVerifier::Run(schedule);
+ data->set_schedule(schedule);
+ }
+};
+
+struct EffectScheduleTrimmingPhase {
+ static const char* phase_name() { return "effect schedule graph trimming"; }
+ void Run(PipelineData* data, Zone* temp_zone) {
+ GraphTrimmer trimmer(temp_zone, data->graph());
+ NodeVector roots(temp_zone);
+ data->jsgraph()->GetCachedNodes(&roots);
+ trimmer.TrimGraph(roots.begin(), roots.end());
+ }
+};
struct EarlyGraphTrimmingPhase {
static const char* phase_name() { return "early graph trimming"; }
@@ -1251,6 +1305,12 @@ Handle<Code> Pipeline::GenerateCode() {
Run<SimplifiedLoweringPhase>();
RunPrintAndVerify("Lowered simplified");
+ if (info()->is_effect_scheduling_enabled()) {
+ // TODO(jarin) Run value numbering for the representation changes.
+ Run<EffectControlLinearizationPhase>();
+ RunPrintAndVerify("Effect and control linearized");
+ }
+
Run<BranchEliminationPhase>();
RunPrintAndVerify("Branch conditions eliminated");
« no previous file with comments | « src/compiler/graph-reducer.cc ('k') | src/compiler/schedule.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698