5#ifndef V8_COMPILER_LOOP_ANALYSIS_H_
6#define V8_COMPILER_LOOP_ANALYSIS_H_
80 return num > 0 ? &
all_loops_[num - 1] :
nullptr;
87 if (c == loop)
return true;
99 if (loop.children().empty()) {
108 return 1 +
static_cast<int>(loop - &
all_loops_[0]);
142 if (node->opcode() == IrOpcode::kLoop)
return node;
159 if (parent !=
nullptr) {
183#if V8_ENABLE_WEBASSEMBLY
184 enum class Purpose { kLoopPeeling, kLoopUnrolling };
226 template <
typename InputIterator>
232 for (
Node* original : nodes) {
238 for (uint32_t copy_index = 0; copy_index <
copy_count_; copy_index++) {
239 Node* copy = graph->CloneNode(original);
245 for (
Node* original : nodes) {
246 for (uint32_t copy_index = 0; copy_index <
copy_count_; copy_index++) {
247 Node* copy =
map(original, copy_index);
void push_back(const T &value)
uint32_t TotalSize() const
ZoneVector< Loop * > children_
uint32_t ExitsSize() const
uint32_t HeaderSize() const
const ZoneVector< Loop * > & children() const
uint32_t BodySize() const
Node * GetLoopControl(const Loop *loop)
NodeRange HeaderNodes(const Loop *loop)
ZoneVector< Loop * > outer_loops_
int LoopNum(const Loop *loop) const
ZoneVector< Node * > loop_nodes_
void SetParent(Loop *parent, Loop *child)
ZoneVector< int > node_to_loop_num_
Node * HeaderNode(const Loop *loop)
NodeRange LoopNodes(const Loop *loop)
const ZoneVector< Loop * > & outer_loops() const
Loop * ContainingLoop(Node *node)
bool Contains(const Loop *loop, Node *node)
ZoneVector< const Loop * > inner_loops() const
NodeRange ExitNodes(const Loop *loop)
ZoneVector< Loop > all_loops_
LoopTree(size_t num_nodes, Zone *zone)
NodeRange BodyNodes(const Loop *loop)
const uint32_t copy_count_
void CopyNodes(TFGraph *graph, Zone *tmp_zone_, Node *dead, base::iterator_range< InputIterator > nodes, SourcePositionTable *source_positions, NodeOriginTable *node_origins)
V8_INLINE Node * map(Node *node)
NodeCopier(TFGraph *graph, uint32_t max, NodeVector *p, uint32_t copy_count)
NodeMarker< size_t > node_map_
void Insert(Node *original, const NodeVector &new_copies)
V8_INLINE void Set(Node *node, State state)
V8_INLINE State Get(const Node *node)
void ReplaceInput(int index, Node *new_to)
SourcePositionTable * source_positions
ZoneVector< RpoNumber > & result
static const int kAssumedLoopEntryIndex
base::iterator_range< Node ** > NodeRange
#define DCHECK_GT(v1, v2)
#define V8_EXPORT_PRIVATE