// Copyright 2017 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef V8_COMPILER_JS_TYPE_HINT_LOWERING_H_ #define V8_COMPILER_JS_TYPE_HINT_LOWERING_H_ #include "src/compiler/graph-reducer.h" #include "src/handles.h" namespace v8 { namespace internal { namespace compiler { // Forward declarations. class JSGraph; // The type-hint lowering consumes feedback about data operations (i.e. unary // and binary operations) to emit nodes using speculative simplified operators // in favor of the generic JavaScript operators. // // This lowering is implemented as an early reduction and can be applied before // nodes are placed into the initial graph. It provides the ability to shortcut // the JavaScript-level operators and directly emit simplified-level operators // even during initial graph building. This is the reason this lowering doesn't // follow the interface of the reducer framework used after graph construction. class JSTypeHintLowering { public: JSTypeHintLowering(JSGraph* jsgraph, Handle feedback_vector); // Potential reduction of binary (arithmetic, logical and shift) operations. Reduction ReduceBinaryOperation(const Operator* op, Node* left, Node* right, Node* effect, Node* control, FeedbackSlot slot); private: friend class JSSpeculativeBinopBuilder; JSGraph* jsgraph() const { return jsgraph_; } const Handle& feedback_vector() const { return feedback_vector_; } JSGraph* jsgraph_; Handle feedback_vector_; DISALLOW_COPY_AND_ASSIGN(JSTypeHintLowering); }; } // namespace compiler } // namespace internal } // namespace v8 #endif // V8_COMPILER_JS_TYPE_HINT_LOWERING_H_