Commit 4ec5bb4f authored by Leszek Swirski's avatar Leszek Swirski Committed by V8 LUCI CQ

[maglev] Fix JumpLoop to the current basic block

Drive-by improve some tracing too.

Bug: v8:7700
Change-Id: I52546a19c15ad1a6bbac1b15cdf8fba33dab1cb7
Fixed: chromium:1361345
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3886873
Commit-Queue: Leszek Swirski <leszeks@chromium.org>
Reviewed-by: 's avatarVictor Gomes <victorgomes@chromium.org>
Auto-Submit: Leszek Swirski <leszeks@chromium.org>
Cr-Commit-Position: refs/heads/main@{#83116}
parent 0a1f0e33
...@@ -76,6 +76,10 @@ MaglevGraphBuilder::MaglevGraphBuilder(LocalIsolate* local_isolate, ...@@ -76,6 +76,10 @@ MaglevGraphBuilder::MaglevGraphBuilder(LocalIsolate* local_isolate,
int offset = offset_and_info.first; int offset = offset_and_info.first;
const compiler::LoopInfo& loop_info = offset_and_info.second; const compiler::LoopInfo& loop_info = offset_and_info.second;
const compiler::BytecodeLivenessState* liveness = GetInLivenessFor(offset); const compiler::BytecodeLivenessState* liveness = GetInLivenessFor(offset);
DCHECK_NULL(merge_states_[offset]);
if (FLAG_trace_maglev_graph_building) {
std::cout << "- Creating loop merge state at @" << offset << std::endl;
}
merge_states_[offset] = MergePointInterpreterFrameState::NewForLoop( merge_states_[offset] = MergePointInterpreterFrameState::NewForLoop(
*compilation_unit_, offset, NumPredecessors(offset), liveness, *compilation_unit_, offset, NumPredecessors(offset), liveness,
&loop_info); &loop_info);
...@@ -88,6 +92,11 @@ MaglevGraphBuilder::MaglevGraphBuilder(LocalIsolate* local_isolate, ...@@ -88,6 +92,11 @@ MaglevGraphBuilder::MaglevGraphBuilder(LocalIsolate* local_isolate,
const compiler::BytecodeLivenessState* liveness = const compiler::BytecodeLivenessState* liveness =
GetInLivenessFor(offset); GetInLivenessFor(offset);
DCHECK_EQ(NumPredecessors(offset), 0); DCHECK_EQ(NumPredecessors(offset), 0);
DCHECK_NULL(merge_states_[offset]);
if (FLAG_trace_maglev_graph_building) {
std::cout << "- Creating exception merge state at @" << offset
<< std::endl;
}
merge_states_[offset] = MergePointInterpreterFrameState::NewForCatchBlock( merge_states_[offset] = MergePointInterpreterFrameState::NewForCatchBlock(
*compilation_unit_, liveness, offset); *compilation_unit_, liveness, offset);
} }
...@@ -2503,7 +2512,7 @@ void MaglevGraphBuilder::VisitJumpLoop() { ...@@ -2503,7 +2512,7 @@ void MaglevGraphBuilder::VisitJumpLoop() {
BytecodeOffset(iterator_.current_offset()), BytecodeOffset(iterator_.current_offset()),
compilation_unit_); compilation_unit_);
BasicBlock* block = BasicBlock* block =
target == iterator_.current_offset() target == block_offset_
? FinishBlock<JumpLoop>(next_offset(), {}, &jump_targets_[target]) ? FinishBlock<JumpLoop>(next_offset(), {}, &jump_targets_[target])
: FinishBlock<JumpLoop>(next_offset(), {}, : FinishBlock<JumpLoop>(next_offset(), {},
jump_targets_[target].block_ptr()); jump_targets_[target].block_ptr());
...@@ -2573,6 +2582,9 @@ void MaglevGraphBuilder::MergeDeadIntoFrameState(int target) { ...@@ -2573,6 +2582,9 @@ void MaglevGraphBuilder::MergeDeadIntoFrameState(int target) {
// If this merge is the last one which kills a loop merge, remove that // If this merge is the last one which kills a loop merge, remove that
// merge state. // merge state.
if (merge_states_[target]->is_unreachable_loop()) { if (merge_states_[target]->is_unreachable_loop()) {
if (FLAG_trace_maglev_graph_building) {
std::cout << "! Killing loop merge state at @" << target << std::endl;
}
merge_states_[target] = nullptr; merge_states_[target] = nullptr;
} }
} }
......
...@@ -112,10 +112,11 @@ class MaglevGraphBuilder { ...@@ -112,10 +112,11 @@ class MaglevGraphBuilder {
// Set up edge-split. // Set up edge-split.
int predecessor_index = merge_state.predecessor_count() - 1; int predecessor_index = merge_state.predecessor_count() - 1;
if (merge_state.is_unmerged_loop()) { if (merge_state.is_loop()) {
// For loops, the JumpLoop block hasn't been generated yet, and so isn't // For loops, the JumpLoop block hasn't been generated yet, and so isn't
// in the list of jump targets. IT's the last predecessor, so drop the // in the list of jump targets. IT's the last predecessor, so drop the
// index by one. // index by one.
DCHECK(merge_state.is_unmerged_loop());
predecessor_index--; predecessor_index--;
} }
BasicBlockRef* old_jump_targets = jump_targets_[offset].Reset(); BasicBlockRef* old_jump_targets = jump_targets_[offset].Reset();
...@@ -244,8 +245,9 @@ class MaglevGraphBuilder { ...@@ -244,8 +245,9 @@ class MaglevGraphBuilder {
graph()->last_block(), offset); graph()->last_block(), offset);
} }
if (FLAG_trace_maglev_graph_building) { if (FLAG_trace_maglev_graph_building) {
auto detail = auto detail = merge_state->is_exception_handler() ? "exception handler"
merge_state->is_exception_handler() ? "exception handler" : "merge"; : merge_state->is_loop() ? "loop header"
: "merge";
std::cout << "== New block (" << detail << ") ==" << std::endl; std::cout << "== New block (" << detail << ") ==" << std::endl;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment