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

Unified Diff: src/compiler/ast-graph-builder.cc

Issue 2140673007: [turbofan] Introduce explicit loop exits markers. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix Created 4 years, 5 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/ast-graph-builder.cc
diff --git a/src/compiler/ast-graph-builder.cc b/src/compiler/ast-graph-builder.cc
index be6c358617b782a0188170f2e96311db6621cc51..fc8650d68abd6e702bbe6b51713bc165438439c4 100644
--- a/src/compiler/ast-graph-builder.cc
+++ b/src/compiler/ast-graph-builder.cc
@@ -178,14 +178,14 @@ class AstGraphBuilder::ControlScope BASE_EMBEDDED {
// Interface to execute a given command in this scope. Returning {true} here
// indicates successful execution whereas {false} requests to skip scope.
- virtual bool Execute(Command cmd, Statement* target, Node* value) {
+ virtual bool Execute(Command cmd, Statement* target, Node** value) {
// For function-level control.
switch (cmd) {
case CMD_THROW:
- builder()->BuildThrow(value);
+ builder()->BuildThrow(*value);
return true;
case CMD_RETURN:
- builder()->BuildReturn(value);
+ builder()->BuildReturn(*value);
return true;
case CMD_BREAK:
case CMD_CONTINUE:
@@ -303,7 +303,7 @@ class AstGraphBuilder::ControlScopeForBreakable : public ControlScope {
: ControlScope(owner), target_(target), control_(control) {}
protected:
- bool Execute(Command cmd, Statement* target, Node* value) override {
+ bool Execute(Command cmd, Statement* target, Node** value) override {
if (target != target_) return false; // We are not the command target.
switch (cmd) {
case CMD_BREAK:
@@ -331,8 +331,11 @@ class AstGraphBuilder::ControlScopeForIteration : public ControlScope {
: ControlScope(owner), target_(target), control_(control) {}
protected:
- bool Execute(Command cmd, Statement* target, Node* value) override {
- if (target != target_) return false; // We are not the command target.
+ bool Execute(Command cmd, Statement* target, Node** value) override {
+ if (target != target_) {
+ control_->ExitLoop(value);
+ return false;
+ }
switch (cmd) {
case CMD_BREAK:
control_->Break();
@@ -370,10 +373,10 @@ class AstGraphBuilder::ControlScopeForCatch : public ControlScope {
}
protected:
- bool Execute(Command cmd, Statement* target, Node* value) override {
+ bool Execute(Command cmd, Statement* target, Node** value) override {
switch (cmd) {
case CMD_THROW:
- control_->Throw(value);
+ control_->Throw(*value);
return true;
case CMD_BREAK:
case CMD_CONTINUE:
@@ -407,9 +410,9 @@ class AstGraphBuilder::ControlScopeForFinally : public ControlScope {
}
protected:
- bool Execute(Command cmd, Statement* target, Node* value) override {
- Node* token = commands_->RecordCommand(cmd, target, value);
- control_->LeaveTry(token, value);
+ bool Execute(Command cmd, Statement* target, Node** value) override {
+ Node* token = commands_->RecordCommand(cmd, target, *value);
+ control_->LeaveTry(token, *value);
return true;
}
@@ -935,6 +938,34 @@ Node* AstGraphBuilder::Environment::Checkpoint(BailoutId ast_id,
return result;
}
+void AstGraphBuilder::Environment::PrepareForLoopExit(
+ Node* loop, BitVector* assigned_variables) {
+ if (IsMarkedAsUnreachable()) return;
+
+ DCHECK_EQ(loop->opcode(), IrOpcode::kLoop);
+
+ Node* control = GetControlDependency();
+
+ // Create the loop exit node.
+ Node* loop_exit = graph()->NewNode(common()->LoopExit(), control, loop);
+ UpdateControlDependency(loop_exit);
+
+ // Rename the environmnent values.
+ for (size_t i = 0; i < values()->size(); i++) {
+ if (assigned_variables == nullptr ||
+ static_cast<int>(i) >= assigned_variables->length() ||
+ assigned_variables->Contains(static_cast<int>(i))) {
+ Node* rename = graph()->NewNode(common()->LoopExitValue(), (*values())[i],
+ loop_exit);
+ (*values())[i] = rename;
Michael Starzinger 2016/07/14 13:09:40 nit: Why not just "values_[i] = rename"?
+ }
+ }
+
+ // Rename the effect.
+ Node* effect_rename = graph()->NewNode(common()->LoopExitEffect(),
+ GetEffectDependency(), loop_exit);
+ UpdateEffectDependency(effect_rename);
+}
bool AstGraphBuilder::Environment::IsLivenessAnalysisEnabled() {
return FLAG_analyze_environment_liveness &&
@@ -1027,7 +1058,7 @@ void AstGraphBuilder::ControlScope::PerformCommand(Command command,
while (current != nullptr) {
environment()->TrimStack(current->stack_height());
environment()->TrimContextChain(current->context_length());
- if (current->Execute(command, target, value)) break;
+ if (current->Execute(command, target, &value)) break;
current = current->outer_;
}
builder()->set_environment(env);

Powered by Google App Engine
This is Rietveld 408576698