5#ifndef V8_COMPILER_TURBOSHAFT_LOOP_PEELING_REDUCER_H_
6#define V8_COMPILER_TURBOSHAFT_LOOP_PEELING_REDUCER_H_
24 if (v8_flags.turboshaft_trace_peeling) StdoutStream() << x << std::endl; \
31class LoopUnrollingReducer;
38class LoopPeelingReducer :
public Next {
46 !reducer_list_contains<ReducerList, LoopUnrollingReducer>::value);
54 LABEL_BLOCK(no_change) {
return Next::ReduceInputGraphGoto(ig_idx, gto); }
56 const Block* dst = gto.destination;
75 LABEL_BLOCK(no_change) {
return Next::ReduceInputGraphCall(ig_idx, call); }
79 call.IsStackCheck(
__ input_graph(),
broker_,
91 return Next::ReduceInputGraphJSStackCheck(ig_idx, stack_check);
98#if V8_ENABLE_WEBASSEMBLY
100 V<None> ig_idx,
const WasmStackCheckOp& stack_check) {
102 return Next::ReduceInputGraphWasmStackCheck(ig_idx, stack_check);
113 return Next::ReduceInputGraphPhi(ig_idx, phi);
119 return __ PendingLoopPhi(
132 TRACE(
"LoopPeeling: peeling loop at " << header->
index());
146 TRACE(
"> Emitting peeled iteration");
147 __ CloneSubGraph(loop_body,
false);
149 if (
__ generating_unreachable_operations()) {
152 TRACE(
"> Second iteration is not reachable, stopping now");
158 TRACE(
"> Emitting unpeeled loop body");
159 __ CloneSubGraph(loop_body,
true,
164 TRACE(
"LoopPeeling: considering " << header->
index());
166 TRACE(
"> Cannot peel because we're already peeling a loop");
170 if (info.has_inner_loops) {
171 TRACE(
"> Cannot peel because it has inner loops");
175 TRACE(
"> Cannot peel because it contains too many operations");
#define REDUCE_INPUT_GRAPH(operation)
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
LoopInfo GetLoopInfo(const Block *block) const
ZoneSet< const Block *, BlockCmp > GetLoopBody(const Block *loop_header)
const Block * current_loop_header_
V< None > REDUCE_INPUT_GRAPH JSStackCheck(V< None > ig_idx, const JSStackCheckOp &stack_check)
OpIndex REDUCE_INPUT_GRAPH Phi(OpIndex ig_idx, const PhiOp &phi)
V< None > REDUCE_INPUT_GRAPH Goto(V< None > ig_idx, const GotoOp >o)
bool IsEmittingUnpeeledBody() const
bool IsEmittingPeeledIteration() const
void PeelFirstIteration(const Block *header)
bool CanPeelLoop(const Block *header)
static constexpr int kMaxSizeForPeeling
#define TURBOSHAFT_REDUCER_BOILERPLATE(Name)
#define LABEL_BLOCK(label)
V8_EXPORT_PRIVATE bool ShouldSkipOptimizationStep()
#define DCHECK_EQ(v1, v2)
static constexpr size_t kLoopPhiBackEdgeIndex