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

Unified Diff: runtime/vm/flow_graph_builder.cc

Issue 9969192: Implement condition type checks in new compiler, thereby removing last bailouts. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 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 | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/flow_graph_compiler.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/flow_graph_builder.cc
===================================================================
--- runtime/vm/flow_graph_builder.cc (revision 6612)
+++ runtime/vm/flow_graph_builder.cc (working copy)
@@ -160,6 +160,15 @@
void TestGraphVisitor::ReturnValue(Value* value) {
+ if (FLAG_enable_type_checks) {
+ AssertBooleanComp* assert_boolean =
+ new AssertBooleanComp(condition_node_id(),
+ condition_token_index(),
+ owner()->try_index(),
+ value);
+ AddInstruction(new BindInstr(temp_index(), assert_boolean));
+ value = new TempVal(temp_index());
+ }
BranchInstr* branch = new BranchInstr(value);
AddInstruction(branch);
CloseFragment();
@@ -298,7 +307,10 @@
// operator.
if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
// See ValueGraphVisitor::VisitBinaryOpNode.
- TestGraphVisitor for_left(owner(), temp_index());
+ TestGraphVisitor for_left(owner(),
+ temp_index(),
+ node->left()->id(),
+ node->left()->token_index());
node->left()->Visit(&for_left);
EffectGraphVisitor for_right(owner(), temp_index());
node->right()->Visit(&for_right);
@@ -343,19 +355,26 @@
const Bool& bool_true = Bool::ZoneHandle(Bool::True());
const Bool& bool_false = Bool::ZoneHandle(Bool::False());
- TestGraphVisitor for_test(owner(), temp_index());
+ TestGraphVisitor for_test(owner(),
+ temp_index(),
+ node->left()->id(),
+ node->left()->token_index());
node->left()->Visit(&for_test);
- if (FLAG_enable_type_checks) {
- Bailout("GenerateConditionTypeCheck in kAND/kOR");
- }
ValueGraphVisitor for_right(owner(), temp_index());
node->right()->Visit(&for_right);
+ Value* right_value = for_right.value();
if (FLAG_enable_type_checks) {
- Bailout("GenerateConditionTypeCheck in kAND/kOR");
+ AssertBooleanComp* assert_boolean =
+ new AssertBooleanComp(node->right()->id(),
+ node->right()->token_index(),
+ owner()->try_index(),
+ right_value);
+ for_right.AddInstruction(new BindInstr(temp_index(), assert_boolean));
+ right_value = new TempVal(temp_index());
}
StrictCompareComp* comp = new StrictCompareComp(Token::kEQ_STRICT,
- for_right.value(), new ConstantVal(bool_true));
+ right_value, new ConstantVal(bool_true));
for_right.AddInstruction(new BindInstr(temp_index(), comp));
if (node->kind() == Token::kAND) {
@@ -569,6 +588,15 @@
} else {
AddInstruction(new BindInstr(temp_index(), comp));
Value* eq_result = new TempVal(temp_index());
+ if (FLAG_enable_type_checks) {
+ AssertBooleanComp* assert_boolean =
+ new AssertBooleanComp(node->id(),
+ node->token_index(),
+ owner()->try_index(),
+ eq_result);
+ AddInstruction(new BindInstr(temp_index(), assert_boolean));
+ eq_result = new TempVal(temp_index());
+ }
BooleanNegateComp* negate = new BooleanNegateComp(eq_result);
ReturnComputation(negate);
}
@@ -598,10 +626,17 @@
ValueGraphVisitor for_value(owner(), temp_index());
node->operand()->Visit(&for_value);
Append(for_value);
+ Value* value = for_value.value();
if (FLAG_enable_type_checks) {
- Bailout("GenerateConditionTypeCheck in kNOT");
+ AssertBooleanComp* assert_boolean =
+ new AssertBooleanComp(node->operand()->id(),
+ node->operand()->token_index(),
+ owner()->try_index(),
+ value);
+ AddInstruction(new BindInstr(temp_index(), assert_boolean));
+ value = new TempVal(temp_index());
}
- BooleanNegateComp* negate = new BooleanNegateComp(for_value.value());
+ BooleanNegateComp* negate = new BooleanNegateComp(value);
ReturnComputation(negate);
return;
}
@@ -865,11 +900,11 @@
void EffectGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
- TestGraphVisitor for_test(owner(), temp_index());
+ TestGraphVisitor for_test(owner(),
+ temp_index(),
+ node->condition()->id(),
+ node->condition()->token_index());
node->condition()->Visit(&for_test);
- if (FLAG_enable_type_checks) {
- Bailout("GenerateConditionTypeCheck in conditional expr");
- }
// Translate the subexpressions for their effects.
EffectGraphVisitor for_true(owner(), temp_index());
@@ -882,11 +917,11 @@
void ValueGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
- TestGraphVisitor for_test(owner(), temp_index());
+ TestGraphVisitor for_test(owner(),
+ temp_index(),
+ node->condition()->id(),
+ node->condition()->token_index());
node->condition()->Visit(&for_test);
- if (FLAG_enable_type_checks) {
- Bailout("GenerateConditionTypeCheck in conditional expr");
- }
// Ensure that the value of the true/false subexpressions are named with
// the same temporary name.
@@ -917,11 +952,11 @@
// true_branch: <Sequence>
// false_branch: <Sequence> }
void EffectGraphVisitor::VisitIfNode(IfNode* node) {
- TestGraphVisitor for_test(owner(), temp_index());
+ TestGraphVisitor for_test(owner(),
+ temp_index(),
+ node->condition()->id(),
+ node->condition()->token_index());
node->condition()->Visit(&for_test);
- if (FLAG_enable_type_checks) {
- Bailout("GenerateConditionTypeCheck in if");
- }
EffectGraphVisitor for_true(owner(), temp_index());
EffectGraphVisitor for_false(owner(), temp_index());
@@ -1008,7 +1043,10 @@
GrowableArray<TargetEntryInstr*> case_entries;
for (intptr_t i = 0; i < len; i++) {
AstNode* case_expr = node->case_expressions()->NodeAt(i);
- TestGraphVisitor for_case_expression(owner(), temp_index());
+ TestGraphVisitor for_case_expression(owner(),
+ temp_index(),
+ case_expr->id(),
+ case_expr->token_index());
if (i == 0) {
case_entries.Add(NULL); // Not to be used
case_expr->Visit(&for_case_expression);
@@ -1088,14 +1126,13 @@
// f) loop-exit-target
// g) break-join (optional)
void EffectGraphVisitor::VisitWhileNode(WhileNode* node) {
- TestGraphVisitor for_test(owner(), temp_index());
+ TestGraphVisitor for_test(owner(),
+ temp_index(),
+ node->condition()->id(),
+ node->condition()->token_index());
node->condition()->Visit(&for_test);
ASSERT(!for_test.is_empty()); // Language spec.
- if (FLAG_enable_type_checks) {
- Bailout("GenerateConditionTypeCheck in while");
- }
-
EffectGraphVisitor for_body(owner(), temp_index());
node->body()->Visit(&for_body);
@@ -1125,14 +1162,13 @@
EffectGraphVisitor for_body(owner(), temp_index());
node->body()->Visit(&for_body);
- TestGraphVisitor for_test(owner(), temp_index());
+ TestGraphVisitor for_test(owner(),
+ temp_index(),
+ node->condition()->id(),
+ node->condition()->token_index());
node->condition()->Visit(&for_test);
ASSERT(is_open());
- if (FLAG_enable_type_checks) {
- Bailout("GenerateConditionTypeCheck in do while");
- }
-
// Tie do-while loop (test is after the body).
JoinEntryInstr* body_entry_join = new JoinEntryInstr();
AddInstruction(body_entry_join);
@@ -1235,12 +1271,12 @@
}
} else {
TargetEntryInstr* loop_exit = new TargetEntryInstr();
- TestGraphVisitor for_test(owner(), temp_index());
+ TestGraphVisitor for_test(owner(),
+ temp_index(),
+ node->condition()->id(),
+ node->condition()->token_index());
node->condition()->Visit(&for_test);
Append(for_test);
- if (FLAG_enable_type_checks) {
- Bailout("GenerateConditionTypeCheck in for");
- }
*for_test.true_successor_address() = body_entry;
*for_test.false_successor_address() = loop_exit;
if (node->label()->join_for_break() == NULL) {
@@ -1771,7 +1807,7 @@
}
AssertAssignableComp* assert_assignable =
new AssertAssignableComp(node->id(),
- node->local().token_index(),
+ node->value()->token_index(),
owner()->try_index(),
value,
type_arguments,
@@ -1851,7 +1887,7 @@
}
AssertAssignableComp* assert_assignable =
new AssertAssignableComp(node->id(),
- node->field().token_index(),
+ node->value()->token_index(),
owner()->try_index(),
store_value,
type_arguments,
@@ -2268,7 +2304,7 @@
OS::Print("AssertAssignable(");
comp->value()->Accept(this);
OS::Print(", %s, '%s'",
- comp->dst_type().ToCString(),
+ String::Handle(comp->dst_type().Name()).ToCString(),
comp->dst_name().ToCString());
if (comp->type_arguments() != NULL) {
OS::Print(" (type-arg:");
Property changes on: runtime/vm/flow_graph_builder.cc
___________________________________________________________________
Deleted: svn:eol-style
- LF
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/flow_graph_compiler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698