OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/typed-optimization.h" | 5 #include "src/compiler/typed-optimization.h" |
6 #include "src/code-factory.h" | 6 #include "src/code-factory.h" |
7 #include "src/compilation-dependencies.h" | 7 #include "src/compilation-dependencies.h" |
8 #include "src/compiler/access-builder.h" | 8 #include "src/compiler/access-builder.h" |
9 #include "src/compiler/js-graph.h" | 9 #include "src/compiler/js-graph.h" |
10 #include "src/compiler/js-operator.h" | 10 #include "src/compiler/js-operator.h" |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
81 JSOperatorBuilder* javascript() { return &javascript_; } | 81 JSOperatorBuilder* javascript() { return &javascript_; } |
82 | 82 |
83 private: | 83 private: |
84 JSOperatorBuilder javascript_; | 84 JSOperatorBuilder javascript_; |
85 CompilationDependencies deps_; | 85 CompilationDependencies deps_; |
86 }; | 86 }; |
87 | 87 |
88 TEST_F(TypedOptimizationTest, ParameterWithMinusZero) { | 88 TEST_F(TypedOptimizationTest, ParameterWithMinusZero) { |
89 { | 89 { |
90 Reduction r = Reduce( | 90 Reduction r = Reduce( |
91 Parameter(Type::Constant(factory()->minus_zero_value(), zone()))); | 91 Parameter(Type::NewConstant(factory()->minus_zero_value(), zone()))); |
92 ASSERT_TRUE(r.Changed()); | 92 ASSERT_TRUE(r.Changed()); |
93 EXPECT_THAT(r.replacement(), IsNumberConstant(-0.0)); | 93 EXPECT_THAT(r.replacement(), IsNumberConstant(-0.0)); |
94 } | 94 } |
95 { | 95 { |
96 Reduction r = Reduce(Parameter(Type::MinusZero())); | 96 Reduction r = Reduce(Parameter(Type::MinusZero())); |
97 ASSERT_TRUE(r.Changed()); | 97 ASSERT_TRUE(r.Changed()); |
98 EXPECT_THAT(r.replacement(), IsNumberConstant(-0.0)); | 98 EXPECT_THAT(r.replacement(), IsNumberConstant(-0.0)); |
99 } | 99 } |
100 { | 100 { |
101 Reduction r = Reduce(Parameter( | 101 Reduction r = Reduce(Parameter(Type::Union( |
102 Type::Union(Type::MinusZero(), | 102 Type::MinusZero(), Type::NewConstant(factory()->NewNumber(0), zone()), |
103 Type::Constant(factory()->NewNumber(0), zone()), zone()))); | 103 zone()))); |
104 EXPECT_FALSE(r.Changed()); | 104 EXPECT_FALSE(r.Changed()); |
105 } | 105 } |
106 } | 106 } |
107 | 107 |
108 TEST_F(TypedOptimizationTest, ParameterWithNull) { | 108 TEST_F(TypedOptimizationTest, ParameterWithNull) { |
109 Handle<HeapObject> null = factory()->null_value(); | 109 Handle<HeapObject> null = factory()->null_value(); |
110 { | 110 { |
111 Reduction r = Reduce(Parameter(Type::Constant(null, zone()))); | 111 Reduction r = Reduce(Parameter(Type::NewConstant(null, zone()))); |
112 ASSERT_TRUE(r.Changed()); | 112 ASSERT_TRUE(r.Changed()); |
113 EXPECT_THAT(r.replacement(), IsHeapConstant(null)); | 113 EXPECT_THAT(r.replacement(), IsHeapConstant(null)); |
114 } | 114 } |
115 { | 115 { |
116 Reduction r = Reduce(Parameter(Type::Null())); | 116 Reduction r = Reduce(Parameter(Type::Null())); |
117 ASSERT_TRUE(r.Changed()); | 117 ASSERT_TRUE(r.Changed()); |
118 EXPECT_THAT(r.replacement(), IsHeapConstant(null)); | 118 EXPECT_THAT(r.replacement(), IsHeapConstant(null)); |
119 } | 119 } |
120 } | 120 } |
121 | 121 |
122 TEST_F(TypedOptimizationTest, ParameterWithNaN) { | 122 TEST_F(TypedOptimizationTest, ParameterWithNaN) { |
123 const double kNaNs[] = {-std::numeric_limits<double>::quiet_NaN(), | 123 const double kNaNs[] = {-std::numeric_limits<double>::quiet_NaN(), |
124 std::numeric_limits<double>::quiet_NaN(), | 124 std::numeric_limits<double>::quiet_NaN(), |
125 std::numeric_limits<double>::signaling_NaN()}; | 125 std::numeric_limits<double>::signaling_NaN()}; |
126 TRACED_FOREACH(double, nan, kNaNs) { | 126 TRACED_FOREACH(double, nan, kNaNs) { |
127 Handle<Object> constant = factory()->NewNumber(nan); | 127 Handle<Object> constant = factory()->NewNumber(nan); |
128 Reduction r = Reduce(Parameter(Type::Constant(constant, zone()))); | 128 Reduction r = Reduce(Parameter(Type::NewConstant(constant, zone()))); |
129 ASSERT_TRUE(r.Changed()); | 129 ASSERT_TRUE(r.Changed()); |
130 EXPECT_THAT(r.replacement(), IsNumberConstant(IsNaN())); | 130 EXPECT_THAT(r.replacement(), IsNumberConstant(IsNaN())); |
131 } | 131 } |
132 { | 132 { |
133 Reduction r = | 133 Reduction r = |
134 Reduce(Parameter(Type::Constant(factory()->nan_value(), zone()))); | 134 Reduce(Parameter(Type::NewConstant(factory()->nan_value(), zone()))); |
135 ASSERT_TRUE(r.Changed()); | 135 ASSERT_TRUE(r.Changed()); |
136 EXPECT_THAT(r.replacement(), IsNumberConstant(IsNaN())); | 136 EXPECT_THAT(r.replacement(), IsNumberConstant(IsNaN())); |
137 } | 137 } |
138 { | 138 { |
139 Reduction r = Reduce(Parameter(Type::NaN())); | 139 Reduction r = Reduce(Parameter(Type::NaN())); |
140 ASSERT_TRUE(r.Changed()); | 140 ASSERT_TRUE(r.Changed()); |
141 EXPECT_THAT(r.replacement(), IsNumberConstant(IsNaN())); | 141 EXPECT_THAT(r.replacement(), IsNumberConstant(IsNaN())); |
142 } | 142 } |
143 } | 143 } |
144 | 144 |
145 TEST_F(TypedOptimizationTest, ParameterWithPlainNumber) { | 145 TEST_F(TypedOptimizationTest, ParameterWithPlainNumber) { |
146 TRACED_FOREACH(double, value, kFloat64Values) { | 146 TRACED_FOREACH(double, value, kFloat64Values) { |
147 Handle<Object> constant = factory()->NewNumber(value); | 147 Handle<Object> constant = factory()->NewNumber(value); |
148 Reduction r = Reduce(Parameter(Type::Constant(constant, zone()))); | 148 Reduction r = Reduce(Parameter(Type::NewConstant(constant, zone()))); |
149 ASSERT_TRUE(r.Changed()); | 149 ASSERT_TRUE(r.Changed()); |
150 EXPECT_THAT(r.replacement(), IsNumberConstant(value)); | 150 EXPECT_THAT(r.replacement(), IsNumberConstant(value)); |
151 } | 151 } |
152 TRACED_FOREACH(double, value, kIntegerValues) { | 152 TRACED_FOREACH(double, value, kIntegerValues) { |
153 Reduction r = Reduce(Parameter(Type::Range(value, value, zone()))); | 153 Reduction r = Reduce(Parameter(Type::Range(value, value, zone()))); |
154 ASSERT_TRUE(r.Changed()); | 154 ASSERT_TRUE(r.Changed()); |
155 EXPECT_THAT(r.replacement(), IsNumberConstant(value)); | 155 EXPECT_THAT(r.replacement(), IsNumberConstant(value)); |
156 } | 156 } |
157 } | 157 } |
158 | 158 |
159 TEST_F(TypedOptimizationTest, ParameterWithUndefined) { | 159 TEST_F(TypedOptimizationTest, ParameterWithUndefined) { |
160 Handle<HeapObject> undefined = factory()->undefined_value(); | 160 Handle<HeapObject> undefined = factory()->undefined_value(); |
161 { | 161 { |
162 Reduction r = Reduce(Parameter(Type::Undefined())); | 162 Reduction r = Reduce(Parameter(Type::Undefined())); |
163 ASSERT_TRUE(r.Changed()); | 163 ASSERT_TRUE(r.Changed()); |
164 EXPECT_THAT(r.replacement(), IsHeapConstant(undefined)); | 164 EXPECT_THAT(r.replacement(), IsHeapConstant(undefined)); |
165 } | 165 } |
166 { | 166 { |
167 Reduction r = Reduce(Parameter(Type::Constant(undefined, zone()))); | 167 Reduction r = Reduce(Parameter(Type::NewConstant(undefined, zone()))); |
168 ASSERT_TRUE(r.Changed()); | 168 ASSERT_TRUE(r.Changed()); |
169 EXPECT_THAT(r.replacement(), IsHeapConstant(undefined)); | 169 EXPECT_THAT(r.replacement(), IsHeapConstant(undefined)); |
170 } | 170 } |
171 } | 171 } |
172 | 172 |
173 TEST_F(TypedOptimizationTest, JSToBooleanWithFalsish) { | 173 TEST_F(TypedOptimizationTest, JSToBooleanWithFalsish) { |
174 Node* input = Parameter( | 174 Node* input = Parameter( |
175 Type::Union( | 175 Type::Union( |
176 Type::MinusZero(), | 176 Type::MinusZero(), |
177 Type::Union( | 177 Type::Union( |
178 Type::NaN(), | 178 Type::NaN(), |
179 Type::Union( | 179 Type::Union( |
180 Type::Null(), | 180 Type::Null(), |
181 Type::Union( | 181 Type::Union( |
182 Type::Undefined(), | 182 Type::Undefined(), |
183 Type::Union( | 183 Type::Union( |
184 Type::Undetectable(), | 184 Type::Undetectable(), |
185 Type::Union( | 185 Type::Union(Type::NewConstant( |
186 Type::Constant(factory()->false_value(), zone()), | 186 factory()->false_value(), zone()), |
187 Type::Range(0.0, 0.0, zone()), zone()), | 187 Type::Range(0.0, 0.0, zone()), zone()), |
188 zone()), | 188 zone()), |
189 zone()), | 189 zone()), |
190 zone()), | 190 zone()), |
191 zone()), | 191 zone()), |
192 zone()), | 192 zone()), |
193 0); | 193 0); |
194 Node* context = Parameter(Type::Any(), 1); | 194 Node* context = Parameter(Type::Any(), 1); |
195 Reduction r = Reduce(graph()->NewNode( | 195 Reduction r = Reduce(graph()->NewNode( |
196 javascript()->ToBoolean(ToBooleanHint::kAny), input, context)); | 196 javascript()->ToBoolean(ToBooleanHint::kAny), input, context)); |
197 ASSERT_TRUE(r.Changed()); | 197 ASSERT_TRUE(r.Changed()); |
198 EXPECT_THAT(r.replacement(), IsFalseConstant()); | 198 EXPECT_THAT(r.replacement(), IsFalseConstant()); |
199 } | 199 } |
200 | 200 |
201 TEST_F(TypedOptimizationTest, JSToBooleanWithTruish) { | 201 TEST_F(TypedOptimizationTest, JSToBooleanWithTruish) { |
202 Node* input = Parameter( | 202 Node* input = Parameter( |
203 Type::Union( | 203 Type::Union( |
204 Type::Constant(factory()->true_value(), zone()), | 204 Type::NewConstant(factory()->true_value(), zone()), |
205 Type::Union(Type::DetectableReceiver(), Type::Symbol(), zone()), | 205 Type::Union(Type::DetectableReceiver(), Type::Symbol(), zone()), |
206 zone()), | 206 zone()), |
207 0); | 207 0); |
208 Node* context = Parameter(Type::Any(), 1); | 208 Node* context = Parameter(Type::Any(), 1); |
209 Reduction r = Reduce(graph()->NewNode( | 209 Reduction r = Reduce(graph()->NewNode( |
210 javascript()->ToBoolean(ToBooleanHint::kAny), input, context)); | 210 javascript()->ToBoolean(ToBooleanHint::kAny), input, context)); |
211 ASSERT_TRUE(r.Changed()); | 211 ASSERT_TRUE(r.Changed()); |
212 EXPECT_THAT(r.replacement(), IsTrueConstant()); | 212 EXPECT_THAT(r.replacement(), IsTrueConstant()); |
213 } | 213 } |
214 | 214 |
215 TEST_F(TypedOptimizationTest, JSToBooleanWithNonZeroPlainNumber) { | 215 TEST_F(TypedOptimizationTest, JSToBooleanWithNonZeroPlainNumber) { |
216 Node* input = Parameter(Type::Range(1, V8_INFINITY, zone()), 0); | 216 Node* input = Parameter(Type::Range(1, V8_INFINITY, zone()), 0); |
217 Node* context = Parameter(Type::Any(), 1); | 217 Node* context = Parameter(Type::Any(), 1); |
218 Reduction r = Reduce(graph()->NewNode( | 218 Reduction r = Reduce(graph()->NewNode( |
219 javascript()->ToBoolean(ToBooleanHint::kAny), input, context)); | 219 javascript()->ToBoolean(ToBooleanHint::kAny), input, context)); |
220 ASSERT_TRUE(r.Changed()); | 220 ASSERT_TRUE(r.Changed()); |
221 EXPECT_THAT(r.replacement(), IsTrueConstant()); | 221 EXPECT_THAT(r.replacement(), IsTrueConstant()); |
222 } | 222 } |
223 | 223 |
224 } // namespace compiler | 224 } // namespace compiler |
225 } // namespace internal | 225 } // namespace internal |
226 } // namespace v8 | 226 } // namespace v8 |
OLD | NEW |