Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(96)

Side by Side Diff: src/compiler/js-typed-lowering.cc

Issue 2149583002: [turbofan] Extend undefined-to-number truncation to all oddballs. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/compiler/representation-change.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 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 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/code-factory.h" 5 #include "src/code-factory.h"
6 #include "src/compilation-dependencies.h" 6 #include "src/compilation-dependencies.h"
7 #include "src/compiler/access-builder.h" 7 #include "src/compiler/access-builder.h"
8 #include "src/compiler/js-graph.h" 8 #include "src/compiler/js-graph.h"
9 #include "src/compiler/js-typed-lowering.h" 9 #include "src/compiler/js-typed-lowering.h"
10 #include "src/compiler/linkage.h" 10 #include "src/compiler/linkage.h"
(...skipping 21 matching lines...) Expand all
32 !(lowering_->flags() & JSTypedLowering::kTypeFeedbackEnabled)) { 32 !(lowering_->flags() & JSTypedLowering::kTypeFeedbackEnabled)) {
33 return BinaryOperationHints::kAny; 33 return BinaryOperationHints::kAny;
34 } 34 }
35 DCHECK_NE(0, node_->op()->ControlOutputCount()); 35 DCHECK_NE(0, node_->op()->ControlOutputCount());
36 DCHECK_EQ(1, node_->op()->EffectOutputCount()); 36 DCHECK_EQ(1, node_->op()->EffectOutputCount());
37 DCHECK_LE(1, OperatorProperties::GetFrameStateInputCount(node_->op())); 37 DCHECK_LE(1, OperatorProperties::GetFrameStateInputCount(node_->op()));
38 BinaryOperationHints hints = BinaryOperationHintsOf(node_->op()); 38 BinaryOperationHints hints = BinaryOperationHintsOf(node_->op());
39 BinaryOperationHints::Hint combined = hints.combined(); 39 BinaryOperationHints::Hint combined = hints.combined();
40 if (combined == BinaryOperationHints::kSignedSmall || 40 if (combined == BinaryOperationHints::kSignedSmall ||
41 combined == BinaryOperationHints::kSigned32 || 41 combined == BinaryOperationHints::kSigned32 ||
42 combined == BinaryOperationHints::kNumberOrUndefined) { 42 combined == BinaryOperationHints::kNumberOrOddball) {
43 return combined; 43 return combined;
44 } 44 }
45 return BinaryOperationHints::kAny; 45 return BinaryOperationHints::kAny;
46 } 46 }
47 47
48 CompareOperationHints::Hint GetNumberCompareOperationFeedback() { 48 CompareOperationHints::Hint GetNumberCompareOperationFeedback() {
49 if (!(lowering_->flags() & JSTypedLowering::kDeoptimizationEnabled) || 49 if (!(lowering_->flags() & JSTypedLowering::kDeoptimizationEnabled) ||
50 !(lowering_->flags() & JSTypedLowering::kTypeFeedbackEnabled)) { 50 !(lowering_->flags() & JSTypedLowering::kTypeFeedbackEnabled)) {
51 return CompareOperationHints::kAny; 51 return CompareOperationHints::kAny;
52 } 52 }
53 DCHECK_NE(0, node_->op()->ControlOutputCount()); 53 DCHECK_NE(0, node_->op()->ControlOutputCount());
54 DCHECK_EQ(1, node_->op()->EffectOutputCount()); 54 DCHECK_EQ(1, node_->op()->EffectOutputCount());
55 DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node_->op())); 55 DCHECK_EQ(1, OperatorProperties::GetFrameStateInputCount(node_->op()));
56 CompareOperationHints hints = CompareOperationHintsOf(node_->op()); 56 CompareOperationHints hints = CompareOperationHintsOf(node_->op());
57 CompareOperationHints::Hint combined = hints.combined(); 57 CompareOperationHints::Hint combined = hints.combined();
58 if (combined == CompareOperationHints::kSignedSmall || 58 if (combined == CompareOperationHints::kSignedSmall ||
59 combined == CompareOperationHints::kNumber) { 59 combined == CompareOperationHints::kNumberOrOddball) {
60 return combined; 60 return combined;
61 } 61 }
62 return CompareOperationHints::kAny; 62 return CompareOperationHints::kAny;
63 } 63 }
64 64
65 void ConvertInputsToNumber() { 65 void ConvertInputsToNumber() {
66 // To convert the inputs to numbers, we have to provide frame states 66 // To convert the inputs to numbers, we have to provide frame states
67 // for lazy bailouts in the ToNumber conversions. 67 // for lazy bailouts in the ToNumber conversions.
68 // We use a little hack here: we take the frame state before the binary 68 // We use a little hack here: we take the frame state before the binary
69 // operation and use it to construct the frame states for the conversion 69 // operation and use it to construct the frame states for the conversion
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 double min = kMinInt / (1 << k); 428 double min = kMinInt / (1 << k);
429 double max = kMaxInt / (1 << k); 429 double max = kMaxInt / (1 << k);
430 shifted_int32_ranges_[k] = Type::Range(min, max, graph()->zone()); 430 shifted_int32_ranges_[k] = Type::Range(min, max, graph()->zone());
431 } 431 }
432 } 432 }
433 433
434 434
435 Reduction JSTypedLowering::ReduceJSAdd(Node* node) { 435 Reduction JSTypedLowering::ReduceJSAdd(Node* node) {
436 JSBinopReduction r(this, node); 436 JSBinopReduction r(this, node);
437 BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback(); 437 BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback();
438 if (feedback == BinaryOperationHints::kNumberOrUndefined && 438 if (feedback == BinaryOperationHints::kNumberOrOddball &&
439 r.BothInputsAre(Type::PlainPrimitive()) && 439 r.BothInputsAre(Type::PlainPrimitive()) &&
440 r.NeitherInputCanBe(Type::StringOrReceiver())) { 440 r.NeitherInputCanBe(Type::StringOrReceiver())) {
441 // JSAdd(x:-string, y:-string) => NumberAdd(ToNumber(x), ToNumber(y)) 441 // JSAdd(x:-string, y:-string) => NumberAdd(ToNumber(x), ToNumber(y))
442 r.ConvertInputsToNumber(); 442 r.ConvertInputsToNumber();
443 return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number()); 443 return r.ChangeToPureOperator(simplified()->NumberAdd(), Type::Number());
444 } 444 }
445 if (feedback != BinaryOperationHints::kAny) { 445 if (feedback != BinaryOperationHints::kAny) {
446 // Lower to the optimistic number binop. 446 // Lower to the optimistic number binop.
447 return r.ChangeToSpeculativeOperator( 447 return r.ChangeToSpeculativeOperator(
448 simplified()->SpeculativeNumberAdd(feedback), Type::Number()); 448 simplified()->SpeculativeNumberAdd(feedback), Type::Number());
(...skipping 30 matching lines...) Expand all
479 NodeProperties::ChangeOp(node, common()->Call(desc)); 479 NodeProperties::ChangeOp(node, common()->Call(desc));
480 return Changed(node); 480 return Changed(node);
481 } 481 }
482 return NoChange(); 482 return NoChange();
483 } 483 }
484 484
485 485
486 Reduction JSTypedLowering::ReduceJSSubtract(Node* node) { 486 Reduction JSTypedLowering::ReduceJSSubtract(Node* node) {
487 JSBinopReduction r(this, node); 487 JSBinopReduction r(this, node);
488 BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback(); 488 BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback();
489 if (feedback == BinaryOperationHints::kNumberOrUndefined && 489 if (feedback == BinaryOperationHints::kNumberOrOddball &&
490 r.BothInputsAre(Type::PlainPrimitive())) { 490 r.BothInputsAre(Type::PlainPrimitive())) {
491 // JSSubtract(x:plain-primitive, y:plain-primitive) 491 // JSSubtract(x:plain-primitive, y:plain-primitive)
492 // => NumberSubtract(ToNumber(x), ToNumber(y)) 492 // => NumberSubtract(ToNumber(x), ToNumber(y))
493 r.ConvertInputsToNumber(); 493 r.ConvertInputsToNumber();
494 return r.ChangeToPureOperator(simplified()->NumberSubtract(), 494 return r.ChangeToPureOperator(simplified()->NumberSubtract(),
495 Type::Number()); 495 Type::Number());
496 } 496 }
497 if (feedback != BinaryOperationHints::kAny) { 497 if (feedback != BinaryOperationHints::kAny) {
498 // Lower to the optimistic number binop. 498 // Lower to the optimistic number binop.
499 return r.ChangeToSpeculativeOperator( 499 return r.ChangeToSpeculativeOperator(
(...skipping 26 matching lines...) Expand all
526 return r.ChangeToPureOperator(simplified()->NumberMultiply(), 526 return r.ChangeToPureOperator(simplified()->NumberMultiply(),
527 Type::Number()); 527 Type::Number());
528 } 528 }
529 529
530 return NoChange(); 530 return NoChange();
531 } 531 }
532 532
533 Reduction JSTypedLowering::ReduceJSDivide(Node* node) { 533 Reduction JSTypedLowering::ReduceJSDivide(Node* node) {
534 JSBinopReduction r(this, node); 534 JSBinopReduction r(this, node);
535 BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback(); 535 BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback();
536 if (feedback == BinaryOperationHints::kNumberOrUndefined && 536 if (feedback == BinaryOperationHints::kNumberOrOddball &&
537 r.BothInputsAre(Type::PlainPrimitive())) { 537 r.BothInputsAre(Type::PlainPrimitive())) {
538 // JSDivide(x:plain-primitive, 538 // JSDivide(x:plain-primitive,
539 // y:plain-primitive) => NumberDivide(ToNumber(x), ToNumber(y)) 539 // y:plain-primitive) => NumberDivide(ToNumber(x), ToNumber(y))
540 r.ConvertInputsToNumber(); 540 r.ConvertInputsToNumber();
541 return r.ChangeToPureOperator(simplified()->NumberDivide(), Type::Number()); 541 return r.ChangeToPureOperator(simplified()->NumberDivide(), Type::Number());
542 } 542 }
543 if (feedback != BinaryOperationHints::kAny) { 543 if (feedback != BinaryOperationHints::kAny) {
544 return r.ChangeToSpeculativeOperator( 544 return r.ChangeToSpeculativeOperator(
545 simplified()->SpeculativeNumberDivide(feedback), Type::Number()); 545 simplified()->SpeculativeNumberDivide(feedback), Type::Number());
546 } 546 }
547 if (r.BothInputsAre(Type::PlainPrimitive())) { 547 if (r.BothInputsAre(Type::PlainPrimitive())) {
548 // JSDivide(x:plain-primitive, 548 // JSDivide(x:plain-primitive,
549 // y:plain-primitive) => NumberDivide(ToNumber(x), ToNumber(y)) 549 // y:plain-primitive) => NumberDivide(ToNumber(x), ToNumber(y))
550 r.ConvertInputsToNumber(); 550 r.ConvertInputsToNumber();
551 return r.ChangeToPureOperator(simplified()->NumberDivide(), Type::Number()); 551 return r.ChangeToPureOperator(simplified()->NumberDivide(), Type::Number());
552 } 552 }
553 return NoChange(); 553 return NoChange();
554 } 554 }
555 555
556 Reduction JSTypedLowering::ReduceJSModulus(Node* node) { 556 Reduction JSTypedLowering::ReduceJSModulus(Node* node) {
557 JSBinopReduction r(this, node); 557 JSBinopReduction r(this, node);
558 BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback(); 558 BinaryOperationHints::Hint feedback = r.GetNumberBinaryOperationFeedback();
559 if (feedback == BinaryOperationHints::kNumberOrUndefined && 559 if (feedback == BinaryOperationHints::kNumberOrOddball &&
560 r.BothInputsAre(Type::PlainPrimitive())) { 560 r.BothInputsAre(Type::PlainPrimitive())) {
561 // JSModulus(x:plain-primitive, 561 // JSModulus(x:plain-primitive,
562 // y:plain-primitive) => NumberModulus(ToNumber(x), ToNumber(y)) 562 // y:plain-primitive) => NumberModulus(ToNumber(x), ToNumber(y))
563 r.ConvertInputsToNumber(); 563 r.ConvertInputsToNumber();
564 return r.ChangeToPureOperator(simplified()->NumberModulus(), 564 return r.ChangeToPureOperator(simplified()->NumberModulus(),
565 Type::Number()); 565 Type::Number());
566 } 566 }
567 if (feedback != BinaryOperationHints::kAny) { 567 if (feedback != BinaryOperationHints::kAny) {
568 return r.ChangeToSpeculativeOperator( 568 return r.ChangeToSpeculativeOperator(
569 simplified()->SpeculativeNumberModulus(feedback), Type::Number()); 569 simplified()->SpeculativeNumberModulus(feedback), Type::Number());
(...skipping 1489 matching lines...) Expand 10 before | Expand all | Expand 10 after
2059 } 2059 }
2060 2060
2061 2061
2062 CompilationDependencies* JSTypedLowering::dependencies() const { 2062 CompilationDependencies* JSTypedLowering::dependencies() const {
2063 return dependencies_; 2063 return dependencies_;
2064 } 2064 }
2065 2065
2066 } // namespace compiler 2066 } // namespace compiler
2067 } // namespace internal 2067 } // namespace internal
2068 } // namespace v8 2068 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/compiler/representation-change.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698