32 auto operations_range =
37 for (
const Operation& op : operations_range) {
70 std::optional<BlockState>& target_state =
74 if (old_state != *target_state) {
79 target_state->reserved_size = std::nullopt;
84 }
else if (goto_op->destination->IsLoop()) {
106 std::optional<uint64_t> new_size;
109 new_size = size->integral();
115 state.last_allocation && new_size.has_value() &&
116 state.reserved_size.has_value() &&
117 alloc.
type == state.last_allocation->type &&
119 state.reserved_size =
120 static_cast<uint32_t
>(*state.reserved_size + *new_size);
122 uint32_t& max_reserved_size =
reserved_size[state.last_allocation];
123 max_reserved_size = std::max(max_reserved_size, *state.reserved_size);
126 state.last_allocation = &alloc;
127 state.reserved_size = std::nullopt;
129 state.reserved_size =
static_cast<uint32_t
>(*new_size);
151 if (!target_state.has_value()) {
152 target_state =
state;
157 if (target_state->last_allocation != state.last_allocation) {
164 if (target_state->reserved_size.has_value() &&
165 state.reserved_size.has_value()) {
166 target_state->reserved_size =
167 std::max(*target_state->reserved_size, *state.reserved_size);
169 target_state->reserved_size = std::nullopt;
static constexpr int GetStackParameterCount()
static CallDescriptor * GetStubCallDescriptor(Zone *zone, const CallInterfaceDescriptor &descriptor, int stack_parameter_count, CallDescriptor::Flags flags, Operator::Properties properties=Operator::kNoProperties, StubCallMode stub_mode=StubCallMode::kCallCodeObject)
V8_EXPORT_PRIVATE V8_INLINE bool ShouldSkipOperation(const Operation &op)
const TSCallDescriptor * CreateAllocateBuiltinDescriptor(Zone *zone, Isolate *isolate)
V8_EXPORT_PRIVATE bool ShouldSkipOptimizationStep()
base::SmallVector< Block *, 4 > SuccessorBlocks(const Block &block, const Graph &graph)
bool TryCast(Tagged< From > value, Tagged< To > *out)
constexpr int kMaxRegularHeapObjectSize
#define DCHECK_NE(v1, v2)
V< WordPtr > size() const
const Graph & input_graph
bool SkipWriteBarrier(const StoreOp &store)
void Process(const Operation &op)
void MergeCurrentStateIntoSuccessor(const Block *successor)
void ProcessStore(const StoreOp &store)
FixedBlockSidetable< std::optional< BlockState > > block_states
ZoneAbslFlatHashMap< const AllocateOp *, uint32_t > reserved_size
void ProcessAllocation(const AllocateOp &alloc)
ZoneAbslFlatHashSet< V< None > > skipped_write_barriers
void ProcessBlockTerminator(const Operation &op)
AllocationFolding allocation_folding
ZoneAbslFlatHashMap< const AllocateOp *, const AllocateOp * > folded_into
bool IsBlockTerminator() const
const underlying_operation_t< Op > * TryCast() const
OpEffects Effects() const
static const TSCallDescriptor * Create(const CallDescriptor *descriptor, CanThrow can_throw, LazyDeoptOnThrow lazy_deopt_on_throw, Zone *graph_zone, const JSWasmCallParameters *js_wasm_call_parameters=nullptr)