1 // Copyright 2016 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_TYPED_OPTIMIZATION_H_
6 #define V8_COMPILER_TYPED_OPTIMIZATION_H_
7 
8 #include "src/base/compiler-specific.h"
9 #include "src/compiler/graph-reducer.h"
10 #include "src/globals.h"
11 
12 namespace v8 {
13 namespace internal {
14 
15 // Forward declarations.
16 class CompilationDependencies;
17 class Factory;
18 class Isolate;
19 
20 namespace compiler {
21 
22 // Forward declarations.
23 class JSGraph;
24 class SimplifiedOperatorBuilder;
25 class TypeCache;
26 
27 class V8_EXPORT_PRIVATE TypedOptimization final
NON_EXPORTED_BASE(AdvancedReducer)28     : public NON_EXPORTED_BASE(AdvancedReducer) {
29  public:
30   TypedOptimization(Editor* editor, CompilationDependencies* dependencies,
31                     JSGraph* jsgraph);
32   ~TypedOptimization();
33 
34   const char* reducer_name() const override { return "TypedOptimization"; }
35 
36   Reduction Reduce(Node* node) final;
37 
38  private:
39   Reduction ReduceConvertReceiver(Node* node);
40   Reduction ReduceCheckHeapObject(Node* node);
41   Reduction ReduceCheckMaps(Node* node);
42   Reduction ReduceCheckNumber(Node* node);
43   Reduction ReduceCheckString(Node* node);
44   Reduction ReduceCheckEqualsInternalizedString(Node* node);
45   Reduction ReduceCheckEqualsSymbol(Node* node);
46   Reduction ReduceLoadField(Node* node);
47   Reduction ReduceNumberFloor(Node* node);
48   Reduction ReduceNumberRoundop(Node* node);
49   Reduction ReduceNumberToUint8Clamped(Node* node);
50   Reduction ReducePhi(Node* node);
51   Reduction ReduceReferenceEqual(Node* node);
52   Reduction ReduceStringComparison(Node* node);
53   Reduction ReduceSameValue(Node* node);
54   Reduction ReduceSelect(Node* node);
55   Reduction ReduceSpeculativeToNumber(Node* node);
56   Reduction ReduceCheckNotTaggedHole(Node* node);
57   Reduction ReduceTypeOf(Node* node);
58   Reduction ReduceToBoolean(Node* node);
59 
60   Reduction TryReduceStringComparisonOfStringFromSingleCharCode(
61       Node* comparison, Node* from_char_code, Node* constant, bool inverted);
62   Reduction TryReduceStringComparisonOfStringFromSingleCharCodeToConstant(
63       Node* comparison, Handle<String> string, bool inverted);
64   const Operator* NumberComparisonFor(const Operator* op);
65 
66   CompilationDependencies* dependencies() const { return dependencies_; }
67   Factory* factory() const;
68   Graph* graph() const;
69   Isolate* isolate() const;
70   JSGraph* jsgraph() const { return jsgraph_; }
71   SimplifiedOperatorBuilder* simplified() const;
72 
73   CompilationDependencies* const dependencies_;
74   JSGraph* const jsgraph_;
75   Type const true_type_;
76   Type const false_type_;
77   TypeCache const& type_cache_;
78 
79   DISALLOW_COPY_AND_ASSIGN(TypedOptimization);
80 };
81 
82 }  // namespace compiler
83 }  // namespace internal
84 }  // namespace v8
85 
86 #endif  // V8_COMPILER_TYPED_OPTIMIZATION_H_
87