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

Unified Diff: src/compiler/bytecode-analysis.cc

Issue 2552723004: [ignition/turbofan] Wrap bytecode liveness bitvectors (Closed)
Patch Set: Created 4 years 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/compiler/bytecode-analysis.h ('k') | src/compiler/bytecode-graph-builder.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/bytecode-analysis.cc
diff --git a/src/compiler/bytecode-analysis.cc b/src/compiler/bytecode-analysis.cc
index 40e4563894b2f90b917bcf753b3505ba86bf4553..539f760c6cdb1fdcc6485a38cebc09daab56bf4f 100644
--- a/src/compiler/bytecode-analysis.cc
+++ b/src/compiler/bytecode-analysis.cc
@@ -27,21 +27,21 @@ BytecodeAnalysis::BytecodeAnalysis(Handle<BytecodeArray> bytecode_array,
namespace {
-void UpdateInLiveness(Bytecode bytecode, BitVector& in_liveness,
+void UpdateInLiveness(Bytecode bytecode, BytecodeLivenessState& in_liveness,
const BytecodeArrayAccessor& accessor) {
int num_operands = Bytecodes::NumberOfOperands(bytecode);
const OperandType* operand_types = Bytecodes::GetOperandTypes(bytecode);
AccumulatorUse accumulator_use = Bytecodes::GetAccumulatorUse(bytecode);
if (accumulator_use == AccumulatorUse::kWrite) {
- in_liveness.Remove(in_liveness.length() - 1);
+ in_liveness.MarkAccumulatorDead();
}
for (int i = 0; i < num_operands; ++i) {
switch (operand_types[i]) {
case OperandType::kRegOut: {
interpreter::Register r = accessor.GetRegisterOperand(i);
if (!r.is_parameter()) {
- in_liveness.Remove(r.index());
+ in_liveness.MarkRegisterDead(r.index());
}
break;
}
@@ -49,8 +49,8 @@ void UpdateInLiveness(Bytecode bytecode, BitVector& in_liveness,
interpreter::Register r = accessor.GetRegisterOperand(i);
if (!r.is_parameter()) {
DCHECK(!interpreter::Register(r.index() + 1).is_parameter());
- in_liveness.Remove(r.index());
- in_liveness.Remove(r.index() + 1);
+ in_liveness.MarkRegisterDead(r.index());
+ in_liveness.MarkRegisterDead(r.index() + 1);
}
break;
}
@@ -59,9 +59,9 @@ void UpdateInLiveness(Bytecode bytecode, BitVector& in_liveness,
if (!r.is_parameter()) {
DCHECK(!interpreter::Register(r.index() + 1).is_parameter());
DCHECK(!interpreter::Register(r.index() + 2).is_parameter());
- in_liveness.Remove(r.index());
- in_liveness.Remove(r.index() + 1);
- in_liveness.Remove(r.index() + 2);
+ in_liveness.MarkRegisterDead(r.index());
+ in_liveness.MarkRegisterDead(r.index() + 1);
+ in_liveness.MarkRegisterDead(r.index() + 2);
}
break;
}
@@ -72,14 +72,14 @@ void UpdateInLiveness(Bytecode bytecode, BitVector& in_liveness,
}
if (accumulator_use == AccumulatorUse::kRead) {
- in_liveness.Add(in_liveness.length() - 1);
+ in_liveness.MarkAccumulatorLive();
}
for (int i = 0; i < num_operands; ++i) {
switch (operand_types[i]) {
case OperandType::kReg: {
interpreter::Register r = accessor.GetRegisterOperand(i);
if (!r.is_parameter()) {
- in_liveness.Add(r.index());
+ in_liveness.MarkRegisterLive(r.index());
}
break;
}
@@ -87,8 +87,8 @@ void UpdateInLiveness(Bytecode bytecode, BitVector& in_liveness,
interpreter::Register r = accessor.GetRegisterOperand(i);
if (!r.is_parameter()) {
DCHECK(!interpreter::Register(r.index() + 1).is_parameter());
- in_liveness.Add(r.index());
- in_liveness.Add(r.index() + 1);
+ in_liveness.MarkRegisterLive(r.index());
+ in_liveness.MarkRegisterLive(r.index() + 1);
}
break;
}
@@ -98,7 +98,7 @@ void UpdateInLiveness(Bytecode bytecode, BitVector& in_liveness,
if (!r.is_parameter()) {
for (uint32_t j = 0; j < reg_count; ++j) {
DCHECK(!interpreter::Register(r.index() + j).is_parameter());
- in_liveness.Add(r.index() + j);
+ in_liveness.MarkRegisterLive(r.index() + j);
}
}
}
@@ -109,8 +109,8 @@ void UpdateInLiveness(Bytecode bytecode, BitVector& in_liveness,
}
}
-void UpdateOutLiveness(Bytecode bytecode, BitVector& out_liveness,
- BitVector* next_bytecode_in_liveness,
+void UpdateOutLiveness(Bytecode bytecode, BytecodeLivenessState& out_liveness,
+ BytecodeLivenessState* next_bytecode_in_liveness,
const BytecodeArrayAccessor& accessor,
const BytecodeLivenessMap& liveness_map) {
int current_offset = accessor.current_offset();
@@ -140,7 +140,7 @@ void UpdateOutLiveness(Bytecode bytecode, BitVector& out_liveness,
if (handler_offset != -1) {
out_liveness.Union(*liveness_map.GetInLiveness(handler_offset));
- out_liveness.Add(handler_context);
+ out_liveness.MarkRegisterLive(handler_context);
}
}
}
@@ -150,7 +150,7 @@ void UpdateOutLiveness(Bytecode bytecode, BitVector& out_liveness,
void BytecodeAnalysis::Analyze() {
loop_stack_.push(-1);
- BitVector* next_bytecode_in_liveness = nullptr;
+ BytecodeLivenessState* next_bytecode_in_liveness = nullptr;
BytecodeArrayRandomIterator iterator(bytecode_array(), zone());
for (iterator.GoToEnd(); iterator.IsValid(); --iterator) {
@@ -172,10 +172,8 @@ void BytecodeAnalysis::Analyze() {
}
if (do_liveness_analysis_) {
- // The liveness vector had bits for the liveness of the registers, and one
- // more bit for the liveness of the accumulator.
- Liveness& liveness = liveness_map_.InitializeLiveness(
- current_offset, bytecode_array()->register_count() + 1, zone());
+ BytecodeLiveness& liveness = liveness_map_.InitializeLiveness(
+ current_offset, bytecode_array()->register_count(), zone());
UpdateOutLiveness(bytecode, *liveness.out, next_bytecode_in_liveness,
iterator, liveness_map_);
@@ -224,8 +222,9 @@ void BytecodeAnalysis::Analyze() {
int header_offset = iterator.GetJumpTargetOffset();
int end_offset = iterator.current_offset();
- Liveness& header_liveness = liveness_map_.GetLiveness(header_offset);
- Liveness& end_liveness = liveness_map_.GetLiveness(end_offset);
+ BytecodeLiveness& header_liveness =
+ liveness_map_.GetLiveness(header_offset);
+ BytecodeLiveness& end_liveness = liveness_map_.GetLiveness(end_offset);
if (!end_liveness.out->UnionIsChanged(*header_liveness.in)) {
// Only update the loop body if the loop end liveness changed.
@@ -240,7 +239,7 @@ void BytecodeAnalysis::Analyze() {
Bytecode bytecode = iterator.current_bytecode();
int current_offset = iterator.current_offset();
- Liveness& liveness = liveness_map_.GetLiveness(current_offset);
+ BytecodeLiveness& liveness = liveness_map_.GetLiveness(current_offset);
UpdateOutLiveness(bytecode, *liveness.out, next_bytecode_in_liveness,
iterator, liveness_map_);
@@ -313,13 +312,15 @@ int BytecodeAnalysis::GetParentLoopFor(int header_offset) const {
return header_to_parent_.find(header_offset)->second;
}
-const BitVector* BytecodeAnalysis::GetInLivenessFor(int offset) const {
+const BytecodeLivenessState* BytecodeAnalysis::GetInLivenessFor(
+ int offset) const {
if (!do_liveness_analysis_) return nullptr;
return liveness_map_.GetInLiveness(offset);
}
-const BitVector* BytecodeAnalysis::GetOutLivenessFor(int offset) const {
+const BytecodeLivenessState* BytecodeAnalysis::GetOutLivenessFor(
+ int offset) const {
if (!do_liveness_analysis_) return nullptr;
return liveness_map_.GetOutLiveness(offset);
@@ -331,16 +332,18 @@ std::ostream& BytecodeAnalysis::PrintLivenessTo(std::ostream& os) const {
for (; !iterator.done(); iterator.Advance()) {
int current_offset = iterator.current_offset();
- const BitVector* in_liveness = GetInLivenessFor(current_offset);
- const BitVector* out_liveness = GetOutLivenessFor(current_offset);
+ const BitVector& in_liveness =
+ GetInLivenessFor(current_offset)->bit_vector();
+ const BitVector& out_liveness =
+ GetOutLivenessFor(current_offset)->bit_vector();
- for (int i = 0; i < in_liveness->length(); ++i) {
- os << (in_liveness->Contains(i) ? "L" : ".");
+ for (int i = 0; i < in_liveness.length(); ++i) {
+ os << (in_liveness.Contains(i) ? "L" : ".");
}
os << " -> ";
- for (int i = 0; i < out_liveness->length(); ++i) {
- os << (out_liveness->Contains(i) ? "L" : ".");
+ for (int i = 0; i < out_liveness.length(); ++i) {
+ os << (out_liveness.Contains(i) ? "L" : ".");
}
os << " | " << current_offset << ": ";
@@ -354,12 +357,13 @@ std::ostream& BytecodeAnalysis::PrintLivenessTo(std::ostream& os) const {
bool BytecodeAnalysis::LivenessIsValid() {
BytecodeArrayRandomIterator iterator(bytecode_array(), zone());
- BitVector previous_liveness(bytecode_array()->register_count() + 1, zone());
+ BytecodeLivenessState previous_liveness(bytecode_array()->register_count(),
+ zone());
int invalid_offset = -1;
int which_invalid = -1;
- BitVector* next_bytecode_in_liveness = nullptr;
+ BytecodeLivenessState* next_bytecode_in_liveness = nullptr;
// Ensure that there are no liveness changes if we iterate one more time.
for (iterator.GoToEnd(); iterator.IsValid(); --iterator) {
@@ -367,7 +371,7 @@ bool BytecodeAnalysis::LivenessIsValid() {
int current_offset = iterator.current_offset();
- Liveness& liveness = liveness_map_.GetLiveness(current_offset);
+ BytecodeLiveness& liveness = liveness_map_.GetLiveness(current_offset);
previous_liveness.CopyFrom(*liveness.out);
@@ -414,17 +418,19 @@ bool BytecodeAnalysis::LivenessIsValid() {
BytecodeArrayIterator forward_iterator(bytecode_array());
for (; !forward_iterator.done(); forward_iterator.Advance()) {
int current_offset = forward_iterator.current_offset();
- BitVector* in_liveness = liveness_map_.GetInLiveness(current_offset);
- BitVector* out_liveness = liveness_map_.GetOutLiveness(current_offset);
+ const BitVector& in_liveness =
+ GetInLivenessFor(current_offset)->bit_vector();
+ const BitVector& out_liveness =
+ GetOutLivenessFor(current_offset)->bit_vector();
- for (int i = 0; i < in_liveness->length(); ++i) {
- of << (in_liveness->Contains(i) ? 'L' : '.');
+ for (int i = 0; i < in_liveness.length(); ++i) {
+ of << (in_liveness.Contains(i) ? 'L' : '.');
}
of << " | ";
- for (int i = 0; i < out_liveness->length(); ++i) {
- of << (out_liveness->Contains(i) ? 'L' : '.');
+ for (int i = 0; i < out_liveness.length(); ++i) {
+ of << (out_liveness.Contains(i) ? 'L' : '.');
}
of << " : " << current_offset << " : ";
@@ -448,14 +454,14 @@ bool BytecodeAnalysis::LivenessIsValid() {
if (current_offset == invalid_offset) {
// Underline the invalid liveness.
if (which_invalid == 0) {
- for (int i = 0; i < in_liveness->length(); ++i) {
+ for (int i = 0; i < in_liveness.length(); ++i) {
of << '^';
}
} else {
- for (int i = 0; i < in_liveness->length() + 3; ++i) {
+ for (int i = 0; i < in_liveness.length() + 3; ++i) {
of << ' ';
}
- for (int i = 0; i < out_liveness->length(); ++i) {
+ for (int i = 0; i < out_liveness.length(); ++i) {
of << '^';
}
}
« no previous file with comments | « src/compiler/bytecode-analysis.h ('k') | src/compiler/bytecode-graph-builder.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698