22 loop_header_(nullptr),
26 control_input_(nullptr),
33#ifdef LOG_BUILTIN_BLOCK_COUNT
34 pgo_execution_count_(0),
113 os <<
"id:" << block.id();
116 if (info.name) os <<
info;
118 const int kMaxDisplayedBlocks = 4;
123 os <<
" <= id:" << current_block->
id();
124 info = current_block->debug_info();
125 if (info.name) os <<
info;
140 return os <<
"branch";
142 return os <<
"switch";
144 return os <<
"deoptimize";
146 return os <<
"tailcall";
148 return os <<
"return";
150 return os <<
"throw";
156 return os <<
id.ToSize();
162 nodeid_to_block_(zone),
165 end_(NewBasicBlock()) {
193 return block !=
nullptr && block == this->
block(b);
204 if (
v8_flags.trace_turbo_scheduler) {
206 << node->op()->mnemonic()
207 <<
" for future add to id:" << block->id() <<
"\n";
214 if (
v8_flags.trace_turbo_scheduler) {
215 StdoutStream{} <<
"Adding #" << node->id() <<
":" << node->op()->mnemonic()
216 <<
" to id:" << block->id() <<
"\n";
219 block->AddNode(node);
234#define BUILD_BLOCK_JS_CASE(Name, ...) case IrOpcode::k##Name:
236#undef BUILD_BLOCK_JS_CASE
237 case IrOpcode::kCall:
238 case IrOpcode::kFastApiCall:
251 DCHECK(IsPotentiallyThrowingCall(call->opcode()));
273 for (
size_t index = 0; index < succ_count; ++
index) {
316 if (block->control_input() !=
nullptr) {
323 BasicBlock** succ_blocks,
size_t succ_count) {
329 for (
size_t index = 0; index < succ_count; ++
index) {
332 if (block->control_input() !=
nullptr) {
341 if (block->PredecessorCount() > 1) {
358 bool reached_fixed_point =
false;
359 while (!reached_fixed_point) {
360 reached_fixed_point =
true;
362 int predecessor_count =
static_cast<int>(block->PredecessorCount());
363 for (
size_t node_pos = 0; node_pos < block->NodeCount(); ++node_pos) {
364 Node* node = block->NodeAt(node_pos);
365 if (node->opcode() == IrOpcode::kPhi) {
367 bool inputs_equal =
true;
368 for (
int i = 1;
i < predecessor_count; ++
i) {
370 if (input != first_input && input != node) {
371 inputs_equal =
false;
375 if (!inputs_equal)
continue;
378 block->RemoveNode(block->begin() + node_pos);
380 reached_fixed_point =
false;
389 DCHECK(block->PredecessorCount() > 1 && block !=
end_);
390 for (
auto current_pred = block->predecessors().begin();
391 current_pred != block->predecessors().end(); ++current_pred) {
399 for (
size_t i = 0;
i < from->NodeCount();) {
400 Node* node = from->NodeAt(
i);
401 if (node->opcode() == IrOpcode::kPhi) {
403 from->RemoveNode(from->begin() +
i);
420 if (!block->deferred()) {
421 bool deferred = block->PredecessorCount() > 0;
422 for (
auto pred : block->predecessors()) {
423 if (!pred->deferred() && (pred->rpo_number() < block->rpo_number())) {
428 block->set_deferred(
true);
437 block->AddSuccessor(succ);
443 to->AddSuccessor(successor);
445 if (predecessor == from) predecessor =
to;
448 from->ClearSuccessors();
452 block->set_control_input(node);
465 ((s.RpoBlockCount() == 0) ? *s.all_blocks() : *s.rpo_order())) {
466 if (block ==
nullptr)
continue;
467 os <<
"--- BLOCK B" << block->rpo_number() <<
" id" << block->id();
468#ifdef LOG_BUILTIN_BLOCK_COUNT
469 os <<
" PGO Execution Count:" << block->pgo_execution_count();
471 if (block->deferred()) os <<
" (deferred)";
472 if (block->PredecessorCount() != 0) os <<
" <- ";
475 if (comma) os <<
", ";
477 os <<
"B" << predecessor->rpo_number();
480 for (
Node* node : *block) {
490 if (block->control_input() !=
nullptr) {
491 os << *block->control_input();
498 if (comma) os <<
", ";
500 os <<
"B" << successor->rpo_number();
void reserve(size_t new_cap)
void resize(size_t new_size)
void push_back(const T &value)
static Id FromSize(size_t index)
int32_t rpo_number() const
Node * control_input() const
void set_loop_header(BasicBlock *loop_header)
BasicBlock * dominator() const
bool LoopContains(BasicBlock *block) const
NodeVector::iterator iterator
void set_control(Control control)
BasicBlock * loop_header() const
BasicBlock(Zone *zone, Id id)
void AddPredecessor(BasicBlock *predecessor)
size_t SuccessorCount() const
void AddSuccessor(BasicBlock *successor)
void set_control_input(Node *control_input)
BasicBlockVector successors_
BasicBlockVector & successors()
void RemovePredecessor(size_t index)
void TrimNodes(iterator new_end)
int32_t loop_depth() const
BasicBlockVector & predecessors()
BasicBlock * loop_end() const
void set_rpo_number(int32_t rpo_number)
size_t PredecessorCount() const
static BasicBlock * GetCommonDominator(BasicBlock *b1, BasicBlock *b2)
BasicBlockVector predecessors_
void set_loop_end(BasicBlock *loop_end)
void set_loop_depth(int32_t loop_depth)
int32_t dominator_depth() const
BasicBlock * loop_header_
static Type GetType(const Node *node)
static bool IsTyped(const Node *node)
constexpr IrOpcode::Value opcode() const
Node * InputAt(int index) const
void ReplaceUses(Node *replace_to)
void SetBlockForNode(BasicBlock *block, Node *node)
void AddDeoptimize(BasicBlock *block, Node *input)
void AddThrow(BasicBlock *block, Node *input)
void MoveSuccessors(BasicBlock *from, BasicBlock *to)
void PlanNode(BasicBlock *block, Node *node)
void AddGoto(BasicBlock *block, BasicBlock *succ)
void InsertSwitch(BasicBlock *block, BasicBlock *end, Node *sw, BasicBlock **succ_blocks, size_t succ_count)
void AddTailCall(BasicBlock *block, Node *input)
void PropagateDeferredMark()
void AddSuccessor(BasicBlock *block, BasicBlock *succ)
void AddReturn(BasicBlock *block, Node *input)
void EliminateRedundantPhiNodes()
BasicBlockVector all_blocks_
void AddCall(BasicBlock *block, Node *call, BasicBlock *success_block, BasicBlock *exception_block)
BasicBlock * GetBlockById(BasicBlock::Id block_id)
void ClearBlockById(BasicBlock::Id block_id)
BasicBlock * NewBasicBlock()
void EnsureSplitEdgeForm(BasicBlock *block)
bool SameBasicBlock(Node *a, Node *b) const
void InsertBranch(BasicBlock *block, BasicBlock *end, Node *branch, BasicBlock *tblock, BasicBlock *fblock)
void AddBranch(BasicBlock *block, Node *branch, BasicBlock *tblock, BasicBlock *fblock)
BasicBlockVector nodeid_to_block_
void SetControlInput(BasicBlock *block, Node *node)
void AddNode(BasicBlock *block, Node *node)
bool IsScheduled(Node *node)
BasicBlock * block(Node *node) const
void EnsureCFGWellFormedness()
void AddSwitch(BasicBlock *block, Node *sw, BasicBlock **succ_blocks, size_t succ_count)
Schedule(Zone *zone, size_t node_count_hint=0)
void MovePhis(BasicBlock *from, BasicBlock *to)
const v8::base::TimeTicks end_
Handle< SharedFunctionInfo > info
ZoneLinkedList< BFEntry > nodes_
std::ostream & operator<<(std::ostream &os, AccessMode access_mode)
V8_EXPORT_PRIVATE FlagValues v8_flags
#define BUILD_BLOCK_JS_CASE(Name,...)
#define DCHECK_LE(v1, v2)
#define CHECK_NE(lhs, rhs)
#define CHECK_EQ(lhs, rhs)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)