Home | History | Annotate | Download | only in compiler
      1 // Copyright 2017 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_COMPILER_JS_TYPE_HINT_LOWERING_H_
      6 #define V8_COMPILER_JS_TYPE_HINT_LOWERING_H_
      7 
      8 #include "src/compiler/graph-reducer.h"
      9 #include "src/handles.h"
     10 
     11 namespace v8 {
     12 namespace internal {
     13 namespace compiler {
     14 
     15 // Forward declarations.
     16 class JSGraph;
     17 
     18 // The type-hint lowering consumes feedback about data operations (i.e. unary
     19 // and binary operations) to emit nodes using speculative simplified operators
     20 // in favor of the generic JavaScript operators.
     21 //
     22 // This lowering is implemented as an early reduction and can be applied before
     23 // nodes are placed into the initial graph. It provides the ability to shortcut
     24 // the JavaScript-level operators and directly emit simplified-level operators
     25 // even during initial graph building. This is the reason this lowering doesn't
     26 // follow the interface of the reducer framework used after graph construction.
     27 class JSTypeHintLowering {
     28  public:
     29   JSTypeHintLowering(JSGraph* jsgraph, Handle<FeedbackVector> feedback_vector);
     30 
     31   // Potential reduction of binary (arithmetic, logical and shift) operations.
     32   Reduction ReduceBinaryOperation(const Operator* op, Node* left, Node* right,
     33                                   Node* effect, Node* control,
     34                                   FeedbackSlot slot);
     35 
     36  private:
     37   friend class JSSpeculativeBinopBuilder;
     38 
     39   JSGraph* jsgraph() const { return jsgraph_; }
     40   const Handle<FeedbackVector>& feedback_vector() const {
     41     return feedback_vector_;
     42   }
     43 
     44   JSGraph* jsgraph_;
     45   Handle<FeedbackVector> feedback_vector_;
     46 
     47   DISALLOW_COPY_AND_ASSIGN(JSTypeHintLowering);
     48 };
     49 
     50 }  // namespace compiler
     51 }  // namespace internal
     52 }  // namespace v8
     53 
     54 #endif  // V8_COMPILER_JS_TYPE_HINT_LOWERING_H_
     55