summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/bytecode-analysis.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/bytecode-analysis.cc')
-rw-r--r--deps/v8/src/compiler/bytecode-analysis.cc94
1 files changed, 52 insertions, 42 deletions
diff --git a/deps/v8/src/compiler/bytecode-analysis.cc b/deps/v8/src/compiler/bytecode-analysis.cc
index 9c23cd460a..b44bec5fc8 100644
--- a/deps/v8/src/compiler/bytecode-analysis.cc
+++ b/deps/v8/src/compiler/bytecode-analysis.cc
@@ -79,22 +79,28 @@ ResumeJumpTarget ResumeJumpTarget::AtLoopHeader(int loop_header_offset,
}
BytecodeAnalysis::BytecodeAnalysis(Handle<BytecodeArray> bytecode_array,
- Zone* zone, bool do_liveness_analysis)
+ Zone* zone, BailoutId osr_bailout_id,
+ bool analyze_liveness)
: bytecode_array_(bytecode_array),
- do_liveness_analysis_(do_liveness_analysis),
zone_(zone),
+ osr_bailout_id_(osr_bailout_id),
+ analyze_liveness_(analyze_liveness),
loop_stack_(zone),
loop_end_index_queue_(zone),
resume_jump_targets_(zone),
end_to_header_(zone),
header_to_info_(zone),
osr_entry_point_(-1),
- liveness_map_(bytecode_array->length(), zone) {}
+ liveness_map_(bytecode_array->length(), zone) {
+ Analyze();
+}
namespace {
-void UpdateInLiveness(Bytecode bytecode, BytecodeLivenessState& in_liveness,
- const interpreter::BytecodeArrayAccessor& accessor) {
+void UpdateInLiveness(
+ Bytecode bytecode,
+ BytecodeLivenessState& in_liveness, // NOLINT(runtime/references)
+ const interpreter::BytecodeArrayAccessor& accessor) {
int num_operands = Bytecodes::NumberOfOperands(bytecode);
const OperandType* operand_types = Bytecodes::GetOperandTypes(bytecode);
@@ -201,12 +207,14 @@ void UpdateInLiveness(Bytecode bytecode, BytecodeLivenessState& in_liveness,
}
}
-void UpdateOutLiveness(Bytecode bytecode, BytecodeLivenessState& out_liveness,
- BytecodeLivenessState* next_bytecode_in_liveness,
- const interpreter::BytecodeArrayAccessor& accessor,
- const BytecodeLivenessMap& liveness_map) {
+void UpdateOutLiveness(
+ Bytecode bytecode,
+ BytecodeLivenessState& out_liveness, // NOLINT(runtime/references)
+ BytecodeLivenessState* next_bytecode_in_liveness,
+ const interpreter::BytecodeArrayAccessor& accessor,
+ Handle<BytecodeArray> bytecode_array,
+ const BytecodeLivenessMap& liveness_map) {
int current_offset = accessor.current_offset();
- const Handle<BytecodeArray>& bytecode_array = accessor.bytecode_array();
// Special case Suspend and Resume to just pass through liveness.
if (bytecode == Bytecode::kSuspendGenerator ||
@@ -261,20 +269,24 @@ void UpdateOutLiveness(Bytecode bytecode, BytecodeLivenessState& out_liveness,
}
}
-void UpdateLiveness(Bytecode bytecode, BytecodeLiveness& liveness,
+void UpdateLiveness(Bytecode bytecode,
+ BytecodeLiveness& liveness, // NOLINT(runtime/references)
BytecodeLivenessState** next_bytecode_in_liveness,
const interpreter::BytecodeArrayAccessor& accessor,
+ Handle<BytecodeArray> bytecode_array,
const BytecodeLivenessMap& liveness_map) {
UpdateOutLiveness(bytecode, *liveness.out, *next_bytecode_in_liveness,
- accessor, liveness_map);
+ accessor, bytecode_array, liveness_map);
liveness.in->CopyFrom(*liveness.out);
UpdateInLiveness(bytecode, *liveness.in, accessor);
*next_bytecode_in_liveness = liveness.in;
}
-void UpdateAssignments(Bytecode bytecode, BytecodeLoopAssignments& assignments,
- const interpreter::BytecodeArrayAccessor& accessor) {
+void UpdateAssignments(
+ Bytecode bytecode,
+ BytecodeLoopAssignments& assignments, // NOLINT(runtime/references)
+ const interpreter::BytecodeArrayAccessor& accessor) {
int num_operands = Bytecodes::NumberOfOperands(bytecode);
const OperandType* operand_types = Bytecodes::GetOperandTypes(bytecode);
@@ -307,15 +319,13 @@ void UpdateAssignments(Bytecode bytecode, BytecodeLoopAssignments& assignments,
} // namespace
-void BytecodeAnalysis::Analyze(BailoutId osr_bailout_id) {
+void BytecodeAnalysis::Analyze() {
loop_stack_.push({-1, nullptr});
BytecodeLivenessState* next_bytecode_in_liveness = nullptr;
-
- bool is_osr = !osr_bailout_id.IsNone();
- int osr_loop_end_offset = is_osr ? osr_bailout_id.ToInt() : -1;
-
int generator_switch_index = -1;
+ int osr_loop_end_offset = osr_bailout_id_.ToInt();
+ DCHECK_EQ(osr_loop_end_offset < 0, osr_bailout_id_.IsNone());
interpreter::BytecodeArrayRandomIterator iterator(bytecode_array(), zone());
for (iterator.GoToEnd(); iterator.IsValid(); --iterator) {
@@ -337,14 +347,14 @@ void BytecodeAnalysis::Analyze(BailoutId osr_bailout_id) {
if (current_offset == osr_loop_end_offset) {
osr_entry_point_ = loop_header;
} else if (current_offset < osr_loop_end_offset) {
- // Check we've found the osr_entry_point if we've gone past the
+ // Assert that we've found the osr_entry_point if we've gone past the
// osr_loop_end_offset. Note, we are iterating the bytecode in reverse,
- // so the less than in the check is correct.
- DCHECK_NE(-1, osr_entry_point_);
+ // so the less-than in the above condition is correct.
+ DCHECK_LE(0, osr_entry_point_);
}
// Save the index so that we can do another pass later.
- if (do_liveness_analysis_) {
+ if (analyze_liveness_) {
loop_end_index_queue_.push_back(iterator.current_index());
}
} else if (loop_stack_.size() > 1) {
@@ -357,8 +367,8 @@ void BytecodeAnalysis::Analyze(BailoutId osr_bailout_id) {
// information we currently have.
UpdateAssignments(bytecode, current_loop_info->assignments(), iterator);
- // Update suspend counts for this loop, though only if not OSR.
- if (!is_osr && bytecode == Bytecode::kSuspendGenerator) {
+ // Update suspend counts for this loop.
+ if (bytecode == Bytecode::kSuspendGenerator) {
int suspend_id = iterator.GetUnsignedImmediateOperand(3);
int resume_offset = current_offset + iterator.current_bytecode_size();
current_loop_info->AddResumeTarget(
@@ -412,7 +422,7 @@ void BytecodeAnalysis::Analyze(BailoutId osr_bailout_id) {
}
}
}
- } else if (!is_osr && bytecode == Bytecode::kSuspendGenerator) {
+ } else if (bytecode == Bytecode::kSuspendGenerator) {
// If we're not in a loop, we still need to look for suspends.
// TODO(leszeks): It would be nice to de-duplicate this with the in-loop
// case
@@ -422,11 +432,11 @@ void BytecodeAnalysis::Analyze(BailoutId osr_bailout_id) {
ResumeJumpTarget::Leaf(suspend_id, resume_offset));
}
- if (do_liveness_analysis_) {
+ if (analyze_liveness_) {
BytecodeLiveness& liveness = liveness_map_.InitializeLiveness(
current_offset, bytecode_array()->register_count(), zone());
UpdateLiveness(bytecode, liveness, &next_bytecode_in_liveness, iterator,
- liveness_map_);
+ bytecode_array(), liveness_map_);
}
}
@@ -435,7 +445,7 @@ void BytecodeAnalysis::Analyze(BailoutId osr_bailout_id) {
DCHECK(ResumeJumpTargetsAreValid());
- if (!do_liveness_analysis_) return;
+ if (!analyze_liveness_) return;
// At this point, every bytecode has a valid in and out liveness, except for
// propagating liveness across back edges (i.e. JumpLoop). Subsequent liveness
@@ -489,12 +499,13 @@ void BytecodeAnalysis::Analyze(BailoutId osr_bailout_id) {
BytecodeLiveness& liveness = liveness_map_.GetLiveness(current_offset);
UpdateLiveness(bytecode, liveness, &next_bytecode_in_liveness, iterator,
- liveness_map_);
+ bytecode_array(), liveness_map_);
}
// Now we are at the loop header. Since the in-liveness of the header
// can't change, we need only to update the out-liveness.
UpdateOutLiveness(iterator.current_bytecode(), *header_liveness.out,
- next_bytecode_in_liveness, iterator, liveness_map_);
+ next_bytecode_in_liveness, iterator, bytecode_array(),
+ liveness_map_);
}
// Process the generator switch statement separately, once the loops are done.
@@ -533,12 +544,12 @@ void BytecodeAnalysis::Analyze(BailoutId osr_bailout_id) {
DCHECK_NE(bytecode, Bytecode::kJumpLoop);
UpdateLiveness(bytecode, liveness, &next_bytecode_in_liveness, iterator,
- liveness_map_);
+ bytecode_array(), liveness_map_);
}
}
}
- DCHECK(do_liveness_analysis_);
+ DCHECK(analyze_liveness_);
if (FLAG_trace_environment_liveness) {
StdoutStream of;
PrintLivenessTo(of);
@@ -610,14 +621,14 @@ const LoopInfo& BytecodeAnalysis::GetLoopInfoFor(int header_offset) const {
const BytecodeLivenessState* BytecodeAnalysis::GetInLivenessFor(
int offset) const {
- if (!do_liveness_analysis_) return nullptr;
+ if (!analyze_liveness_) return nullptr;
return liveness_map_.GetInLiveness(offset);
}
const BytecodeLivenessState* BytecodeAnalysis::GetOutLivenessFor(
int offset) const {
- if (!do_liveness_analysis_) return nullptr;
+ if (!analyze_liveness_) return nullptr;
return liveness_map_.GetOutLiveness(offset);
}
@@ -662,9 +673,8 @@ bool BytecodeAnalysis::ResumeJumpTargetsAreValid() {
}
// If the iterator is invalid, we've reached the end without finding the
- // generator switch. Similarly, if we are OSR-ing, we're not resuming, so we
- // need no jump targets. So, ensure there are no jump targets and exit.
- if (!iterator.IsValid() || HasOsrEntryPoint()) {
+ // generator switch. So, ensure there are no jump targets and exit.
+ if (!iterator.IsValid()) {
// Check top-level.
if (!resume_jump_targets().empty()) {
PrintF(stderr,
@@ -758,14 +768,14 @@ bool BytecodeAnalysis::ResumeJumpTargetLeavesResolveSuspendIds(
valid = false;
} else {
// Make sure we're resuming to a Resume bytecode
- interpreter::BytecodeArrayAccessor assessor(bytecode_array(),
+ interpreter::BytecodeArrayAccessor accessor(bytecode_array(),
target.target_offset());
- if (assessor.current_bytecode() != Bytecode::kResumeGenerator) {
+ if (accessor.current_bytecode() != Bytecode::kResumeGenerator) {
PrintF(stderr,
"Expected resume target for id %d, offset %d, to be "
"ResumeGenerator, but found %s\n",
target.suspend_id(), target.target_offset(),
- Bytecodes::ToString(assessor.current_bytecode()));
+ Bytecodes::ToString(accessor.current_bytecode()));
valid = false;
}
@@ -820,7 +830,7 @@ bool BytecodeAnalysis::LivenessIsValid() {
previous_liveness.CopyFrom(*liveness.out);
UpdateOutLiveness(bytecode, *liveness.out, next_bytecode_in_liveness,
- iterator, liveness_map_);
+ iterator, bytecode_array(), liveness_map_);
// UpdateOutLiveness skips kJumpLoop, so we update it manually.
if (bytecode == Bytecode::kJumpLoop) {
int target_offset = iterator.GetJumpTargetOffset();