Revision: 12284
Author: [email protected]
Date: Thu Aug 9 04:44:56 2012
Log: Use the correct oracle in TestContext::BuildBranch.
When inlining is being done, it is crucial to use the correct type feedback
oracle with a given type feedback ID. To ensure this, TestContext now
carries an
oracle which is associated with the context's condition, and these are both
used
together in TestContext::BuildBranch.
Note that in VisitReturnStatement and TryInline we are currently lucky that
the
oracles don't go out of sync in an observable way, but this will change
when we
inline setters. Therefore, there is no separate test case...
Review URL: https://chromiumcodereview.appspot.com/10834247
http://code.google.com/p/v8/source/detail?r=12284
Modified:
/branches/bleeding_edge/src/hydrogen.cc
/branches/bleeding_edge/src/hydrogen.h
=======================================
--- /branches/bleeding_edge/src/hydrogen.cc Tue Aug 7 07:06:25 2012
+++ /branches/bleeding_edge/src/hydrogen.cc Thu Aug 9 04:44:56 2012
@@ -2769,10 +2769,13 @@
HBasicBlock* if_false = owner->graph()->CreateBasicBlock();
if_true->MarkAsInlineReturnTarget();
if_false->MarkAsInlineReturnTarget();
- Expression* cond =
TestContext::cast(owner->ast_context())->condition();
+ TestContext* outer_test_context =
TestContext::cast(owner->ast_context());
+ Expression* cond = outer_test_context->condition();
+ TypeFeedbackOracle* outer_oracle = outer_test_context->oracle();
// The AstContext constructor pushed on the context stack. This
newed
// instance is the reason that AstContext can't be BASE_EMBEDDED.
- test_context_ = new TestContext(owner, cond, if_true, if_false);
+ test_context_ =
+ new TestContext(owner, cond, outer_oracle, if_true, if_false);
} else {
function_return_ = owner->graph()->CreateBasicBlock();
function_return()->MarkAsInlineReturnTarget();
@@ -2939,7 +2942,7 @@
HBasicBlock* empty_true = builder->graph()->CreateBasicBlock();
HBasicBlock* empty_false = builder->graph()->CreateBasicBlock();
TypeFeedbackId test_id = condition()->test_id();
- ToBooleanStub::Types
expected(builder->oracle()->ToBooleanTypes(test_id));
+ ToBooleanStub::Types expected(oracle()->ToBooleanTypes(test_id));
HBranch* test = new(zone()) HBranch(value, empty_true, empty_false,
expected);
builder->current_block()->Finish(test);
@@ -2997,7 +3000,7 @@
void HGraphBuilder::VisitForControl(Expression* expr,
HBasicBlock* true_block,
HBasicBlock* false_block) {
- TestContext for_test(this, expr, true_block, false_block);
+ TestContext for_test(this, expr, oracle(), true_block, false_block);
Visit(expr);
}
=======================================
--- /branches/bleeding_edge/src/hydrogen.h Mon Aug 6 07:13:09 2012
+++ /branches/bleeding_edge/src/hydrogen.h Thu Aug 9 04:44:56 2012
@@ -671,10 +671,12 @@
public:
TestContext(HGraphBuilder* owner,
Expression* condition,
+ TypeFeedbackOracle* oracle,
HBasicBlock* if_true,
HBasicBlock* if_false)
: AstContext(owner, Expression::kTest),
condition_(condition),
+ oracle_(oracle),
if_true_(if_true),
if_false_(if_false) {
}
@@ -689,6 +691,7 @@
}
Expression* condition() const { return condition_; }
+ TypeFeedbackOracle* oracle() const { return oracle_; }
HBasicBlock* if_true() const { return if_true_; }
HBasicBlock* if_false() const { return if_false_; }
@@ -698,6 +701,7 @@
void BuildBranch(HValue* value);
Expression* condition_;
+ TypeFeedbackOracle* oracle_;
HBasicBlock* if_true_;
HBasicBlock* if_false_;
};
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev