| Index: src/compiler/scheduler.cc
|
| diff --git a/src/compiler/scheduler.cc b/src/compiler/scheduler.cc
|
| index 2c53acf1e520f783b79f6fb52aa9348f14872ebe..80ce8b17112da8404f14fd5ed5db0a2c3f49eacf 100644
|
| --- a/src/compiler/scheduler.cc
|
| +++ b/src/compiler/scheduler.cc
|
| @@ -221,9 +221,9 @@ class CFGBuilder : public ZoneObject {
|
| queued_(scheduler->graph_, 2),
|
| queue_(zone),
|
| control_(zone),
|
| - component_entry_(NULL),
|
| - component_start_(NULL),
|
| - component_end_(NULL) {}
|
| + component_entry_(nullptr),
|
| + component_start_(nullptr),
|
| + component_end_(nullptr) {}
|
|
|
| // Run the control flow graph construction algorithm by walking the graph
|
| // backwards from end through control edges, building and connecting the
|
| @@ -253,7 +253,7 @@ class CFGBuilder : public ZoneObject {
|
| ResetDataStructures();
|
| Queue(exit);
|
|
|
| - component_entry_ = NULL;
|
| + component_entry_ = nullptr;
|
| component_start_ = block;
|
| component_end_ = schedule_->block(exit);
|
| scheduler_->equivalence_->Run(exit);
|
| @@ -377,7 +377,7 @@ class CFGBuilder : public ZoneObject {
|
|
|
| BasicBlock* BuildBlockForNode(Node* node) {
|
| BasicBlock* block = schedule_->block(node);
|
| - if (block == NULL) {
|
| + if (block == nullptr) {
|
| block = schedule_->NewBasicBlock();
|
| TRACE("Create block id:%d for #%d:%s\n", block->id().ToInt(), node->id(),
|
| node->op()->mnemonic());
|
| @@ -501,34 +501,34 @@ class CFGBuilder : public ZoneObject {
|
| void ConnectTailCall(Node* call) {
|
| Node* call_control = NodeProperties::GetControlInput(call);
|
| BasicBlock* call_block = FindPredecessorBlock(call_control);
|
| - TraceConnect(call, call_block, NULL);
|
| + TraceConnect(call, call_block, nullptr);
|
| schedule_->AddTailCall(call_block, call);
|
| }
|
|
|
| void ConnectReturn(Node* ret) {
|
| Node* return_control = NodeProperties::GetControlInput(ret);
|
| BasicBlock* return_block = FindPredecessorBlock(return_control);
|
| - TraceConnect(ret, return_block, NULL);
|
| + TraceConnect(ret, return_block, nullptr);
|
| schedule_->AddReturn(return_block, ret);
|
| }
|
|
|
| void ConnectDeoptimize(Node* deopt) {
|
| Node* deoptimize_control = NodeProperties::GetControlInput(deopt);
|
| BasicBlock* deoptimize_block = FindPredecessorBlock(deoptimize_control);
|
| - TraceConnect(deopt, deoptimize_block, NULL);
|
| + TraceConnect(deopt, deoptimize_block, nullptr);
|
| schedule_->AddDeoptimize(deoptimize_block, deopt);
|
| }
|
|
|
| void ConnectThrow(Node* thr) {
|
| Node* throw_control = NodeProperties::GetControlInput(thr);
|
| BasicBlock* throw_block = FindPredecessorBlock(throw_control);
|
| - TraceConnect(thr, throw_block, NULL);
|
| + TraceConnect(thr, throw_block, nullptr);
|
| schedule_->AddThrow(throw_block, thr);
|
| }
|
|
|
| void TraceConnect(Node* node, BasicBlock* block, BasicBlock* succ) {
|
| DCHECK_NOT_NULL(block);
|
| - if (succ == NULL) {
|
| + if (succ == nullptr) {
|
| TRACE("Connect #%d:%s, id:%d -> end\n", node->id(),
|
| node->op()->mnemonic(), block->id().ToInt());
|
| } else {
|
| @@ -602,8 +602,8 @@ class SpecialRPONumberer : public ZoneObject {
|
| SpecialRPONumberer(Zone* zone, Schedule* schedule)
|
| : zone_(zone),
|
| schedule_(schedule),
|
| - order_(NULL),
|
| - beyond_end_(NULL),
|
| + order_(nullptr),
|
| + beyond_end_(nullptr),
|
| loops_(zone),
|
| backedges_(zone),
|
| stack_(zone),
|
| @@ -630,7 +630,7 @@ class SpecialRPONumberer : public ZoneObject {
|
| // numbering for basic blocks into the final schedule.
|
| void SerializeRPOIntoSchedule() {
|
| int32_t number = 0;
|
| - for (BasicBlock* b = order_; b != NULL; b = b->rpo_next()) {
|
| + for (BasicBlock* b = order_; b != nullptr; b = b->rpo_next()) {
|
| b->set_rpo_number(number++);
|
| schedule_->rpo_order()->push_back(b);
|
| }
|
| @@ -677,7 +677,7 @@ class SpecialRPONumberer : public ZoneObject {
|
| BasicBlock* start;
|
|
|
| void AddOutgoing(Zone* zone, BasicBlock* block) {
|
| - if (outgoing == NULL) {
|
| + if (outgoing == nullptr) {
|
| outgoing = new (zone->New(sizeof(ZoneVector<BasicBlock*>)))
|
| ZoneVector<BasicBlock*>(zone);
|
| }
|
| @@ -713,7 +713,7 @@ class SpecialRPONumberer : public ZoneObject {
|
| // use the schedule's end block in actual control flow (e.g. with end having
|
| // successors). Once this has been cleaned up we can use the end block here.
|
| BasicBlock* BeyondEndSentinel() {
|
| - if (beyond_end_ == NULL) {
|
| + if (beyond_end_ == nullptr) {
|
| BasicBlock::Id id = BasicBlock::Id::FromInt(-1);
|
| beyond_end_ = new (schedule_->zone()) BasicBlock(schedule_->zone(), id);
|
| }
|
| @@ -777,7 +777,7 @@ class SpecialRPONumberer : public ZoneObject {
|
|
|
| // Initialize the "loop stack". Note the entry could be a loop header.
|
| LoopInfo* loop =
|
| - HasLoopNumber(entry) ? &loops_[GetLoopNumber(entry)] : NULL;
|
| + HasLoopNumber(entry) ? &loops_[GetLoopNumber(entry)] : nullptr;
|
| order = insertion_point;
|
|
|
| // Perform an iterative post-order traversal, visiting loop bodies before
|
| @@ -788,7 +788,7 @@ class SpecialRPONumberer : public ZoneObject {
|
| while (stack_depth > 0) {
|
| SpecialRPOStackFrame* frame = &stack_[stack_depth - 1];
|
| BasicBlock* block = frame->block;
|
| - BasicBlock* succ = NULL;
|
| + BasicBlock* succ = nullptr;
|
|
|
| if (block != end && frame->index < block->SuccessorCount()) {
|
| // Process the next normal successor.
|
| @@ -798,7 +798,7 @@ class SpecialRPONumberer : public ZoneObject {
|
| if (block->rpo_number() == kBlockOnStack) {
|
| // Finish the loop body the first time the header is left on the
|
| // stack.
|
| - DCHECK(loop != NULL && loop->header == block);
|
| + DCHECK(loop != nullptr && loop->header == block);
|
| loop->start = PushFront(order, block);
|
| order = loop->end;
|
| block->set_rpo_number(kBlockVisited2);
|
| @@ -813,19 +813,19 @@ class SpecialRPONumberer : public ZoneObject {
|
| size_t outgoing_index = frame->index - block->SuccessorCount();
|
| LoopInfo* info = &loops_[GetLoopNumber(block)];
|
| DCHECK(loop != info);
|
| - if (block != entry && info->outgoing != NULL &&
|
| + if (block != entry && info->outgoing != nullptr &&
|
| outgoing_index < info->outgoing->size()) {
|
| succ = info->outgoing->at(outgoing_index);
|
| frame->index++;
|
| }
|
| }
|
|
|
| - if (succ != NULL) {
|
| + if (succ != nullptr) {
|
| // Process the next successor.
|
| if (succ->rpo_number() == kBlockOnStack) continue;
|
| if (succ->rpo_number() == kBlockVisited2) continue;
|
| DCHECK(succ->rpo_number() == kBlockUnvisited2);
|
| - if (loop != NULL && !loop->members->Contains(succ->id().ToInt())) {
|
| + if (loop != nullptr && !loop->members->Contains(succ->id().ToInt())) {
|
| // The successor is not in the current loop or any nested loop.
|
| // Add it to the outgoing edges of this loop and visit it later.
|
| loop->AddOutgoing(zone_, succ);
|
| @@ -865,10 +865,10 @@ class SpecialRPONumberer : public ZoneObject {
|
| }
|
|
|
| // Publish new order the first time.
|
| - if (order_ == NULL) order_ = order;
|
| + if (order_ == nullptr) order_ = order;
|
|
|
| // Compute the correct loop headers and set the correct loop ends.
|
| - LoopInfo* current_loop = NULL;
|
| + LoopInfo* current_loop = nullptr;
|
| BasicBlock* current_header = entry->loop_header();
|
| int32_t loop_depth = entry->loop_depth();
|
| if (entry->IsLoopHeader()) --loop_depth; // Entry might be a loop header.
|
| @@ -879,11 +879,13 @@ class SpecialRPONumberer : public ZoneObject {
|
| current->set_rpo_number(kBlockUnvisited1);
|
|
|
| // Finish the previous loop(s) if we just exited them.
|
| - while (current_header != NULL && current == current_header->loop_end()) {
|
| + while (current_header != nullptr &&
|
| + current == current_header->loop_end()) {
|
| DCHECK(current_header->IsLoopHeader());
|
| - DCHECK(current_loop != NULL);
|
| + DCHECK_NOT_NULL(current_loop);
|
| current_loop = current_loop->prev;
|
| - current_header = current_loop == NULL ? NULL : current_loop->header;
|
| + current_header =
|
| + current_loop == nullptr ? nullptr : current_loop->header;
|
| --loop_depth;
|
| }
|
| current->set_loop_header(current_header);
|
| @@ -893,7 +895,7 @@ class SpecialRPONumberer : public ZoneObject {
|
| ++loop_depth;
|
| current_loop = &loops_[GetLoopNumber(current)];
|
| BasicBlock* end = current_loop->end;
|
| - current->set_loop_end(end == NULL ? BeyondEndSentinel() : end);
|
| + current->set_loop_end(end == nullptr ? BeyondEndSentinel() : end);
|
| current_header = current_loop->header;
|
| TRACE("id:%d is a loop header, increment loop depth to %d\n",
|
| current->id().ToInt(), loop_depth);
|
| @@ -901,7 +903,7 @@ class SpecialRPONumberer : public ZoneObject {
|
|
|
| current->set_loop_depth(loop_depth);
|
|
|
| - if (current->loop_header() == NULL) {
|
| + if (current->loop_header() == nullptr) {
|
| TRACE("id:%d is not in a loop (depth == %d)\n", current->id().ToInt(),
|
| current->loop_depth());
|
| } else {
|
| @@ -932,7 +934,7 @@ class SpecialRPONumberer : public ZoneObject {
|
| BasicBlock* member = backedges->at(i).first;
|
| BasicBlock* header = member->SuccessorAt(backedges->at(i).second);
|
| size_t loop_num = GetLoopNumber(header);
|
| - if (loops_[loop_num].header == NULL) {
|
| + if (loops_[loop_num].header == nullptr) {
|
| loops_[loop_num].header = header;
|
| loops_[loop_num].members = new (zone_)
|
| BitVector(static_cast<int>(schedule_->BasicBlockCount()), zone_);
|
| @@ -979,7 +981,8 @@ class SpecialRPONumberer : public ZoneObject {
|
| }
|
| os << ":\n";
|
|
|
| - for (BasicBlock* block = order_; block != NULL; block = block->rpo_next()) {
|
| + for (BasicBlock* block = order_; block != nullptr;
|
| + block = block->rpo_next()) {
|
| os << std::setw(5) << "B" << block->rpo_number() << ":";
|
| for (size_t i = 0; i < loops_.size(); i++) {
|
| bool range = loops_[i].header->LoopContains(block);
|
| @@ -988,11 +991,11 @@ class SpecialRPONumberer : public ZoneObject {
|
| os << (range ? "x" : " ");
|
| }
|
| os << " id:" << block->id() << ": ";
|
| - if (block->loop_end() != NULL) {
|
| + if (block->loop_end() != nullptr) {
|
| os << " range: [B" << block->rpo_number() << ", B"
|
| << block->loop_end()->rpo_number() << ")";
|
| }
|
| - if (block->loop_header() != NULL) {
|
| + if (block->loop_header() != nullptr) {
|
| os << " header: id:" << block->loop_header()->id();
|
| }
|
| if (block->loop_depth() > 0) {
|
| @@ -1012,10 +1015,10 @@ class SpecialRPONumberer : public ZoneObject {
|
| BasicBlock* header = loop->header;
|
| BasicBlock* end = header->loop_end();
|
|
|
| - DCHECK(header != NULL);
|
| + DCHECK_NOT_NULL(header);
|
| DCHECK(header->rpo_number() >= 0);
|
| DCHECK(header->rpo_number() < static_cast<int>(order->size()));
|
| - DCHECK(end != NULL);
|
| + DCHECK_NOT_NULL(end);
|
| DCHECK(end->rpo_number() <= static_cast<int>(order->size()));
|
| DCHECK(end->rpo_number() > header->rpo_number());
|
| DCHECK(header->loop_header() != header);
|
| @@ -1026,7 +1029,7 @@ class SpecialRPONumberer : public ZoneObject {
|
| DCHECK_EQ(header, block);
|
| bool end_found;
|
| while (true) {
|
| - if (block == NULL || block == loop->end) {
|
| + if (block == nullptr || block == loop->end) {
|
| end_found = (loop->end == block);
|
| break;
|
| }
|
| @@ -1042,7 +1045,7 @@ class SpecialRPONumberer : public ZoneObject {
|
|
|
| // Check loop depth of the header.
|
| int loop_depth = 0;
|
| - for (LoopInfo* outer = loop; outer != NULL; outer = outer->prev) {
|
| + for (LoopInfo* outer = loop; outer != nullptr; outer = outer->prev) {
|
| loop_depth++;
|
| }
|
| DCHECK_EQ(loop_depth, header->loop_depth());
|
| @@ -1096,7 +1099,7 @@ void Scheduler::ComputeSpecialRPONumbering() {
|
|
|
|
|
| void Scheduler::PropagateImmediateDominators(BasicBlock* block) {
|
| - for (/*nop*/; block != NULL; block = block->rpo_next()) {
|
| + for (/*nop*/; block != nullptr; block = block->rpo_next()) {
|
| auto pred = block->predecessors().begin();
|
| auto end = block->predecessors().end();
|
| DCHECK(pred != end); // All blocks except start have predecessors.
|
| @@ -1153,7 +1156,7 @@ class PrepareUsesVisitor {
|
| opcode == IrOpcode::kParameter
|
| ? schedule_->start()
|
| : schedule_->block(NodeProperties::GetControlInput(node));
|
| - DCHECK(block != NULL);
|
| + DCHECK_NOT_NULL(block);
|
| schedule_->AddNode(block, node);
|
| }
|
| }
|
| @@ -1243,7 +1246,7 @@ class ScheduleEarlyNodeVisitor {
|
| if (data->minimum_block_ == schedule_->start()) return;
|
|
|
| // Propagate schedule early position.
|
| - DCHECK(data->minimum_block_ != NULL);
|
| + DCHECK_NOT_NULL(data->minimum_block_);
|
| for (auto use : node->uses()) {
|
| PropagateMinimumPositionToNode(data->minimum_block_, use);
|
| }
|
| @@ -1521,10 +1524,11 @@ class ScheduleLateNodeVisitor {
|
| BasicBlock* block = nullptr;
|
| for (Edge edge : node->use_edges()) {
|
| BasicBlock* use_block = GetBlockForUse(edge);
|
| - block = block == NULL ? use_block : use_block == NULL
|
| - ? block
|
| - : BasicBlock::GetCommonDominator(
|
| - block, use_block);
|
| + block = block == nullptr
|
| + ? use_block
|
| + : use_block == nullptr
|
| + ? block
|
| + : BasicBlock::GetCommonDominator(block, use_block);
|
| }
|
| return block;
|
| }
|
| @@ -1564,7 +1568,7 @@ class ScheduleLateNodeVisitor {
|
| }
|
| }
|
| BasicBlock* result = schedule_->block(use);
|
| - if (result == NULL) return NULL;
|
| + if (result == nullptr) return nullptr;
|
| TRACE(" must dominate use #%d:%s in id:%d\n", use->id(),
|
| use->op()->mnemonic(), result->id().ToInt());
|
| return result;
|
| @@ -1685,9 +1689,9 @@ void Scheduler::FuseFloatingControl(BasicBlock* block, Node* node) {
|
| // Iterate on phase 2: Compute special RPO and dominator tree.
|
| special_rpo_->UpdateSpecialRPO(block, schedule_->block(node));
|
| // TODO(mstarzinger): Currently "iterate on" means "re-run". Fix that.
|
| - for (BasicBlock* b = block->rpo_next(); b != NULL; b = b->rpo_next()) {
|
| + for (BasicBlock* b = block->rpo_next(); b != nullptr; b = b->rpo_next()) {
|
| b->set_dominator_depth(-1);
|
| - b->set_dominator(NULL);
|
| + b->set_dominator(nullptr);
|
| }
|
| PropagateImmediateDominators(block->rpo_next());
|
|
|
|
|