5#ifndef V8_MAGLEV_MAGLEV_PHI_REPRESENTATION_SELECTOR_H_
6#define V8_MAGLEV_MAGLEV_PHI_REPRESENTATION_SELECTOR_H_
23 template <
class Value>
36 if (
v8_flags.trace_maglev_phi_untagging) {
41 if (
v8_flags.trace_maglev_phi_untagging) {
67 template <
class NodeT>
85 template <
class NodeT>
88 uint32_t input_index);
95 template <
class NodeT>
101 if (node->input(0).node()->Is<
Phi>() &&
102 node->input(0).node()->value_representation() !=
119 template <
class NodeT>
128 for (
int i = 0;
i < n->input_count();
i++) {
132 node->change_input(
i, input->
input(0).node());
133 }
else if (
Phi* phi = input->TryCast<
Phi>()) {
152 Phi* phi,
int input_index,
155 Phi* phi,
int input_index,
183 std::optional<int> predecessor_index = std::nullopt);
222 std::unordered_set<NodeBase*> new_nodes_;
MaglevGraphLabeller * graph_labeller() const
MaglevGraphBuilder * builder_
void PostProcessGraph(Graph *graph)
ProcessResult Process(NodeT *node, const ProcessingState &state)
void UpdateUntaggingOfPhi(Phi *phi, ValueNode *old_untagging)
SnapshotTable< ValueNode * > phi_taggings_
MaglevPhiRepresentationSelector(MaglevGraphBuilder *builder)
void EnsurePhiInputsTagged(Phi *phi)
BasicBlock * current_block_
ValueNode * EnsurePhiTagged(Phi *phi, BasicBlock *block, NewNodePosition pos, const ProcessingState *state, std::optional< int > predecessor_index=std::nullopt)
void RegisterNewNode(ValueNode *node)
void ConvertTaggedPhiTo(Phi *phi, ValueRepresentation repr, const HoistTypeList &hoist_untagging)
ValueNode * AddNode(ValueNode *node, BasicBlock *block, NewNodePosition pos, const ProcessingState *state, DeoptFrame *deopt_frame=nullptr)
void FixLoopPhisBackedge(BasicBlock *block)
ZoneVector< Snapshot > predecessors_
void PreparePhiTaggings(BasicBlock *old_block, const BasicBlock *new_block)
@ kBeginingOfCurrentBlock
ZoneVector< Node * > new_nodes_at_start_
ProcessResult Process(JumpLoop *node, const ProcessingState &)
ProcessResult Process(Dead *node, const ProcessingState &)
ProcessResult UpdateNodePhiInput(CheckSmi *node, Phi *phi, int input_index, const ProcessingState *state)
ProcessPhiResult ProcessPhi(Phi *node)
ProcessResult Process(Phi *node, const ProcessingState &)
BlockProcessResult PreProcessBasicBlock(BasicBlock *block)
bool CanHoistUntaggingTo(BasicBlock *block)
void PostProcessBasicBlock(BasicBlock *block)
MaglevGraphLabeller * graph_labeller() const
ProcessResult UpdateNodeInputs(NodeT *n, const ProcessingState *state)
absl::flat_hash_map< BasicBlock::Id, Snapshot > snapshots_
ValueNode * AddNodeAtBlockEnd(ValueNode *new_node, BasicBlock *block, DeoptFrame *deopt_frame=nullptr)
ValueNode * GetReplacementForPhiInputConversion(ValueNode *conversion_node, Phi *phi, uint32_t input_index)
void PreProcessGraph(Graph *graph)
ProcessResult UpdateNonUntaggingNodeInputs(NodeT *n, const ProcessingState *state)
bool IsUntagging(Opcode op)
constexpr Input & input(int index)
ZoneVector< RpoNumber > & result
V8_EXPORT_PRIVATE FlagValues v8_flags
Tagged< To > Cast(Tagged< From > value, const v8::SourceLocation &loc=INIT_SOURCE_LOCATION_IN_DEBUG)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_UNLIKELY(condition)