35 if (
V8_UNLIKELY(observe_node_manager && reduction.Changed())) {
37 reduction.replacement());
51 tick_counter_(tick_counter),
53 observe_node_manager_(observe_node_manager) {
54 if (dead !=
nullptr) {
106 if (!reduction.Changed()) {
108 }
else if (reduction.replacement() == node) {
112 if (
v8_flags.trace_turbo_reduction) {
117 StdoutStream{} <<
"- In-place update of #" << *node <<
" by reducer "
118 << (*i)->reducer_name() << std::endl;
125 if (
v8_flags.trace_turbo_reduction) {
130 StdoutStream{} <<
"- Replacement of #" << *node <<
" with #"
131 << *(reduction.replacement()) <<
" by reducer "
132 << (*i)->reducer_name() << std::endl;
153 if (node->IsDead())
return Pop();
160 Node* input = node_inputs[
i];
161 if (input != node &&
Recurse(input)) {
167 Node* input = node_inputs[
i];
168 if (input != node &&
Recurse(input)) {
181 if (!reduction.Changed())
return Pop();
184 Node*
const replacement = reduction.replacement();
185 if (replacement == node) {
186 for (
Node*
const user : node->
uses()) {
192 node_inputs = node->inputs();
193 for (
int i = 0;
i < node_inputs.
count(); ++
i) {
194 Node* input = node_inputs[
i];
195 if (input != node &&
Recurse(input)) {
206 if (replacement != node) {
207 Replace(node, replacement, max_id);
213 Replace(node, replacement, std::numeric_limits<NodeId>::max());
220 if (replacement->
id() <= max_id) {
223 for (
Edge edge : node->use_edges()) {
224 Node*
const user = edge.from();
226 edge.UpdateTo(replacement);
228 if (user != node)
Revisit(user);
234 for (
Edge edge : node->use_edges()) {
235 Node*
const user = edge.from();
236 if (user->id() <= max_id) {
237 edge.UpdateTo(replacement);
239 if (user != node)
Revisit(user);
243 if (node->uses().empty()) node->Kill();
253 if (effect ==
nullptr && node->op()->EffectInputCount() > 0) {
256 if (control ==
nullptr && node->
op()->ControlInputCount() > 0) {
261 for (
Edge edge : node->use_edges()) {
262 Node*
const user = edge.from();
265 if (user->opcode() == IrOpcode::kIfSuccess) {
267 }
else if (user->opcode() == IrOpcode::kIfException) {
269 edge.UpdateTo(
dead_);
273 edge.UpdateTo(control);
278 edge.UpdateTo(effect);
282 edge.UpdateTo(value);
void TickAndMaybeEnterSafepoint()
void Revisit(Node *node) final
void ReduceNode(Node *const)
void AddReducer(Reducer *reducer)
GraphReducer(Zone *zone, TFGraph *graph, TickCounter *tick_counter, JSHeapBroker *broker, Node *dead=nullptr, ObserveNodeManager *observe_node_manager=nullptr)
JSHeapBroker *const broker_
Reduction Reduce(Node *const)
void ReplaceWithValue(Node *node, Node *value, Node *effect, Node *control) final
NodeMarker< State > state_
ObserveNodeManager *const observe_node_manager_
TickCounter *const tick_counter_
ZoneVector< Reducer * > reducers_
ZoneStack< NodeState > stack_
ZoneQueue< Node * > revisit_
void Replace(Node *node, Node *replacement) final
static bool IsControlEdge(Edge edge)
static Node * GetEffectInput(Node *node, int index=0)
static bool IsEffectEdge(Edge edge)
static void SetType(Node *node, Type type)
static Node * GetControlInput(Node *node, int index=0)
const Operator * op() const
void OnNodeChanged(const char *reducer_name, const Node *old_node, const Node *new_node)
virtual const char * reducer_name() const =0
static Reduction Changed(Node *node)
static Reduction NoChange()
Reduction Reduce(Node *node, ObserveNodeManager *observe_node_manager)
void SetStart(Node *start)
static void VerifyEdgeInputReplacement(const Edge &edge, const Node *replacement)
JSHeapBroker *const broker_
enum v8::internal::@1270::DeoptimizableCodeIterator::@67 state_
V8_EXPORT_PRIVATE FlagValues v8_flags
#define DCHECK_NOT_NULL(val)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
#define V8_UNLIKELY(condition)