5#ifndef V8_MAGLEV_MAGLEV_POST_HOC_OPTIMIZATIONS_PROCESSORS_H_
6#define V8_MAGLEV_MAGLEV_POST_HOC_OPTIMIZATIONS_PROCESSORS_H_
30 for (
int i = 0;
i < node->input_count();
i++) {
31 Input& input = node->input(
i);
32 while (input.node() && input.node()->Is<
Identity>()) {
33 node->change_input(
i, input.
node()->input(0).node());
69 if (
auto phi = input->TryCast<
Phi>()) {
104 auto key = std::tuple{object, ltf->
offset()};
133 DCHECK(!load->properties().can_deopt());
155 ValueNode*
object = maps->receiver_input().node();
163 maps->SetEagerDeoptInfo(
zone, j->eager_deopt_info()->top_frame(),
164 maps->eager_deopt_info()->feedback_to_update());
171 template <
typename NodeT>
174 if (node->properties().can_eager_deopt()) {
189template <
typename NodeT>
203 template <
typename NodeT>
206 (!NodeT::kProperties.is_required_when_unused() ||
207 std::is_same_v<ArgumentsElements, NodeT>)) {
208 if (!node->is_used()) {
209 if (!node->unused_inputs_were_visited()) {
227 if (!
v8_flags.maglev_untagged_phis) {
248 for (
auto dep : deps) {
250 graph->allocations_escape_map().find(dep)->second);
256 for (
const auto& it : graph->allocations_escape_map()) {
257 auto* alloc = it.first;
258 DCHECK(alloc->HasBeenAnalysed());
259 if (alloc->HasEscaped()) {
260 for (
auto* dep : it.second) {
261 DCHECK(dep->HasEscaped());
269 for (
auto& it : graph->allocations_escape_map()) {
270 auto* alloc = it.first;
271 if (alloc->HasBeenAnalysed())
continue;
273 if (alloc->IsEscaping()) {
294 for (
int i = 1;
i < node->input_count();
i++) {
313 for (
Input& input : *node) {
316 DCHECK(!node->properties().can_eager_deopt());
317 DCHECK(!node->properties().can_lazy_deopt());
318 node->mark_unused_inputs_visited();
342 for (
auto alloc : node->allocation_list()) {
343 if (alloc->HasEscaped()) {
344 alloc->set_offset(size);
345 size += alloc->size();
349 node->set_size(size);
358 if (!node->HasEscaped()) {
359 if (
v8_flags.trace_maglev_escape_analysis) {
360 std::cout <<
"* Removing allocation node "
368 template <
typename NodeT>
371 (!NodeT::kProperties.is_required_when_unused() ||
372 std::is_same_v<ArgumentsElements, NodeT>)) {
373 if (!node->is_used()) {
382 if (!object->HasEscaped()) {
383 if (
v8_flags.trace_maglev_escape_analysis) {
384 std::cout <<
"* Removing store node "
void PreProcessGraph(Graph *graph)
std::vector< Node * > stores_to_allocations_
void DropUseOfValueInStoresToCapturedAllocations()
void RunEscapeAnalysis(Graph *graph)
void PostProcessGraph(Graph *graph)
ProcessResult Process(NodeT *node, const ProcessingState &state)
void EscapeAllocation(Graph *graph, InlinedAllocation *alloc, Graph::SmallAllocationVector &deps)
void VerifyEscapeAnalysis(Graph *graph)
void DropInputUses(Input &input)
void DropInputUses(ValueNode *node)
void PostProcessBasicBlock(BasicBlock *block)
BlockProcessResult PreProcessBasicBlock(BasicBlock *block)
base::SmallVector< BasicBlock *, 2 > successors() const
BasicBlock * predecessor_at(int i) const
ControlNode * control_node() const
int predecessor_count() const
MergePointInterpreterFrameState * state() const
void PostProcessGraph(Graph *graph)
ProcessResult Process(NodeT *node, const ProcessingState &state)
MaglevGraphLabeller * labeller_
ProcessResult Process(AllocationBlock *node, const ProcessingState &state)
BlockProcessResult PreProcessBasicBlock(BasicBlock *block)
ProcessResult Process(InlinedAllocation *node, const ProcessingState &state)
void PreProcessGraph(Graph *graph)
void PostProcessBasicBlock(BasicBlock *block)
DeadNodeSweepingProcessor(MaglevCompilationInfo *compilation_info)
bool HasBeenElided() const
bool HasBeenAnalysed() const
static LoadedPropertyMapKey TypedArrayLength()
static LoadedPropertyMapKey StringLength()
ProcessResult ProcessNamedLoad(Node *load, ValueNode *object, KnownNodeAspects::LoadedPropertyMapKey name)
ProcessResult Process(StringLength *len, const ProcessingState &state)
bool IsLoopPhi(Node *input)
const LoopEffects * loop_effects
void PreProcessGraph(Graph *graph)
ProcessResult Process(CheckMaps *maps, const ProcessingState &state)
void PostProcessBasicBlock(BasicBlock *block)
ProcessResult Process(LoadTaggedFieldForProperty *ltf, const ProcessingState &state)
bool CanHoist(Node *candidate)
BasicBlock * current_block
void PostProcessGraph(Graph *graph)
LoopOptimizationProcessor(MaglevGraphBuilder *builder)
BlockProcessResult PreProcessBasicBlock(BasicBlock *block)
ProcessResult Process(NodeT *node, const ProcessingState &state)
ProcessResult Process(LoadTaggedFieldForContextSlot *ltf, const ProcessingState &state)
ProcessResult Process(LoadTypedArrayLength *len, const ProcessingState &state)
MaglevGraphLabeller * graph_labeller() const
bool has_graph_labeller() const
MaglevCompilationUnit * compilation_unit() const
const LoopEffects * loop_effects()
constexpr bool Is() const
static constexpr Opcode opcode_of
constexpr Input & input(int index)
constexpr int input_count() const
constexpr OpProperties properties() const
constexpr bool is_required_when_unused() const
ProcessResult Process(NodeBase *node, const ProcessingState &state)
void PreProcessGraph(Graph *graph)
void PostProcessGraph(Graph *graph)
BlockProcessResult PreProcessBasicBlock(BasicBlock *block)
void PostProcessBasicBlock(BasicBlock *block)
bool unused_inputs_were_visited() const
constexpr bool CanBeStoreToNonEscapedObject()
constexpr bool IsConstantNode(Opcode opcode)
constexpr bool IsValueNode(Opcode opcode)
bool TryCast(Tagged< From > value, Tagged< To > *out)
bool Is(IndirectHandle< U > value)
V8_EXPORT_PRIVATE FlagValues v8_flags
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_UNLIKELY(condition)