Upgrade V8 to 5.1.281.57 DO NOT MERGE
FPIIM-449
Change-Id: Id981b686b4d587ac31697662eb98bb34be42ad90
(cherry picked from commit 3b9bc31999c9787eb726ecdbfd5796bfdec32a18)
diff --git a/src/compiler/instruction.cc b/src/compiler/instruction.cc
index d4ec6bc..c757557 100644
--- a/src/compiler/instruction.cc
+++ b/src/compiler/instruction.cc
@@ -114,7 +114,7 @@
return os << "[constant:" << ConstantOperand::cast(op).virtual_register()
<< "]";
case InstructionOperand::IMMEDIATE: {
- auto imm = ImmediateOperand::cast(op);
+ ImmediateOperand imm = ImmediateOperand::cast(op);
switch (imm.type()) {
case ImmediateOperand::INLINE:
return os << "#" << imm.inline_value();
@@ -124,7 +124,7 @@
}
case InstructionOperand::EXPLICIT:
case InstructionOperand::ALLOCATED: {
- auto allocated = LocationOperand::cast(op);
+ LocationOperand allocated = LocationOperand::cast(op);
if (op.IsStackSlot()) {
os << "[stack:" << LocationOperand::cast(op).index();
} else if (op.IsDoubleStackSlot()) {
@@ -214,7 +214,7 @@
bool ParallelMove::IsRedundant() const {
- for (auto move : *this) {
+ for (MoveOperands* move : *this) {
if (!move->IsRedundant()) return false;
}
return true;
@@ -224,7 +224,7 @@
MoveOperands* ParallelMove::PrepareInsertAfter(MoveOperands* move) const {
MoveOperands* replacement = nullptr;
MoveOperands* to_eliminate = nullptr;
- for (auto curr : *this) {
+ for (MoveOperands* curr : *this) {
if (curr->IsEliminated()) continue;
if (curr->destination().EqualsCanonicalized(move->source())) {
DCHECK(!replacement);
@@ -321,7 +321,7 @@
const PrintableParallelMove& printable) {
const ParallelMove& pm = *printable.parallel_move_;
bool first = true;
- for (auto move : pm) {
+ for (MoveOperands* move : pm) {
if (move->IsEliminated()) continue;
if (!first) os << " ";
first = false;
@@ -346,7 +346,7 @@
PrintableInstructionOperand poi = {
RegisterConfiguration::ArchDefault(RegisterConfiguration::TURBOFAN),
InstructionOperand()};
- for (auto& op : pm.reference_operands_) {
+ for (const InstructionOperand& op : pm.reference_operands_) {
if (!first) {
os << ";";
} else {
@@ -393,6 +393,8 @@
return os;
case kFlags_branch:
return os << "branch";
+ case kFlags_deoptimize:
+ return os << "deoptimize";
case kFlags_set:
return os << "set";
}
@@ -618,7 +620,7 @@
return blocks;
}
-void InstructionSequence::Validate() {
+void InstructionSequence::ValidateEdgeSplitForm() {
// Validate blocks are in edge-split form: no block with multiple successors
// has an edge to a block (== a successor) with more than one predecessors.
for (const InstructionBlock* block : instruction_blocks()) {
@@ -633,14 +635,40 @@
}
}
+void InstructionSequence::ValidateDeferredBlockExitPaths() {
+ // A deferred block with more than one successor must have all its successors
+ // deferred.
+ for (const InstructionBlock* block : instruction_blocks()) {
+ if (!block->IsDeferred() || block->SuccessorCount() <= 1) continue;
+ for (RpoNumber successor_id : block->successors()) {
+ CHECK(InstructionBlockAt(successor_id)->IsDeferred());
+ }
+ }
+}
+
+void InstructionSequence::ValidateSSA() {
+ // TODO(mtrofin): We could use a local zone here instead.
+ BitVector definitions(VirtualRegisterCount(), zone());
+ for (const Instruction* instruction : *this) {
+ for (size_t i = 0; i < instruction->OutputCount(); ++i) {
+ const InstructionOperand* output = instruction->OutputAt(i);
+ int vreg = (output->IsConstant())
+ ? ConstantOperand::cast(output)->virtual_register()
+ : UnallocatedOperand::cast(output)->virtual_register();
+ CHECK(!definitions.Contains(vreg));
+ definitions.Add(vreg);
+ }
+ }
+}
+
void InstructionSequence::ComputeAssemblyOrder(InstructionBlocks* blocks) {
int ao = 0;
- for (auto const block : *blocks) {
+ for (InstructionBlock* const block : *blocks) {
if (!block->IsDeferred()) {
block->set_ao_number(RpoNumber::FromInt(ao++));
}
}
- for (auto const block : *blocks) {
+ for (InstructionBlock* const block : *blocks) {
if (block->IsDeferred()) {
block->set_ao_number(RpoNumber::FromInt(ao++));
}
@@ -665,10 +693,6 @@
representations_(zone()),
deoptimization_entries_(zone()) {
block_starts_.reserve(instruction_blocks_->size());
-
-#if DEBUG
- Validate();
-#endif
}
@@ -730,7 +754,7 @@
if (end == block_starts_.end() || *end > instruction_index) --end;
DCHECK(*end <= instruction_index);
size_t index = std::distance(begin, end);
- auto block = instruction_blocks_->at(index);
+ InstructionBlock* block = instruction_blocks_->at(index);
DCHECK(block->code_start() <= instruction_index &&
instruction_index < block->code_end());
return block;
@@ -861,15 +885,15 @@
os << " instructions: [" << block->code_start() << ", " << block->code_end()
<< ")\n predecessors:";
- for (auto pred : block->predecessors()) {
+ for (RpoNumber pred : block->predecessors()) {
os << " B" << pred.ToInt();
}
os << "\n";
- for (auto phi : block->phis()) {
+ for (const PhiInstruction* phi : block->phis()) {
PrintableInstructionOperand printable_op = {config, phi->output()};
os << " phi: " << printable_op << " =";
- for (auto input : phi->operands()) {
+ for (int input : phi->operands()) {
os << " v" << input;
}
os << "\n";
@@ -886,7 +910,7 @@
os << " " << buf.start() << ": " << printable_instr << "\n";
}
- for (auto succ : block->successors()) {
+ for (RpoNumber succ : block->successors()) {
os << " B" << succ.ToInt();
}
os << "\n";