119 for (
size_t i = 0;
i < impl->node_pairs_.size();
i += 2) {
120 if (impl->node_pairs_[
i] == node)
return impl->node_pairs_[
i + 1];
126 if (!
CanPeel(loop))
return nullptr;
132 uint32_t estimated_peeled_size = 5 + loop->
TotalSize() * 2;
164 if (node->opcode() == IrOpcode::kLoop)
continue;
166 for (
int i = 0;
i < backedges;
i++) {
169 for (
Node* input : inputs) {
170 if (input != inputs[0]) {
171 inputs.push_back(merge);
184 node->ReplaceInput(0, copier.
map(node->InputAt(1)));
186 new_entry = copier.
map(loop_node->
InputAt(1));
194 switch (exit->opcode()) {
195 case IrOpcode::kLoopExit:
197 exit->ReplaceInput(1, copier.
map(exit->InputAt(0)));
200 case IrOpcode::kLoopExitValue:
202 exit->InsertInput(
graph_->
zone(), 1, copier.
map(exit->InputAt(0)));
206 case IrOpcode::kLoopExitEffect:
208 exit->InsertInput(
graph_->
zone(), 1, copier.
map(exit->InputAt(0)));
229 PrintF(
"Peeling loop with header: ");
231 PrintF(
"%i ", node->id());
240 DCHECK_EQ(IrOpcode::kLoopExit, node->opcode());
243 for (
Edge edge : node->use_edges()) {
245 Node* marker = edge.from();
246 if (marker->
opcode() == IrOpcode::kLoopExitValue) {
249 }
else if (marker->
opcode() == IrOpcode::kLoopExitEffect) {
272 BitVector visited(
static_cast<int>(graph->NodeCount()), tmp_zone);
273 queue.push(graph->end());
274 while (!queue.empty()) {
275 Node* node = queue.front();
278 if (node->opcode() == IrOpcode::kLoopExit) {
282 visited.
Add(control->
id());
286 for (
int i = 0;
i < node->op()->ControlInputCount();
i++) {
289 visited.
Add(control->
id());
bool Contains(int i) const
void push_back(const T &value)
const Operator * Phi(MachineRepresentation representation, int value_input_count)
const Operator * EffectPhi(int effect_input_count)
const Operator * ResizeMergeOrPhi(const Operator *op, int size)
const Operator * Merge(int control_input_count)
LoopTree *const loop_tree_
static void EliminateLoopExit(Node *loop)
PeeledIteration * Peel(LoopTree::Loop *loop)
CommonOperatorBuilder *const common_
SourcePositionTable *const source_positions_
static void EliminateLoopExits(TFGraph *graph, Zone *tmp_zone)
static const size_t kMaxPeeledNodes
NodeOriginTable *const node_origins_
bool CanPeel(LoopTree::Loop *loop)
void PeelInnerLoopsOfTree()
void PeelInnerLoops(LoopTree::Loop *loop)
uint32_t TotalSize() const
const ZoneVector< Loop * > & children() const
Node * GetLoopControl(const Loop *loop)
NodeRange HeaderNodes(const Loop *loop)
const ZoneVector< Loop * > & outer_loops() const
NodeRange ExitNodes(const Loop *loop)
NodeRange BodyNodes(const Loop *loop)
void CopyNodes(TFGraph *graph, Zone *tmp_zone_, Node *dead, base::iterator_range< InputIterator > nodes, SourcePositionTable *source_positions, NodeOriginTable *node_origins)
Node * map(Node *node, uint32_t copy_index)
void Insert(Node *original, const NodeVector &new_copies)
static void ChangeOp(Node *node, const Operator *new_op)
static bool IsControlEdge(Edge edge)
static void ReplaceUses(Node *node, Node *value, Node *effect=nullptr, Node *success=nullptr, Node *exception=nullptr)
static Node * GetEffectInput(Node *node, int index=0)
static Node * GetControlInput(Node *node, int index=0)
constexpr IrOpcode::Value opcode() const
void ReplaceInput(int index, Node *new_to)
Node * InputAt(int index) const
PeeledIterationImpl(Zone *zone)
Node * NewNode(const Operator *op, int input_count, Node *const *inputs, bool incomplete=false)
static const int kAssumedLoopEntryIndex
MachineRepresentation LoopExitValueRepresentationOf(const Operator *const op)
void PrintF(const char *format,...)
V8_EXPORT_PRIVATE FlagValues v8_flags
#define DCHECK_EQ(v1, v2)