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

Unified Diff: runtime/vm/flow_graph_builder.cc

Issue 10913010: Inlining monomorphic calls. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 3 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_inliner.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/flow_graph_builder.cc
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 210a149e48d50ff7d42067ffcb28399c28e00351..dd4046b2b16d866e2b9d287825e71fe02550bd20 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -66,6 +66,7 @@ void EffectGraphVisitor::Append(const EffectGraphVisitor& other_fragment) {
Value* EffectGraphVisitor::Bind(Definition* definition) {
ASSERT(is_open());
+ ASSERT(!owner()->InInliningContext() || !definition->CanDeoptimize());
DeallocateTempIndex(definition->InputCount());
definition->set_use_kind(Definition::kValue);
definition->set_temp_index(AllocateTempIndex());
@@ -81,6 +82,7 @@ Value* EffectGraphVisitor::Bind(Definition* definition) {
void EffectGraphVisitor::Do(Definition* definition) {
ASSERT(is_open());
+ ASSERT(!owner()->InInliningContext() || !definition->CanDeoptimize());
DeallocateTempIndex(definition->InputCount());
definition->set_use_kind(Definition::kEffect);
if (is_empty()) {
@@ -216,6 +218,7 @@ Definition* EffectGraphVisitor::BuildStoreLocal(
ASSERT(delta >= 0);
Value* context = Bind(new CurrentContextInstr());
while (delta-- > 0) {
+ InlineBailout("EffectGraphVisitor::BuildStoreLocal (deopt)");
context = Bind(new LoadVMFieldInstr(
context, Context::parent_offset(), Type::ZoneHandle()));
}
@@ -232,6 +235,7 @@ Definition* EffectGraphVisitor::BuildStoreLocal(
Definition* EffectGraphVisitor::BuildLoadLocal(const LocalVariable& local) {
if (local.is_captured()) {
+ InlineBailout("EffectGraphVisitor::BuildStoreLocal (deopt)");
intptr_t delta =
owner()->context_level() - local.owner()->context_level();
ASSERT(delta >= 0);
@@ -447,7 +451,6 @@ void EffectGraphVisitor::VisitReturnNode(ReturnNode* node) {
Value* return_value = for_value.value();
if (FLAG_enable_type_checks) {
- InlineBailout("EffectGraphVisitor::VisitReturnNode (type check)");
const Function& function = owner()->parsed_function().function();
const bool is_implicit_dynamic_getter =
(!function.is_static() &&
@@ -512,7 +515,6 @@ bool EffectGraphVisitor::CanSkipTypeCheck(intptr_t token_pos,
Value* value,
const AbstractType& dst_type,
const String& dst_name) {
- InlineBailout("EffectGraphVisitor::CanSkipTypeCheck");
ASSERT(!dst_type.IsNull());
ASSERT(dst_type.IsFinalized());
@@ -560,13 +562,11 @@ bool EffectGraphVisitor::CanSkipTypeCheck(intptr_t token_pos,
// type: AbstractType
// dst_name: String }
void EffectGraphVisitor::VisitAssignableNode(AssignableNode* node) {
- InlineBailout("EffectGraphVisitor::VisitAssignableNode");
UNREACHABLE();
}
void ValueGraphVisitor::VisitAssignableNode(AssignableNode* node) {
- InlineBailout("ValueGraphVisitor::VisitAssignableNode");
ValueGraphVisitor for_value(owner(), temp_index());
node->expr()->Visit(&for_value);
Append(for_value);
@@ -581,7 +581,6 @@ void ValueGraphVisitor::VisitAssignableNode(AssignableNode* node) {
// left: <Expression>
// right: <Expression> }
void EffectGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
- InlineBailout("EffectGraphVisitor::VisitBinaryOpNode");
// Operators "&&" and "||" cannot be overloaded therefore do not call
// operator.
if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
@@ -600,6 +599,7 @@ void EffectGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
}
return;
}
+ InlineBailout("EffectGraphVisitor::VisitBinaryOpNode (deopt)");
ValueGraphVisitor for_left_value(owner(), temp_index());
node->left()->Visit(&for_left_value);
Append(for_left_value);
@@ -627,7 +627,6 @@ void EffectGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
// Special handling for AND/OR.
void ValueGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
- InlineBailout("ValueGraphVisitor::VisitBinaryOpNode");
// Operators "&&" and "||" cannot be overloaded therefore do not call
// operator.
if ((node->kind() == Token::kAND) || (node->kind() == Token::kOR)) {
@@ -647,6 +646,7 @@ void ValueGraphVisitor::VisitBinaryOpNode(BinaryOpNode* node) {
node->right()->Visit(&for_right);
Value* right_value = for_right.value();
if (FLAG_enable_type_checks) {
+ InlineBailout("ValueGraphVisitor::VisitBinaryOpNode (type check)");
right_value =
for_right.Bind(new AssertBooleanInstr(node->right()->token_pos(),
right_value));
@@ -688,7 +688,6 @@ void EffectGraphVisitor::BuildTypecheckArguments(
intptr_t token_pos,
Value** instantiator_result,
Value** instantiator_type_arguments_result) {
- InlineBailout("EffectGraphVisitor::VisitBinaryOpNode");
Value* instantiator = NULL;
Value* instantiator_type_arguments = NULL;
const Class& instantiator_class = Class::Handle(
@@ -716,7 +715,6 @@ void EffectGraphVisitor::BuildTypecheckArguments(
Value* EffectGraphVisitor::BuildNullValue() {
- InlineBailout("EffectGraphVisitor::BuildNullValue");
return Bind(new ConstantInstr(Object::ZoneHandle()));
}
@@ -727,7 +725,7 @@ AssertAssignableInstr* EffectGraphVisitor::BuildAssertAssignable(
Value* value,
const AbstractType& dst_type,
const String& dst_name) {
- InlineBailout("EffectGraphVisitor::BuildAssertAssignable");
+ InlineBailout("EffectGraphVisitor::BuildAssertAssignable (deopt)");
// Build the type check computation.
Value* instantiator = NULL;
Value* instantiator_type_arguments = NULL;
@@ -753,7 +751,6 @@ Value* EffectGraphVisitor::BuildAssignableValue(intptr_t token_pos,
Value* value,
const AbstractType& dst_type,
const String& dst_name) {
- InlineBailout("EffectGraphVisitor::BuildAssignableValue");
if (CanSkipTypeCheck(token_pos, value, dst_type, dst_name)) {
return value;
}
@@ -762,7 +759,6 @@ Value* EffectGraphVisitor::BuildAssignableValue(intptr_t token_pos,
void EffectGraphVisitor::BuildTypeTest(ComparisonNode* node) {
- InlineBailout("EffectGraphVisitor::BuildTypeTest");
ASSERT(Token::IsTypeTestOperator(node->kind()));
EffectGraphVisitor for_left_value(owner(), temp_index());
node->left()->Visit(&for_left_value);
@@ -771,7 +767,6 @@ void EffectGraphVisitor::BuildTypeTest(ComparisonNode* node) {
void EffectGraphVisitor::BuildTypeCast(ComparisonNode* node) {
- InlineBailout("EffectGraphVisitor::BuildTypeCast");
ASSERT(Token::IsTypeCastOperator(node->kind()));
const AbstractType& type = node->right()->AsTypeNode()->type();
ASSERT(type.IsFinalized()); // The type in a type cast may be malformed.
@@ -788,7 +783,6 @@ void EffectGraphVisitor::BuildTypeCast(ComparisonNode* node) {
void ValueGraphVisitor::BuildTypeTest(ComparisonNode* node) {
- InlineBailout("ValueGraphVisitor::BuildTypeTest");
ASSERT(Token::IsTypeTestOperator(node->kind()));
const Bool& bool_true = Bool::ZoneHandle(Bool::True());
const Bool& bool_false = Bool::ZoneHandle(Bool::False());
@@ -829,6 +823,7 @@ void ValueGraphVisitor::BuildTypeTest(ComparisonNode* node) {
ReturnDefinition(result);
return;
}
+ InlineBailout("ValueGraphVisitor::BuildTypeTest (deopt)");
ValueGraphVisitor for_left_value(owner(), temp_index());
node->left()->Visit(&for_left_value);
@@ -855,7 +850,6 @@ void ValueGraphVisitor::BuildTypeTest(ComparisonNode* node) {
void ValueGraphVisitor::BuildTypeCast(ComparisonNode* node) {
- InlineBailout("ValueGraphVisitor::BuildTypeCast");
ASSERT(Token::IsTypeCastOperator(node->kind()));
const AbstractType& type = node->right()->AsTypeNode()->type();
ASSERT(type.IsFinalized()); // The type in a type cast may be malformed.
@@ -876,7 +870,6 @@ void ValueGraphVisitor::BuildTypeCast(ComparisonNode* node) {
// right: <Expression> }
// TODO(srdjan): Implement new equality.
void EffectGraphVisitor::VisitComparisonNode(ComparisonNode* node) {
- InlineBailout("EffectGraphVisitor::VisitComparisonNode");
if (Token::IsTypeTestOperator(node->kind())) {
BuildTypeTest(node);
return;
@@ -898,6 +891,7 @@ void EffectGraphVisitor::VisitComparisonNode(ComparisonNode* node) {
ReturnDefinition(comp);
return;
}
+ InlineBailout("EffectGraphVisitor::VisitComparisonNode (deopt)");
if ((node->kind() == Token::kEQ) || (node->kind() == Token::kNE)) {
ValueGraphVisitor for_left_value(owner(), temp_index());
@@ -945,7 +939,6 @@ void EffectGraphVisitor::VisitComparisonNode(ComparisonNode* node) {
void EffectGraphVisitor::VisitUnaryOpNode(UnaryOpNode* node) {
- InlineBailout("EffectGraphVisitor::VisitUnaryOpNode");
// "!" cannot be overloaded, therefore do not call operator.
if (node->kind() == Token::kNOT) {
ValueGraphVisitor for_value(owner(), temp_index());
@@ -960,6 +953,8 @@ void EffectGraphVisitor::VisitUnaryOpNode(UnaryOpNode* node) {
ReturnDefinition(negate);
return;
}
+ InlineBailout("EffectGraphVisitor::VisitUnaryOpNode (deopt)");
+
ValueGraphVisitor for_value(owner(), temp_index());
node->operand()->Visit(&for_value);
Append(for_value);
@@ -981,7 +976,6 @@ void EffectGraphVisitor::VisitUnaryOpNode(UnaryOpNode* node) {
void EffectGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
- InlineBailout("EffectGraphVisitor::VisitConditionalExprNode");
TestGraphVisitor for_test(owner(),
temp_index(),
node->condition()->token_pos());
@@ -998,7 +992,6 @@ void EffectGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
void ValueGraphVisitor::VisitConditionalExprNode(ConditionalExprNode* node) {
- InlineBailout("ValueGraphVisitor::VisitConditionalExprNode");
TestGraphVisitor for_test(owner(),
temp_index(),
node->condition()->token_pos());
@@ -1043,7 +1036,6 @@ void EffectGraphVisitor::VisitIfNode(IfNode* node) {
void EffectGraphVisitor::VisitSwitchNode(SwitchNode* node) {
- InlineBailout("EffectGraphVisitor::VisitSwitchNode");
EffectGraphVisitor switch_body(owner(), temp_index());
node->body()->Visit(&switch_body);
Append(switch_body);
@@ -1388,7 +1380,6 @@ void EffectGraphVisitor::VisitJumpNode(JumpNode* node) {
void EffectGraphVisitor::VisitArgumentListNode(ArgumentListNode* node) {
- InlineBailout("EffectGraphVisitor::VisitArgumentListNode");
UNREACHABLE();
}
@@ -1404,7 +1395,6 @@ void EffectGraphVisitor::VisitArgumentDefinitionTestNode(
void EffectGraphVisitor::VisitArrayNode(ArrayNode* node) {
- InlineBailout("EffectGraphVisitor::VisitArrayNode");
// Translate the array elements and collect their values.
ZoneGrowableArray<PushArgumentInstr*>* arguments =
new ZoneGrowableArray<PushArgumentInstr*>(node->length());
@@ -1427,7 +1417,6 @@ void EffectGraphVisitor::VisitArrayNode(ArrayNode* node) {
void EffectGraphVisitor::VisitClosureNode(ClosureNode* node) {
- InlineBailout("EffectGraphVisitor::VisitClosureNode");
const Function& function = node->function();
Value* receiver = NULL;
@@ -1478,7 +1467,6 @@ void EffectGraphVisitor::VisitClosureNode(ClosureNode* node) {
void EffectGraphVisitor::TranslateArgumentList(
const ArgumentListNode& node,
ZoneGrowableArray<Value*>* values) {
- InlineBailout("EffectGraphVisitor::TranslateArgumentList");
for (intptr_t i = 0; i < node.length(); ++i) {
ValueGraphVisitor for_argument(owner(), temp_index());
node.NodeAt(i)->Visit(&for_argument);
@@ -1491,7 +1479,6 @@ void EffectGraphVisitor::TranslateArgumentList(
void EffectGraphVisitor::BuildPushArguments(
const ArgumentListNode& node,
ZoneGrowableArray<PushArgumentInstr*>* values) {
- InlineBailout("EffectGraphVisitor::BuildPushArguments");
for (intptr_t i = 0; i < node.length(); ++i) {
ValueGraphVisitor for_argument(owner(), temp_index());
node.NodeAt(i)->Visit(&for_argument);
@@ -1503,7 +1490,7 @@ void EffectGraphVisitor::BuildPushArguments(
void EffectGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
- InlineBailout("EffectGraphVisitor::VisitInstanceCallNode");
+ InlineBailout("EffectGraphVisitor::VisitInstanceCallNode (deopt)");
ValueGraphVisitor for_receiver(owner(), temp_index());
node->receiver()->Visit(&for_receiver);
Append(for_receiver);
@@ -1525,7 +1512,7 @@ void EffectGraphVisitor::VisitInstanceCallNode(InstanceCallNode* node) {
// <Expression> ::= StaticCall { function: Function
// arguments: <ArgumentList> }
void EffectGraphVisitor::VisitStaticCallNode(StaticCallNode* node) {
- InlineBailout("EffectGraphVisitor::VisitStaticCallNode");
+ InlineBailout("EffectGraphVisitor::VisitStaticCallNode (deopt)");
ZoneGrowableArray<PushArgumentInstr*>* arguments =
new ZoneGrowableArray<PushArgumentInstr*>(node->arguments()->length());
BuildPushArguments(*node->arguments(), arguments);
@@ -1540,7 +1527,7 @@ void EffectGraphVisitor::VisitStaticCallNode(StaticCallNode* node) {
ClosureCallInstr* EffectGraphVisitor::BuildClosureCall(
ClosureCallNode* node) {
- InlineBailout("EffectGraphVisitor::BuildClosureCall");
+ InlineBailout("EffectGraphVisitor::BuildClosureCall (deopt)");
ValueGraphVisitor for_closure(owner(), temp_index());
node->closure()->Visit(&for_closure);
Append(for_closure);
@@ -1558,7 +1545,6 @@ ClosureCallInstr* EffectGraphVisitor::BuildClosureCall(
void EffectGraphVisitor::VisitClosureCallNode(ClosureCallNode* node) {
- InlineBailout("EffectGraphVisitor::VisitClosureCallNode");
Do(BuildClosureCall(node));
// Restore context from saved location.
BuildLoadContext(*owner()->parsed_function().expression_temp_var());
@@ -1566,7 +1552,6 @@ void EffectGraphVisitor::VisitClosureCallNode(ClosureCallNode* node) {
void ValueGraphVisitor::VisitClosureCallNode(ClosureCallNode* node) {
- InlineBailout("ValueGraphVisitor::VisitClosureCallNode");
Value* result = Bind(BuildClosureCall(node));
// Restore context from temp.
BuildLoadContext(*owner()->parsed_function().expression_temp_var());
@@ -1575,7 +1560,7 @@ void ValueGraphVisitor::VisitClosureCallNode(ClosureCallNode* node) {
void EffectGraphVisitor::VisitCloneContextNode(CloneContextNode* node) {
- InlineBailout("EffectGraphVisitor::VisitCloneContextNode");
+ InlineBailout("EffectGraphVisitor::VisitCloneContextNode (deopt)");
Value* context = Bind(new CurrentContextInstr());
Value* clone = Bind(new CloneContextInstr(node->token_pos(), context));
ReturnDefinition(new StoreContextInstr(clone));
@@ -1584,7 +1569,6 @@ void EffectGraphVisitor::VisitCloneContextNode(CloneContextNode* node) {
Value* EffectGraphVisitor::BuildObjectAllocation(
ConstructorCallNode* node) {
- InlineBailout("EffectGraphVisitor::BuildObjectAllocation");
const Class& cls = Class::ZoneHandle(node->constructor().Owner());
const bool requires_type_arguments = cls.HasTypeArguments();
@@ -1607,6 +1591,7 @@ Value* EffectGraphVisitor::BuildObjectAllocation(
// Although the type arguments may be uninstantiated at compile time, they
// may represent the identity vector and may be replaced by the instantiated
// type arguments of the instantiator at run time.
+ InlineBailout("EffectGraphVisitor::BuildObjectAllocation (deopt)");
allocate_comp = new AllocateObjectWithBoundsCheckInstr(node,
type_arguments,
instantiator);
@@ -1627,7 +1612,7 @@ Value* EffectGraphVisitor::BuildObjectAllocation(
void EffectGraphVisitor::BuildConstructorCall(
ConstructorCallNode* node,
PushArgumentInstr* push_alloc_value) {
- InlineBailout("EffectGraphVisitor::BuildConstructorCall");
+ InlineBailout("EffectGraphVisitor::BuildConstructorCall (deopt)");
Value* ctor_arg = Bind(
new ConstantInstr(Smi::ZoneHandle(Smi::New(Function::kCtorPhaseAll))));
PushArgumentInstr* push_ctor_arg = PushArgument(ctor_arg);
@@ -1646,8 +1631,8 @@ void EffectGraphVisitor::BuildConstructorCall(
void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
- InlineBailout("EffectGraphVisitor::VisitConstructorCallNode");
if (node->constructor().IsFactory()) {
+ InlineBailout("EffectGraphVisitor::VisitConstructorCallNode (deopt)");
ZoneGrowableArray<PushArgumentInstr*>* arguments =
new ZoneGrowableArray<PushArgumentInstr*>();
PushArgumentInstr* push_type_arguments = PushArgument(
@@ -1677,7 +1662,6 @@ void EffectGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
Value* EffectGraphVisitor::BuildInstantiator() {
- InlineBailout("EffectGraphVisitor::BuildInstantiator");
const Class& instantiator_class = Class::Handle(
owner()->parsed_function().function().Owner());
if (instantiator_class.NumTypeParameters() == 0) {
@@ -1704,7 +1688,6 @@ Value* EffectGraphVisitor::BuildInstantiator() {
// is not NULL.
Value* EffectGraphVisitor::BuildInstantiatorTypeArguments(
intptr_t token_pos, Value* instantiator) {
- InlineBailout("EffectGraphVisitor::BuildInstantiatorTypeArguments");
const Class& instantiator_class = Class::Handle(
owner()->parsed_function().function().Owner());
if (instantiator_class.NumTypeParameters() == 0) {
@@ -1745,6 +1728,7 @@ Value* EffectGraphVisitor::BuildInstantiatorTypeArguments(
instantiator_class.type_arguments_instance_field_offset();
ASSERT(type_arguments_instance_field_offset != Class::kNoTypeArguments);
+ InlineBailout("EffectGraphVisitor::BuildInstantiatorTypeArguments (deopt)");
return Bind(new LoadVMFieldInstr(
instantiator,
type_arguments_instance_field_offset,
@@ -1755,10 +1739,10 @@ Value* EffectGraphVisitor::BuildInstantiatorTypeArguments(
Value* EffectGraphVisitor::BuildInstantiatedTypeArguments(
intptr_t token_pos,
const AbstractTypeArguments& type_arguments) {
- InlineBailout("EffectGraphVisitor::BuildInstantiatedTypeArguments");
if (type_arguments.IsNull() || type_arguments.IsInstantiated()) {
return Bind(new ConstantInstr(type_arguments));
}
+ InlineBailout("EffectGraphVisitor::BuildInstantiatedTypeArguments (deopt)");
// The type arguments are uninstantiated.
Value* instantiator_value =
BuildInstantiatorTypeArguments(token_pos, NULL);
@@ -1773,7 +1757,6 @@ void EffectGraphVisitor::BuildConstructorTypeArguments(
Value** type_arguments,
Value** instantiator,
ZoneGrowableArray<PushArgumentInstr*>* call_arguments) {
- InlineBailout("EffectGraphVisitor::BuildConstructorTypeArguments");
const Class& cls = Class::ZoneHandle(node->constructor().Owner());
ASSERT(cls.HasTypeArguments() && !node->constructor().IsFactory());
if (node->type_arguments().IsNull() ||
@@ -1852,7 +1835,6 @@ void EffectGraphVisitor::BuildConstructorTypeArguments(
void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
- InlineBailout("ValueGraphVisitor::VisitConstructorCallNode");
if (node->constructor().IsFactory()) {
EffectGraphVisitor::VisitConstructorCallNode(node);
return;
@@ -1881,7 +1863,7 @@ void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) {
void EffectGraphVisitor::VisitInstanceGetterNode(InstanceGetterNode* node) {
- InlineBailout("EffectGraphVisitor::VisitConstructorCallNode");
+ InlineBailout("EffectGraphVisitor::VisitInstanceGetterNode (deopt)");
ValueGraphVisitor for_receiver(owner(), temp_index());
node->receiver()->Visit(&for_receiver);
Append(for_receiver);
@@ -1902,7 +1884,6 @@ void EffectGraphVisitor::BuildInstanceSetterArguments(
InstanceSetterNode* node,
ZoneGrowableArray<PushArgumentInstr*>* arguments,
bool result_is_needed) {
- InlineBailout("EffectGraphVisitor::BuildInstanceSetterArguments");
ValueGraphVisitor for_receiver(owner(), temp_index());
node->receiver()->Visit(&for_receiver);
Append(for_receiver);
@@ -1925,7 +1906,7 @@ void EffectGraphVisitor::BuildInstanceSetterArguments(
void EffectGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
- InlineBailout("EffectGraphVisitor::VisitInstanceSetterNode");
+ InlineBailout("EffectGraphVisitor::VisitInstanceSetterNode (deopt)");
ZoneGrowableArray<PushArgumentInstr*>* arguments =
new ZoneGrowableArray<PushArgumentInstr*>(2);
BuildInstanceSetterArguments(node, arguments, false); // Value not used.
@@ -1942,7 +1923,7 @@ void EffectGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
void ValueGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
- InlineBailout("ValueGraphVisitor::VisitInstanceSetterNode");
+ InlineBailout("ValueGraphVisitor::VisitInstanceSetterNode (deopt)");
ZoneGrowableArray<PushArgumentInstr*>* arguments =
new ZoneGrowableArray<PushArgumentInstr*>(2);
BuildInstanceSetterArguments(node, arguments, true); // Value used.
@@ -1960,7 +1941,7 @@ void ValueGraphVisitor::VisitInstanceSetterNode(InstanceSetterNode* node) {
void EffectGraphVisitor::VisitStaticGetterNode(StaticGetterNode* node) {
- InlineBailout("EffectGraphVisitor::VisitStaticGetterNode");
+ InlineBailout("EffectGraphVisitor::VisitStaticGetterNode (deopt)");
const String& getter_name =
String::Handle(Field::GetterName(node->field_name()));
ZoneGrowableArray<PushArgumentInstr*>* arguments =
@@ -1990,7 +1971,7 @@ void EffectGraphVisitor::VisitStaticGetterNode(StaticGetterNode* node) {
void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
bool result_is_needed) {
- InlineBailout("EffectGraphVisitor::BuildStaticSetter");
+ InlineBailout("EffectGraphVisitor::VisitStaticSetter (deopt)");
const String& setter_name =
String::Handle(Field::SetterName(node->field_name()));
// A super setter is an instance setter whose setter function is
@@ -2040,13 +2021,11 @@ void EffectGraphVisitor::BuildStaticSetter(StaticSetterNode* node,
void EffectGraphVisitor::VisitStaticSetterNode(StaticSetterNode* node) {
- InlineBailout("EffectGraphVisitor::VisitStaticSetterNode");
BuildStaticSetter(node, false); // Result not needed.
}
void ValueGraphVisitor::VisitStaticSetterNode(StaticSetterNode* node) {
- InlineBailout("ValueGraphVisitor::VisitStaticSetterNode");
BuildStaticSetter(node, true); // Result needed.
}
@@ -2059,7 +2038,6 @@ void EffectGraphVisitor::VisitNativeBodyNode(NativeBodyNode* node) {
void EffectGraphVisitor::VisitPrimaryNode(PrimaryNode* node) {
- InlineBailout("EffectGraphVisitor::VisitPrimaryNode");
// PrimaryNodes are temporary during parsing.
UNREACHABLE();
}
@@ -2067,7 +2045,6 @@ void EffectGraphVisitor::VisitPrimaryNode(PrimaryNode* node) {
// <Expression> ::= LoadLocal { local: LocalVariable }
void EffectGraphVisitor::VisitLoadLocalNode(LoadLocalNode* node) {
- InlineBailout("EffectGraphVisitor::VisitLoadLocalNode");
if (node->HasPseudo()) {
EffectGraphVisitor for_pseudo(owner(), temp_index());
node->pseudo()->Visit(&for_pseudo);
@@ -2077,7 +2054,6 @@ void EffectGraphVisitor::VisitLoadLocalNode(LoadLocalNode* node) {
void ValueGraphVisitor::VisitLoadLocalNode(LoadLocalNode* node) {
- InlineBailout("ValueGraphVisitor::VisitLoadLocalNode");
EffectGraphVisitor::VisitLoadLocalNode(node);
Definition* load = BuildLoadLocal(node->local());
ReturnDefinition(load);
@@ -2087,7 +2063,6 @@ void ValueGraphVisitor::VisitLoadLocalNode(LoadLocalNode* node) {
// <Expression> ::= StoreLocal { local: LocalVariable
// value: <Expression> }
void EffectGraphVisitor::VisitStoreLocalNode(StoreLocalNode* node) {
- InlineBailout("EffectGraphVisitor::VisitStoreLocalNode");
ValueGraphVisitor for_value(owner(), temp_index());
node->value()->Visit(&for_value);
Append(for_value);
@@ -2105,7 +2080,6 @@ void EffectGraphVisitor::VisitStoreLocalNode(StoreLocalNode* node) {
void EffectGraphVisitor::VisitLoadInstanceFieldNode(
LoadInstanceFieldNode* node) {
- InlineBailout("EffectGraphVisitor::VisitLoadInstanceFieldNode");
ValueGraphVisitor for_instance(owner(), temp_index());
node->instance()->Visit(&for_instance);
Append(for_instance);
@@ -2117,7 +2091,6 @@ void EffectGraphVisitor::VisitLoadInstanceFieldNode(
void EffectGraphVisitor::VisitStoreInstanceFieldNode(
StoreInstanceFieldNode* node) {
- InlineBailout("EffectGraphVisitor::VisitStoreInstanceFieldNode");
ValueGraphVisitor for_instance(owner(), temp_index());
node->instance()->Visit(&for_instance);
Append(for_instance);
@@ -2142,20 +2115,17 @@ void EffectGraphVisitor::VisitStoreInstanceFieldNode(
// StoreInstanceFieldNode does not return result.
void ValueGraphVisitor::VisitStoreInstanceFieldNode(
StoreInstanceFieldNode* node) {
- InlineBailout("ValueGraphVisitor::VisitStoreInstanceFieldNode");
UNIMPLEMENTED();
}
void EffectGraphVisitor::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) {
- InlineBailout("EffectGraphVisitor::VisitLoadStaticFieldNode");
LoadStaticFieldInstr* load = new LoadStaticFieldInstr(node->field());
ReturnDefinition(load);
}
void EffectGraphVisitor::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
- InlineBailout("EffectGraphVisitor::VisitStoreStaticFieldNode");
ValueGraphVisitor for_value(owner(), temp_index());
node->value()->Visit(&for_value);
Append(for_value);
@@ -2175,7 +2145,7 @@ void EffectGraphVisitor::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
void EffectGraphVisitor::VisitLoadIndexedNode(LoadIndexedNode* node) {
- InlineBailout("EffectGraphVisitor::VisitLoadIndexedNode");
+ InlineBailout("EffectGraphVisitor::VisitLoadIndexedNode (deopt)");
ZoneGrowableArray<PushArgumentInstr*>* arguments =
new ZoneGrowableArray<PushArgumentInstr*>(2);
ValueGraphVisitor for_array(owner(), temp_index());
@@ -2204,7 +2174,7 @@ void EffectGraphVisitor::VisitLoadIndexedNode(LoadIndexedNode* node) {
Definition* EffectGraphVisitor::BuildStoreIndexedValues(
StoreIndexedNode* node,
bool result_is_needed) {
- InlineBailout("EffectGraphVisitor::BuildStoreIndexedValues");
+ InlineBailout("EffectGraphVisitor::BuildStoreIndexedValues (deopt)");
ZoneGrowableArray<PushArgumentInstr*>* arguments =
new ZoneGrowableArray<PushArgumentInstr*>(3);
ValueGraphVisitor for_array(owner(), temp_index());
@@ -2249,14 +2219,12 @@ Definition* EffectGraphVisitor::BuildStoreIndexedValues(
void EffectGraphVisitor::VisitStoreIndexedNode(StoreIndexedNode* node) {
- InlineBailout("EffectGraphVisitor::VisitStoreIndexedNode");
ReturnDefinition(BuildStoreIndexedValues(node,
false)); // Result not needed.
}
void ValueGraphVisitor::VisitStoreIndexedNode(StoreIndexedNode* node) {
- InlineBailout("ValueGraphVisitor::VisitStoreIndexedNode");
ReturnDefinition(BuildStoreIndexedValues(node,
true)); // Result is needed.
}
@@ -2269,7 +2237,7 @@ bool EffectGraphVisitor::MustSaveRestoreContext(SequenceNode* node) const {
void EffectGraphVisitor::UnchainContext() {
- InlineBailout("EffectGraphVisitor::UnchainContext");
+ InlineBailout("EffectGraphVisitor::UnchainContext (deopt)");
Value* context = Bind(new CurrentContextInstr());
Value* parent = Bind(
new LoadVMFieldInstr(context,
@@ -2288,7 +2256,7 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
(scope != NULL) ? scope->num_context_variables() : 0;
int previous_context_level = owner()->context_level();
if (num_context_variables > 0) {
- InlineBailout("EffectGraphVisitor::VisitSequenceNode (captured vars)");
+ InlineBailout("EffectGraphVisitor::VisitSequenceNode (deopt)");
// The loop local scope declares variables that are captured.
// Allocate and chain a new context.
// Allocate context computation (uses current CTX)
@@ -2353,7 +2321,6 @@ void EffectGraphVisitor::VisitSequenceNode(SequenceNode* node) {
if (FLAG_enable_type_checks &&
(node == owner()->parsed_function().node_sequence())) {
- InlineBailout("EffectGraphVisitor::VisitSequenceNode (type check)");
const Function& function = owner()->parsed_function().function();
const int num_params = function.NumberOfParameters();
int pos = 0;
@@ -2499,7 +2466,6 @@ void EffectGraphVisitor::VisitTryCatchNode(TryCatchNode* node) {
void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) {
- InlineBailout("EffectGraphVisitor::BuildThrowNode");
ValueGraphVisitor for_exception(owner(), temp_index());
node->exception()->Visit(&for_exception);
Append(for_exception);
@@ -2519,7 +2485,6 @@ void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) {
void EffectGraphVisitor::VisitThrowNode(ThrowNode* node) {
- InlineBailout("EffectGraphVisitor::VisitThrowNode");
BuildThrowNode(node);
CloseFragment();
}
@@ -2529,7 +2494,6 @@ void EffectGraphVisitor::VisitThrowNode(ThrowNode* node) {
// certain expression nodes with a throw. In that case generate a literal null
// so that the fragment is not closed in the middle of an expression.
void ValueGraphVisitor::VisitThrowNode(ThrowNode* node) {
- InlineBailout("ValueGraphVisitor::VisitThrowNode");
BuildThrowNode(node);
ReturnDefinition(new ConstantInstr(Instance::ZoneHandle()));
}
@@ -2566,11 +2530,15 @@ void EffectGraphVisitor::VisitInlinedFinallyNode(InlinedFinallyNode* node) {
}
-FlowGraph* FlowGraphBuilder::BuildGraph() {
+FlowGraph* FlowGraphBuilder::BuildGraph(InliningContext context) {
if (FLAG_print_ast) {
// Print the function ast before IL generation.
AstPrinter::PrintFunctionNodes(parsed_function());
}
+ // Set the inlining context.
+ ASSERT(inlining_context_ == kNotInlining);
+ inlining_context_ = context;
+ if (InInliningContext()) exits_ = new ZoneGrowableArray<ReturnInstr*>();
// Compilation can be nested, preserve the computation-id.
const Function& function = parsed_function().function();
TargetEntryInstr* normal_entry = new TargetEntryInstr(
@@ -2584,23 +2552,8 @@ FlowGraph* FlowGraphBuilder::BuildGraph() {
AppendFragment(normal_entry, for_effect);
// Check that the graph is properly terminated.
ASSERT(!for_effect.is_open());
- return new FlowGraph(*this, graph_entry_);
-}
-
-
-FlowGraph* FlowGraphBuilder::BuildGraphForInlining(InliningContext context) {
- ASSERT(inlining_context_ == kNotInlining);
- inlining_context_ = context;
- exits_ = new ZoneGrowableArray<ReturnInstr*>();
- TargetEntryInstr* normal_entry = new TargetEntryInstr(
- CatchClauseNode::kInvalidTryIndex);
- graph_entry_ = new GraphEntryInstr(normal_entry);
- EffectGraphVisitor for_effect(this, 0);
- parsed_function().node_sequence()->Visit(&for_effect);
- AppendFragment(normal_entry, for_effect);
- ASSERT(!for_effect.is_open());
FlowGraph* graph = new FlowGraph(*this, graph_entry_);
- graph->set_exits(exits_);
+ if (InInliningContext()) graph->set_exits(exits_);
return graph;
}
« no previous file with comments | « runtime/vm/flow_graph_builder.h ('k') | runtime/vm/flow_graph_inliner.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698