5#ifndef V8_MAGLEV_MAGLEV_GRAPH_PROCESSOR_H_
6#define V8_MAGLEV_MAGLEV_GRAPH_PROCESSOR_H_
44template <
typename NodeProcessor,
bool visit_
identity_nodes = false>
89template <
typename NodeProcessor,
bool visit_
identity_nodes>
92 template <
typename... Args>
101 auto process_constants = [&](
auto&
map) {
102 for (
auto it = map.begin(); it != map.end();) {
119 process_constants(graph->constants());
120 process_constants(graph->root());
121 process_constants(graph->smi());
122 process_constants(graph->tagged_index());
123 process_constants(graph->int32());
124 process_constants(graph->uint32());
125 process_constants(graph->float64());
126 process_constants(graph->external_references());
127 process_constants(graph->trusted_constants());
134 switch (preprocess_result) {
141 if (block->has_phi()) {
142 auto& phis = *block->phis();
143 for (
auto it = phis.begin(); it != phis.end();) {
152 it = phis.RemoveAt(it);
169 if (node ==
nullptr)
continue;
178 DCHECK(block->predecessor_count() == 1 ||
179 (block->predecessor_count() == 2 && block->is_loop()));
181 DCHECK(target->successors().size() == 1);
185 target->nodes().push_back(cur);
199 switch (control_result) {
227 switch (node->opcode()) {
228#define CASE(OPCODE) \
229 case Opcode::k##OPCODE: \
230 if constexpr (!visit_identity_nodes && \
231 Opcode::k##OPCODE == Opcode::kIdentity) { \
232 return ProcessResult::kContinue; \
234 PreProcess(node->Cast<OPCODE>(), state); \
235 return node_processor_.Process(node->Cast<OPCODE>(), state);
252template <
typename... Processors>
271template <
typename Processor,
typename... Processors>
277 template <
typename... Args>
279 :
Base(
std::forward<Args>(processors)...),
281 template <
typename... Args>
283 :
Base(
std::forward<Args>(processors)...) {}
285 template <
typename Node>
290 return Base::Process(node, state);
303 Base::PreProcessGraph(graph);
307 Base::PostProcessGraph(graph);
311 Base::PostProcessBasicBlock(block);
318 return Base::PreProcessBasicBlock(block);
327 Base::PostPhiProcessing();
334template <
typename... Processors>
BasicBlock * predecessor_at(int i) const
void ProcessGraph(Graph *graph)
const NodeProcessor & node_processor() const
ProcessingState GetCurrentState()
ProcessResult ProcessNodeBase(NodeBase *node, const ProcessingState &state)
BlockConstIterator block_it_
NodeProcessor & node_processor()
NodeProcessor node_processor_
GraphProcessor(Args &&... args)
void PreProcess(NodeBase *node, const ProcessingState &state)
void set_owner(BasicBlock *block)
NodeMultiProcessor(Processor &&processor, Args &&... processors)
void PostProcessBasicBlock(BasicBlock *block)
ProcessResult Process(Node *node, const ProcessingState &state)
BlockProcessResult PreProcessBasicBlock(BasicBlock *block)
void PostProcessGraph(Graph *graph)
NodeMultiProcessor(Args &&... processors)
void PreProcessGraph(Graph *graph)
void PostProcessBasicBlock(BasicBlock *block)
BlockProcessResult PreProcessBasicBlock(BasicBlock *block)
V8_INLINE ProcessResult Process(NodeBase *node, const ProcessingState &state)
void PreProcessGraph(Graph *graph)
void PostProcessGraph(Graph *graph)
BasicBlock * block() const
ProcessingState & operator=(const ProcessingState &)=delete
BlockConstIterator block_it_
ProcessingState(BlockConstIterator block_it, NodeIterator *node_it=nullptr)
NodeIterator * node_it() const
BasicBlock * next_block() const
ProcessingState(const ProcessingState &)=delete
base::Vector< const DirectHandle< Object > > args
ZoneVector< RpoNumber > & result
ProcessorImpl * processor_
ZoneVector< Node * >::iterator NodeIterator
#define DCHECK_NOT_NULL(val)
#define DCHECK(condition)