v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
machine-operator-reducer.h
Go to the documentation of this file.
1// Copyright 2014 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_MACHINE_OPERATOR_REDUCER_H_
6#define V8_COMPILER_MACHINE_OPERATOR_REDUCER_H_
7
8#include <optional>
9
11#include "src/common/globals.h"
14
15namespace v8 {
16namespace internal {
17namespace compiler {
18
19// Forward declarations.
20class CommonOperatorBuilder;
21class MachineGraph;
22class Word32Adapter;
23class Word64Adapter;
24
25// Performs constant folding and strength reduction on nodes that have
26// machine operators.
28 : public NON_EXPORTED_BASE(AdvancedReducer) {
29 public:
32 kPropagateSignallingNan
33 };
34
36 Editor* editor, MachineGraph* mcgraph,
37 SignallingNanPropagation signalling_nan_propagation);
39
40 const char* reducer_name() const override { return "MachineOperatorReducer"; }
41
42 Reduction Reduce(Node* node) override;
43
44 private:
45 friend class Word32Adapter;
46 friend class Word64Adapter;
47
48 Node* Float32Constant(float value);
49 Node* Float64Constant(double value);
50 Node* Int32Constant(int32_t value);
51 Node* Int64Constant(int64_t value);
52 Node* Uint32Constant(uint32_t value) {
53 return Int32Constant(base::bit_cast<int32_t>(value));
54 }
55 Node* Uint64Constant(uint64_t value) {
56 return Int64Constant(base::bit_cast<int64_t>(value));
57 }
58 Node* Float64Mul(Node* lhs, Node* rhs);
59 Node* Float64PowHalf(Node* value);
60 Node* Word32And(Node* lhs, Node* rhs);
61 Node* Word32And(Node* lhs, uint32_t rhs) {
62 return Word32And(lhs, Uint32Constant(rhs));
63 }
64 Node* Word32Sar(Node* lhs, uint32_t rhs);
65 Node* Word64Sar(Node* lhs, uint32_t rhs);
66 Node* Word32Shr(Node* lhs, uint32_t rhs);
67 Node* Word64Shr(Node* lhs, uint32_t rhs);
68 Node* Word32Equal(Node* lhs, Node* rhs);
69 Node* Word64Equal(Node* lhs, Node* rhs);
70 Node* Word64And(Node* lhs, Node* rhs);
71 Node* Word64And(Node* lhs, uint64_t rhs) {
72 return Word64And(lhs, Uint64Constant(rhs));
73 }
74 Node* Int32Add(Node* lhs, Node* rhs);
75 Node* Int64Add(Node* lhs, Node* rhs);
76 Node* Int32Sub(Node* lhs, Node* rhs);
77 Node* Int64Sub(Node* lhs, Node* rhs);
78 Node* Int32Mul(Node* lhs, Node* rhs);
79 Node* Int64Mul(Node* lhs, Node* rhs);
80 Node* Int32Div(Node* dividend, int32_t divisor);
81 Node* Int64Div(Node* dividend, int64_t divisor);
82 Node* Uint32Div(Node* dividend, uint32_t divisor);
83 Node* Uint64Div(Node* dividend, uint64_t divisor);
84 Node* TruncateInt64ToInt32(Node* value);
85 Node* ChangeInt32ToInt64(Node* value);
86
87 Reduction ReplaceBool(bool value) { return ReplaceInt32(value ? 1 : 0); }
89 return Replace(Float32Constant(value));
90 }
91 Reduction ReplaceFloat64(double value) {
92 return Replace(Float64Constant(value));
93 }
94 Reduction ReplaceInt32(int32_t value) {
95 return Replace(Int32Constant(value));
96 }
97 Reduction ReplaceUint32(uint32_t value) {
98 return Replace(Uint32Constant(value));
99 }
100 Reduction ReplaceInt64(int64_t value) {
101 return Replace(Int64Constant(value));
102 }
103 Reduction ReplaceUint64(uint64_t value) {
104 return Replace(Uint64Constant(value));
105 }
106
107 Reduction ReduceInt32Add(Node* node);
108 Reduction ReduceInt64Add(Node* node);
109 Reduction ReduceInt32Sub(Node* node);
110 Reduction ReduceInt64Sub(Node* node);
111 Reduction ReduceInt64Mul(Node* node);
112 Reduction ReduceInt32Div(Node* node);
113 Reduction ReduceInt64Div(Node* node);
114 Reduction ReduceUint32Div(Node* node);
115 Reduction ReduceUint64Div(Node* node);
116 Reduction ReduceInt32Mod(Node* node);
117 Reduction ReduceInt64Mod(Node* node);
118 Reduction ReduceUint32Mod(Node* node);
119 Reduction ReduceUint64Mod(Node* node);
120 Reduction ReduceStore(Node* node);
121 Reduction ReduceProjection(size_t index, Node* node);
122 const Operator* Map64To32Comparison(const Operator* op, bool sign_extended);
123 Reduction ReduceWord32Comparisons(Node* node);
124 Reduction ReduceWord64Comparisons(Node* node);
125 Reduction ReduceWord32Shifts(Node* node);
126 Reduction ReduceWord32Shl(Node* node);
127 Reduction ReduceWord64Shl(Node* node);
128 Reduction ReduceWord32Shr(Node* node);
129 Reduction ReduceWord64Shr(Node* node);
130 Reduction ReduceWord32Sar(Node* node);
131 Reduction ReduceWord64Sar(Node* node);
132 Reduction ReduceWord32And(Node* node);
133 Reduction ReduceWord64And(Node* node);
134 Reduction TryMatchWord32Ror(Node* node);
135 Reduction ReduceWord32Or(Node* node);
136 Reduction ReduceWord64Or(Node* node);
137 Reduction ReduceWord32Xor(Node* node);
138 Reduction ReduceWord64Xor(Node* node);
139 Reduction ReduceWord32Equal(Node* node);
140 Reduction ReduceWord64Equal(Node* node);
141 Reduction ReduceFloat64InsertLowWord32(Node* node);
142 Reduction ReduceFloat64InsertHighWord32(Node* node);
143 Reduction ReduceFloat64Compare(Node* node);
144 Reduction ReduceFloat64RoundDown(Node* node);
145 Reduction ReduceTruncateInt64ToInt32(Node* node);
146 Reduction ReduceConditional(Node* node);
147
148 TFGraph* graph() const;
149 MachineGraph* mcgraph() const { return mcgraph_; }
150 CommonOperatorBuilder* common() const;
151 MachineOperatorBuilder* machine() const;
152
153 // These reductions can be applied to operations of different word sizes.
154 // Use Word32Adapter or Word64Adapter to specialize for a particular one.
155 template <typename WordNAdapter>
156 Reduction ReduceWordNAnd(Node* node);
157 template <typename WordNAdapter>
158 Reduction ReduceWordNOr(Node* node);
159 template <typename WordNAdapter>
160 Reduction ReduceWordNXor(Node* node);
161 template <typename WordNAdapter>
162 Reduction ReduceUintNLessThanOrEqual(Node* node);
163
164 // Tries to simplify "if(x == 0)" by removing the "== 0" and inverting
165 // branches.
166 Reduction SimplifyBranch(Node* node);
167 // Helper for SimplifyBranch; swaps the if/else of a branch.
168 void SwapBranches(Node* node);
169
170 // Helper for ReduceConditional. Does not perform the actual reduction; just
171 // returns a new Node that could be used as the input to the condition.
172 template <typename WordNAdapter>
173 std::optional<Node*> ReduceConditionalN(Node* node);
174
175 // Helper for finding a reduced equality condition. Does not perform the
176 // actual reduction; just returns a new pair that could be compared for the
177 // same outcome. uintN_t corresponds to the size of the Equal operator, and
178 // thus the size of rhs. While the size of the WordNAdaptor corresponds to the
179 // size of lhs, with the sizes being different for
180 // Word32Equal(TruncateInt64ToInt32(lhs), rhs).
181 template <typename WordNAdapter, typename uintN_t,
182 typename intN_t = typename std::make_signed<uintN_t>::type>
183 std::optional<std::pair<Node*, uintN_t>> ReduceWordEqualForConstantRhs(
184 Node* lhs, uintN_t rhs);
185
188};
189
190} // namespace compiler
191} // namespace internal
192} // namespace v8
193
194#endif // V8_COMPILER_MACHINE_OPERATOR_REDUCER_H_
TFGraph * graph
#define NON_EXPORTED_BASE(code)
#define V8_EXPORT_PRIVATE
Definition macros.h:460
MachineGraph * mcgraph_