OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/js-intrinsic-lowering.h" | 5 #include "src/compiler/js-intrinsic-lowering.h" |
6 | 6 |
7 #include <stack> | 7 #include <stack> |
8 | 8 |
9 #include "src/code-factory.h" | 9 #include "src/code-factory.h" |
10 #include "src/compiler/access-builder.h" | 10 #include "src/compiler/access-builder.h" |
11 #include "src/compiler/js-graph.h" | 11 #include "src/compiler/js-graph.h" |
12 #include "src/compiler/linkage.h" | 12 #include "src/compiler/linkage.h" |
13 #include "src/compiler/node-matchers.h" | 13 #include "src/compiler/node-matchers.h" |
14 #include "src/compiler/node-properties.h" | 14 #include "src/compiler/node-properties.h" |
15 #include "src/compiler/operator-properties.h" | 15 #include "src/compiler/operator-properties.h" |
16 #include "src/counters.h" | 16 #include "src/counters.h" |
17 #include "src/objects-inl.h" | 17 #include "src/objects-inl.h" |
18 #include "src/type-cache.h" | |
19 | 18 |
20 namespace v8 { | 19 namespace v8 { |
21 namespace internal { | 20 namespace internal { |
22 namespace compiler { | 21 namespace compiler { |
23 | 22 |
24 JSIntrinsicLowering::JSIntrinsicLowering(Editor* editor, JSGraph* jsgraph, | 23 JSIntrinsicLowering::JSIntrinsicLowering(Editor* editor, JSGraph* jsgraph, |
25 DeoptimizationMode mode) | 24 DeoptimizationMode mode) |
26 : AdvancedReducer(editor), | 25 : AdvancedReducer(editor), jsgraph_(jsgraph), mode_(mode) {} |
27 jsgraph_(jsgraph), | |
28 mode_(mode), | |
29 type_cache_(TypeCache::Get()) {} | |
30 | |
31 | 26 |
32 Reduction JSIntrinsicLowering::Reduce(Node* node) { | 27 Reduction JSIntrinsicLowering::Reduce(Node* node) { |
33 if (node->opcode() != IrOpcode::kJSCallRuntime) return NoChange(); | 28 if (node->opcode() != IrOpcode::kJSCallRuntime) return NoChange(); |
34 const Runtime::Function* const f = | 29 const Runtime::Function* const f = |
35 Runtime::FunctionForId(CallRuntimeParametersOf(node->op()).id()); | 30 Runtime::FunctionForId(CallRuntimeParametersOf(node->op()).id()); |
36 if (f->intrinsic_type != Runtime::IntrinsicType::INLINE) return NoChange(); | 31 if (f->intrinsic_type != Runtime::IntrinsicType::INLINE) return NoChange(); |
37 switch (f->function_id) { | 32 switch (f->function_id) { |
38 case Runtime::kInlineConstructDouble: | 33 case Runtime::kInlineConstructDouble: |
39 return ReduceConstructDouble(node); | 34 return ReduceConstructDouble(node); |
40 case Runtime::kInlineCreateIterResultObject: | 35 case Runtime::kInlineCreateIterResultObject: |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
344 return Change(node, op, receiver, effect, control); | 339 return Change(node, op, receiver, effect, control); |
345 } | 340 } |
346 | 341 |
347 | 342 |
348 Reduction JSIntrinsicLowering::ReduceSubString(Node* node) { | 343 Reduction JSIntrinsicLowering::ReduceSubString(Node* node) { |
349 return Change(node, CodeFactory::SubString(isolate()), 3); | 344 return Change(node, CodeFactory::SubString(isolate()), 3); |
350 } | 345 } |
351 | 346 |
352 | 347 |
353 Reduction JSIntrinsicLowering::ReduceToInteger(Node* node) { | 348 Reduction JSIntrinsicLowering::ReduceToInteger(Node* node) { |
354 Node* value = NodeProperties::GetValueInput(node, 0); | 349 NodeProperties::ChangeOp(node, javascript()->ToInteger()); |
355 | 350 return Changed(node); |
356 // ToInteger is a no-op on integer values and -0. | |
357 Type* value_type = NodeProperties::GetType(value); | |
358 if (value_type->Is(type_cache().kIntegerOrMinusZero)) { | |
359 ReplaceWithValue(node, value); | |
360 return Replace(value); | |
361 } | |
362 | |
363 return Change(node, CodeFactory::ToInteger(isolate()), 0); | |
364 } | 351 } |
365 | 352 |
366 | 353 |
367 Reduction JSIntrinsicLowering::ReduceToName(Node* node) { | 354 Reduction JSIntrinsicLowering::ReduceToName(Node* node) { |
368 NodeProperties::ChangeOp(node, javascript()->ToName()); | 355 NodeProperties::ChangeOp(node, javascript()->ToName()); |
369 return Changed(node); | 356 return Changed(node); |
370 } | 357 } |
371 | 358 |
372 | 359 |
373 Reduction JSIntrinsicLowering::ReduceToNumber(Node* node) { | 360 Reduction JSIntrinsicLowering::ReduceToNumber(Node* node) { |
374 NodeProperties::ChangeOp(node, javascript()->ToNumber()); | 361 NodeProperties::ChangeOp(node, javascript()->ToNumber()); |
375 return Changed(node); | 362 return Changed(node); |
376 } | 363 } |
377 | 364 |
378 | 365 |
379 Reduction JSIntrinsicLowering::ReduceToLength(Node* node) { | 366 Reduction JSIntrinsicLowering::ReduceToLength(Node* node) { |
380 Node* value = NodeProperties::GetValueInput(node, 0); | 367 NodeProperties::ChangeOp(node, javascript()->ToLength()); |
381 Type* value_type = NodeProperties::GetType(value); | 368 return Changed(node); |
382 if (value_type->Is(type_cache().kIntegerOrMinusZero)) { | |
383 if (value_type->Max() <= 0.0) { | |
384 value = jsgraph()->ZeroConstant(); | |
385 } else if (value_type->Min() >= kMaxSafeInteger) { | |
386 value = jsgraph()->Constant(kMaxSafeInteger); | |
387 } else { | |
388 if (value_type->Min() <= 0.0) { | |
389 value = graph()->NewNode( | |
390 common()->Select(MachineRepresentation::kTagged), | |
391 graph()->NewNode(simplified()->NumberLessThanOrEqual(), value, | |
392 jsgraph()->ZeroConstant()), | |
393 jsgraph()->ZeroConstant(), value); | |
394 value_type = Type::Range(0.0, value_type->Max(), graph()->zone()); | |
395 NodeProperties::SetType(value, value_type); | |
396 } | |
397 if (value_type->Max() > kMaxSafeInteger) { | |
398 value = graph()->NewNode( | |
399 common()->Select(MachineRepresentation::kTagged), | |
400 graph()->NewNode(simplified()->NumberLessThanOrEqual(), | |
401 jsgraph()->Constant(kMaxSafeInteger), value), | |
402 jsgraph()->Constant(kMaxSafeInteger), value); | |
403 value_type = | |
404 Type::Range(value_type->Min(), kMaxSafeInteger, graph()->zone()); | |
405 NodeProperties::SetType(value, value_type); | |
406 } | |
407 } | |
408 ReplaceWithValue(node, value); | |
409 return Replace(value); | |
410 } | |
411 return Change(node, CodeFactory::ToLength(isolate()), 0); | |
412 } | 369 } |
413 | 370 |
414 | 371 |
415 Reduction JSIntrinsicLowering::ReduceToObject(Node* node) { | 372 Reduction JSIntrinsicLowering::ReduceToObject(Node* node) { |
416 NodeProperties::ChangeOp(node, javascript()->ToObject()); | 373 NodeProperties::ChangeOp(node, javascript()->ToObject()); |
417 return Changed(node); | 374 return Changed(node); |
418 } | 375 } |
419 | 376 |
420 | 377 |
421 Reduction JSIntrinsicLowering::ReduceToPrimitive(Node* node) { | 378 Reduction JSIntrinsicLowering::ReduceToPrimitive(Node* node) { |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 } | 498 } |
542 | 499 |
543 | 500 |
544 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { | 501 SimplifiedOperatorBuilder* JSIntrinsicLowering::simplified() const { |
545 return jsgraph()->simplified(); | 502 return jsgraph()->simplified(); |
546 } | 503 } |
547 | 504 |
548 } // namespace compiler | 505 } // namespace compiler |
549 } // namespace internal | 506 } // namespace internal |
550 } // namespace v8 | 507 } // namespace v8 |
OLD | NEW |