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

Unified Diff: src/crankshaft/hydrogen.cc

Issue 2451853002: Uniform and precise source positions for inlining (Closed)
Patch Set: fixed gcmole issue Created 4 years, 1 month 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/crankshaft/hydrogen.h ('k') | src/crankshaft/hydrogen-instructions.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/crankshaft/hydrogen.cc
diff --git a/src/crankshaft/hydrogen.cc b/src/crankshaft/hydrogen.cc
index 0f7ec72b99d5e6bdfd992a372513b9c4a41ed21e..ad320b5c0e941275c5ba385b48bdbf7bee46bd16 100644
--- a/src/crankshaft/hydrogen.cc
+++ b/src/crankshaft/hydrogen.cc
@@ -86,7 +86,7 @@ class HOptimizedGraphBuilderWithPositions : public HOptimizedGraphBuilder {
SetSourcePosition(node->position()); \
} \
HOptimizedGraphBuilder::Visit##type(node); \
- if (!old_position.IsUnknown()) { \
+ if (old_position.IsKnown()) { \
set_source_position(old_position); \
} \
}
@@ -101,7 +101,7 @@ class HOptimizedGraphBuilderWithPositions : public HOptimizedGraphBuilder {
SetSourcePosition(node->position()); \
} \
HOptimizedGraphBuilder::Visit##type(node); \
- if (!old_position.IsUnknown()) { \
+ if (old_position.IsKnown()) { \
set_source_position(old_position); \
} \
}
@@ -312,7 +312,7 @@ void HBasicBlock::AddInstruction(HInstruction* instr, SourcePosition position) {
DCHECK(!instr->IsLinked());
DCHECK(!IsFinished());
- if (!position.IsUnknown()) {
+ if (position.IsKnown()) {
instr->set_position(position);
}
if (first_ == NULL) {
@@ -320,7 +320,7 @@ void HBasicBlock::AddInstruction(HInstruction* instr, SourcePosition position) {
DCHECK(!last_environment()->ast_id().IsNone());
HBlockEntry* entry = new(zone()) HBlockEntry();
entry->InitializeAsFirst(this);
- if (!position.IsUnknown()) {
+ if (position.IsKnown()) {
entry->set_position(position);
} else {
DCHECK(!FLAG_hydrogen_track_positions ||
@@ -1364,7 +1364,8 @@ HGraph* HGraphBuilder::CreateGraph() {
graph_ = new (zone()) HGraph(info_, descriptor_);
if (FLAG_hydrogen_stats) isolate()->GetHStatistics()->Initialize(info_);
if (!info_->IsStub() && is_tracking_positions()) {
- TraceInlinedFunction(info_->shared_info(), SourcePosition::Unknown());
+ TraceInlinedFunction(info_->shared_info(), SourcePosition::Unknown(),
+ SourcePosition::kNotInlined);
}
CompilationPhase phase("H_Block building", info_);
set_current_block(graph()->entry_block());
@@ -1373,12 +1374,11 @@ HGraph* HGraphBuilder::CreateGraph() {
return graph_;
}
-int HGraphBuilder::TraceInlinedFunction(Handle<SharedFunctionInfo> shared,
- SourcePosition position) {
+void HGraphBuilder::TraceInlinedFunction(Handle<SharedFunctionInfo> shared,
+ SourcePosition position,
+ int inlining_id) {
DCHECK(is_tracking_positions());
- int inline_id = static_cast<int>(graph()->inlined_function_infos().size());
- HInlinedFunctionInfo info(shared->start_position());
if (!shared->script()->IsUndefined(isolate())) {
Handle<Script> script(Script::cast(shared->script()), isolate());
@@ -1392,7 +1392,7 @@ int HGraphBuilder::TraceInlinedFunction(Handle<SharedFunctionInfo> shared,
os << String::cast(source_name)->ToCString().get() << ":";
}
os << shared->DebugName()->ToCString().get() << ") id{";
- os << info_->optimization_id() << "," << inline_id << "} ---\n";
+ os << info_->optimization_id() << "," << inlining_id << "} ---\n";
{
DisallowHeapAllocation no_allocation;
int start = shared->start_position();
@@ -1408,23 +1408,19 @@ int HGraphBuilder::TraceInlinedFunction(Handle<SharedFunctionInfo> shared,
}
}
- graph()->inlined_function_infos().push_back(info);
-
- if (FLAG_hydrogen_track_positions && inline_id != 0) {
+ if (FLAG_hydrogen_track_positions &&
+ inlining_id != SourcePosition::kNotInlined) {
CodeTracer::Scope tracing_scope(isolate()->GetCodeTracer());
OFStream os(tracing_scope.file());
os << "INLINE (" << shared->DebugName()->ToCString().get() << ") id{"
- << info_->optimization_id() << "," << inline_id << "} AS " << inline_id
- << " AT " << position << std::endl;
+ << info_->optimization_id() << "," << inlining_id << "} AS "
+ << inlining_id << " AT " << position.ScriptOffset() << std::endl;
}
-
- return inline_id;
}
HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) {
DCHECK(current_block() != NULL);
- DCHECK(!FLAG_hydrogen_track_positions ||
- !position_.IsUnknown() ||
+ DCHECK(!FLAG_hydrogen_track_positions || position_.IsKnown() ||
!info_->IsOptimizing());
current_block()->AddInstruction(instr, source_position());
if (graph()->IsInsideNoSideEffectsScope()) {
@@ -1435,9 +1431,8 @@ HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) {
void HGraphBuilder::FinishCurrentBlock(HControlInstruction* last) {
- DCHECK(!FLAG_hydrogen_track_positions ||
- !info_->IsOptimizing() ||
- !position_.IsUnknown());
+ DCHECK(!FLAG_hydrogen_track_positions || !info_->IsOptimizing() ||
+ position_.IsKnown());
current_block()->Finish(last, source_position());
if (last->IsReturn() || last->IsAbnormalExit()) {
set_current_block(NULL);
@@ -1447,7 +1442,7 @@ void HGraphBuilder::FinishCurrentBlock(HControlInstruction* last) {
void HGraphBuilder::FinishExitCurrentBlock(HControlInstruction* instruction) {
DCHECK(!FLAG_hydrogen_track_positions || !info_->IsOptimizing() ||
- !position_.IsUnknown());
+ position_.IsKnown());
current_block()->FinishExit(instruction, source_position());
if (instruction->IsReturn() || instruction->IsAbnormalExit()) {
set_current_block(NULL);
@@ -3126,7 +3121,7 @@ HOptimizedGraphBuilder::HOptimizedGraphBuilder(CompilationInfo* info,
bool track_positions)
: HGraphBuilder(info, CallInterfaceDescriptor(), track_positions),
function_state_(NULL),
- initial_function_state_(this, info, NORMAL_RETURN, 0,
+ initial_function_state_(this, info, NORMAL_RETURN, -1,
TailCallMode::kAllow),
ast_context_(NULL),
break_scope_(NULL),
@@ -3242,8 +3237,7 @@ HGraph::HGraph(CompilationInfo* info, CallInterfaceDescriptor descriptor)
type_change_checksum_(0),
maximum_environment_size_(0),
no_side_effects_scope_count_(0),
- disallow_adding_new_values_(false),
- inlined_function_infos_(info->zone()) {
+ disallow_adding_new_values_(false) {
if (info->IsStub()) {
// For stubs, explicitly add the context to the environment.
start_environment_ =
@@ -3275,14 +3269,6 @@ void HGraph::FinalizeUniqueness() {
}
-int HGraph::SourcePositionToScriptPosition(SourcePosition pos) {
- return (FLAG_hydrogen_track_positions && !pos.IsUnknown())
- ? inlined_function_infos_.at(pos.inlining_id()).start_position +
- pos.position()
- : pos.raw();
-}
-
-
// Block ordering was implemented with two mutually recursive methods,
// HGraph::Postorder and HGraph::PostorderLoopBlocks.
// The recursion could lead to stack overflow so the algorithm has been
@@ -3707,9 +3693,7 @@ FunctionState::FunctionState(HOptimizedGraphBuilder* owner,
if (owner->is_tracking_positions()) {
outer_source_position_ = owner->source_position();
- owner->EnterInlinedSource(
- info->shared_info()->start_position(),
- inlining_id);
+ owner->EnterInlinedSource(inlining_id);
owner->SetSourcePosition(info->shared_info()->start_position());
}
}
@@ -3721,9 +3705,7 @@ FunctionState::~FunctionState() {
if (owner_->is_tracking_positions()) {
owner_->set_source_position(outer_source_position_);
- owner_->EnterInlinedSource(
- outer_->compilation_info()->shared_info()->start_position(),
- outer_->inlining_id());
+ owner_->EnterInlinedSource(outer_->inlining_id());
}
}
@@ -8162,7 +8144,8 @@ bool HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target,
// Remember that we inlined this function. This needs to be called right
// after the EnsureDeoptimizationSupport call so that the code flusher
// does not remove the code with the deoptimization support.
- top_info()->AddInlinedFunction(target_info.shared_info());
+ int inlining_id = top_info()->AddInlinedFunction(target_info.shared_info(),
+ source_position());
// ----------------------------------------------------------------
// After this point, we've made a decision to inline this function (so
@@ -8178,9 +8161,8 @@ bool HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target,
&bounds_)
.Run();
- int inlining_id = 0;
if (is_tracking_positions()) {
- inlining_id = TraceInlinedFunction(target_shared, source_position());
+ TraceInlinedFunction(target_shared, source_position(), inlining_id);
}
// Save the pending call context. Set up new one for the inlined function.
@@ -8231,6 +8213,7 @@ bool HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target,
if (is_tracking_positions()) {
enter_inlined->set_inlining_id(inlining_id);
}
+
function_state()->set_entry(enter_inlined);
VisitDeclarations(target_info.scope()->declarations());
@@ -11136,12 +11119,6 @@ void HOptimizedGraphBuilder::VisitArithmeticExpression(BinaryOperation* expr) {
BuildBinaryOperation(expr, left, right,
ast_context()->IsEffect() ? NO_PUSH_BEFORE_SIMULATE
: PUSH_BEFORE_SIMULATE);
- if (is_tracking_positions() && result->IsBinaryOperation()) {
- HBinaryOperation::cast(result)->SetOperandPositions(
- zone(),
- ScriptPositionToSourcePosition(expr->left()->position()),
- ScriptPositionToSourcePosition(expr->right()->position()));
- }
return ast_context()->ReturnValue(result);
}
@@ -11321,10 +11298,6 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
AddCheckMap(operand_to_check, map);
HCompareObjectEqAndBranch* result =
New<HCompareObjectEqAndBranch>(left, right);
- if (is_tracking_positions()) {
- result->set_operand_position(zone(), 0, left_position);
- result->set_operand_position(zone(), 1, right_position);
- }
return result;
} else {
BuildCheckHeapObject(operand_to_check);
@@ -11464,9 +11437,6 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
HCompareNumericAndBranch* result =
New<HCompareNumericAndBranch>(left, right, op);
result->set_observed_input_representation(left_rep, right_rep);
- if (is_tracking_positions()) {
- result->SetOperandPositions(zone(), left_position, right_position);
- }
return result;
}
}
@@ -12835,11 +12805,11 @@ void HTracer::Trace(const char* name, HGraph* graph, LChunk* chunk) {
PrintIndent();
std::ostringstream os;
os << "0 " << uses << " " << NameOf(instruction) << " " << *instruction;
- if (instruction->has_position() && instruction->position().raw() != 0) {
+ if (instruction->has_position()) {
const SourcePosition pos = instruction->position();
os << " pos:";
- if (pos.inlining_id() != 0) os << pos.inlining_id() << "_";
- os << pos.position();
+ if (pos.isInlined()) os << "inlining(" << pos.InliningId() << "),";
Vyacheslav Egorov (Google) 2016/12/12 21:19:46 This change has broken IRHydra (https://github.com
+ os << pos.ScriptOffset();
Vyacheslav Egorov (Google) 2016/12/12 21:19:47 Notice that previously this was offset since the b
}
os << " <|@\n";
trace_.Add(os.str().c_str());
« no previous file with comments | « src/crankshaft/hydrogen.h ('k') | src/crankshaft/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698