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

Side by Side Diff: src/compiler/simplified-lowering.cc

Issue 2814013003: [turbofan] Properly represent the float64 hole. (Closed)
Patch Set: Make sure the_hole has the correct hole NaN bit pattern on Win32. Created 3 years, 8 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 | « src/compiler/operation-typer.cc ('k') | src/compiler/typed-optimization.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/compiler/simplified-lowering.h" 5 #include "src/compiler/simplified-lowering.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "src/address-map.h" 9 #include "src/address-map.h"
10 #include "src/base/bits.h" 10 #include "src/base/bits.h"
(...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 info->restriction_type(), graph_zone()); \ 461 info->restriction_type(), graph_zone()); \
462 break; \ 462 break; \
463 } 463 }
464 SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(DECLARE_CASE) 464 SIMPLIFIED_SPECULATIVE_NUMBER_UNOP_LIST(DECLARE_CASE)
465 #undef DECLARE_CASE 465 #undef DECLARE_CASE
466 466
467 case IrOpcode::kPlainPrimitiveToNumber: 467 case IrOpcode::kPlainPrimitiveToNumber:
468 new_type = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0))); 468 new_type = op_typer_.ToNumber(FeedbackTypeOf(node->InputAt(0)));
469 break; 469 break;
470 470
471 case IrOpcode::kCheckFloat64Hole:
472 new_type = Type::Intersect(
473 op_typer_.CheckFloat64Hole(FeedbackTypeOf(node->InputAt(0))),
474 info->restriction_type(), graph_zone());
475 break;
476
477 case IrOpcode::kCheckNumber:
478 new_type = Type::Intersect(
479 op_typer_.CheckNumber(FeedbackTypeOf(node->InputAt(0))),
480 info->restriction_type(), graph_zone());
481 break;
482
471 case IrOpcode::kPhi: { 483 case IrOpcode::kPhi: {
472 new_type = TypePhi(node); 484 new_type = TypePhi(node);
473 if (type != nullptr) { 485 if (type != nullptr) {
474 new_type = Weaken(node, type, new_type); 486 new_type = Weaken(node, type, new_type);
475 } 487 }
476 break; 488 break;
477 } 489 }
478 490
479 case IrOpcode::kTypeGuard: { 491 case IrOpcode::kTypeGuard: {
480 new_type = op_typer_.TypeTypeGuard(node->op(), 492 new_type = op_typer_.TypeTypeGuard(node->op(),
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 int value_count = node->op()->ValueInputCount() + 824 int value_count = node->op()->ValueInputCount() +
813 OperatorProperties::GetContextInputCount(node->op()) + 825 OperatorProperties::GetContextInputCount(node->op()) +
814 OperatorProperties::GetFrameStateInputCount(node->op()); 826 OperatorProperties::GetFrameStateInputCount(node->op());
815 for (int i = 0; i < value_count; i++) { 827 for (int i = 0; i < value_count; i++) {
816 ProcessInput(node, i, UseInfo::None()); 828 ProcessInput(node, i, UseInfo::None());
817 } 829 }
818 ProcessRemainingInputs(node, value_count); 830 ProcessRemainingInputs(node, value_count);
819 if (lower()) Kill(node); 831 if (lower()) Kill(node);
820 } 832 }
821 833
834 // Helper for no-op node.
835 void VisitNoop(Node* node, Truncation truncation) {
836 if (truncation.IsUnused()) return VisitUnused(node);
837 MachineRepresentation representation =
838 GetOutputInfoForPhi(node, TypeOf(node), truncation);
839 VisitUnop(node, UseInfo(representation, truncation), representation);
840 if (lower()) DeferReplacement(node, node->InputAt(0));
841 }
842
822 // Helper for binops of the R x L -> O variety. 843 // Helper for binops of the R x L -> O variety.
823 void VisitBinop(Node* node, UseInfo left_use, UseInfo right_use, 844 void VisitBinop(Node* node, UseInfo left_use, UseInfo right_use,
824 MachineRepresentation output, 845 MachineRepresentation output,
825 Type* restriction_type = Type::Any()) { 846 Type* restriction_type = Type::Any()) {
826 DCHECK_EQ(2, node->op()->ValueInputCount()); 847 DCHECK_EQ(2, node->op()->ValueInputCount());
827 ProcessInput(node, 0, left_use); 848 ProcessInput(node, 0, left_use);
828 ProcessInput(node, 1, right_use); 849 ProcessInput(node, 1, right_use);
829 for (int i = 2; i < node->InputCount(); i++) { 850 for (int i = 2; i < node->InputCount(); i++) {
830 EnqueueInput(node, i); 851 EnqueueInput(node, i);
831 } 852 }
(...skipping 1517 matching lines...) Expand 10 before | Expand all | Expand 10 after
2349 VisitUnop(node, UseInfo::AnyTagged(), 2370 VisitUnop(node, UseInfo::AnyTagged(),
2350 MachineRepresentation::kTaggedPointer); 2371 MachineRepresentation::kTaggedPointer);
2351 if (lower()) DeferReplacement(node, node->InputAt(0)); 2372 if (lower()) DeferReplacement(node, node->InputAt(0));
2352 } else { 2373 } else {
2353 VisitUnop(node, UseInfo::CheckedHeapObjectAsTaggedPointer(), 2374 VisitUnop(node, UseInfo::CheckedHeapObjectAsTaggedPointer(),
2354 MachineRepresentation::kTaggedPointer); 2375 MachineRepresentation::kTaggedPointer);
2355 } 2376 }
2356 return; 2377 return;
2357 } 2378 }
2358 case IrOpcode::kCheckNumber: { 2379 case IrOpcode::kCheckNumber: {
2359 if (InputIs(node, Type::Number())) { 2380 Type* const input_type = TypeOf(node->InputAt(0));
2360 if (truncation.IsUsedAsWord32()) { 2381 if (input_type->Is(Type::Number())) {
2361 VisitUnop(node, UseInfo::TruncatingWord32(), 2382 VisitNoop(node, truncation);
2362 MachineRepresentation::kWord32);
2363 } else {
2364 // TODO(jarin,bmeurer): We need to go to Tagged here, because
2365 // otherwise we cannot distinguish the hole NaN (which might need to
2366 // be treated as undefined). We should have a dedicated Type for
2367 // that at some point, and maybe even a dedicated truncation.
2368 VisitUnop(node, UseInfo::AnyTagged(),
2369 MachineRepresentation::kTagged);
2370 }
2371 if (lower()) DeferReplacement(node, node->InputAt(0));
2372 } else { 2383 } else {
2373 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); 2384 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged);
2374 } 2385 }
2375 return; 2386 return;
2376 } 2387 }
2377 case IrOpcode::kCheckReceiver: { 2388 case IrOpcode::kCheckReceiver: {
2378 if (InputIs(node, Type::Receiver())) { 2389 if (InputIs(node, Type::Receiver())) {
2379 VisitUnop(node, UseInfo::AnyTagged(), 2390 VisitUnop(node, UseInfo::AnyTagged(),
2380 MachineRepresentation::kTaggedPointer); 2391 MachineRepresentation::kTaggedPointer);
2381 if (lower()) DeferReplacement(node, node->InputAt(0)); 2392 if (lower()) DeferReplacement(node, node->InputAt(0));
(...skipping 292 matching lines...) Expand 10 before | Expand all | Expand 10 after
2674 case IrOpcode::kNewUnmappedArgumentsElements: { 2685 case IrOpcode::kNewUnmappedArgumentsElements: {
2675 VisitBinop(node, UseInfo::PointerInt(), UseInfo::TaggedSigned(), 2686 VisitBinop(node, UseInfo::PointerInt(), UseInfo::TaggedSigned(),
2676 MachineRepresentation::kTaggedPointer); 2687 MachineRepresentation::kTaggedPointer);
2677 return; 2688 return;
2678 } 2689 }
2679 case IrOpcode::kArrayBufferWasNeutered: { 2690 case IrOpcode::kArrayBufferWasNeutered: {
2680 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kBit); 2691 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kBit);
2681 return; 2692 return;
2682 } 2693 }
2683 case IrOpcode::kCheckFloat64Hole: { 2694 case IrOpcode::kCheckFloat64Hole: {
2684 CheckFloat64HoleMode mode = CheckFloat64HoleModeOf(node->op()); 2695 Type* const input_type = TypeOf(node->InputAt(0));
2685 ProcessInput(node, 0, UseInfo::TruncatingFloat64()); 2696 if (input_type->Is(Type::Number())) {
2686 ProcessRemainingInputs(node, 1); 2697 VisitNoop(node, truncation);
2687 SetOutput(node, MachineRepresentation::kFloat64); 2698 } else {
2688 if (truncation.IsUsedAsFloat64() && 2699 CheckFloat64HoleMode mode = CheckFloat64HoleModeOf(node->op());
2689 mode == CheckFloat64HoleMode::kAllowReturnHole) { 2700 switch (mode) {
2690 if (lower()) DeferReplacement(node, node->InputAt(0)); 2701 case CheckFloat64HoleMode::kAllowReturnHole:
2702 if (truncation.IsUnused()) return VisitUnused(node);
2703 if (truncation.IsUsedAsWord32()) {
Michael Achenbach 2017/04/12 10:23:01 FYI: According to (64 bit) coverage bot, this cond
Benedikt Meurer 2017/04/12 10:24:18 Not necessarily.
2704 VisitUnop(node, UseInfo::TruncatingWord32(),
2705 MachineRepresentation::kWord32);
2706 if (lower()) DeferReplacement(node, node->InputAt(0));
2707 } else if (truncation.IsUsedAsFloat64()) {
2708 VisitUnop(node, UseInfo::TruncatingFloat64(),
2709 MachineRepresentation::kFloat64);
2710 if (lower()) DeferReplacement(node, node->InputAt(0));
2711 } else {
2712 VisitUnop(
2713 node,
2714 UseInfo(MachineRepresentation::kFloat64, Truncation::Any()),
2715 MachineRepresentation::kFloat64, Type::Number());
2716 }
2717 break;
2718 case CheckFloat64HoleMode::kNeverReturnHole:
2719 VisitUnop(
2720 node,
2721 UseInfo(MachineRepresentation::kFloat64, Truncation::Any()),
2722 MachineRepresentation::kFloat64, Type::Number());
2723 break;
2724 }
2691 } 2725 }
2692 return; 2726 return;
2693 } 2727 }
2694 case IrOpcode::kCheckTaggedHole: { 2728 case IrOpcode::kCheckTaggedHole: {
2695 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged); 2729 VisitUnop(node, UseInfo::AnyTagged(), MachineRepresentation::kTagged);
2696 return; 2730 return;
2697 } 2731 }
2698 case IrOpcode::kConvertTaggedHoleToUndefined: { 2732 case IrOpcode::kConvertTaggedHoleToUndefined: {
2699 if (InputIs(node, Type::NumberOrOddball()) && 2733 if (InputIs(node, Type::NumberOrOddball()) &&
2700 truncation.IsUsedAsWord32()) { 2734 truncation.IsUsedAsWord32()) {
(...skipping 944 matching lines...) Expand 10 before | Expand all | Expand 10 after
3645 isolate(), graph()->zone(), callable.descriptor(), 0, flags, 3679 isolate(), graph()->zone(), callable.descriptor(), 0, flags,
3646 Operator::kNoProperties); 3680 Operator::kNoProperties);
3647 to_number_operator_.set(common()->Call(desc)); 3681 to_number_operator_.set(common()->Call(desc));
3648 } 3682 }
3649 return to_number_operator_.get(); 3683 return to_number_operator_.get();
3650 } 3684 }
3651 3685
3652 } // namespace compiler 3686 } // namespace compiler
3653 } // namespace internal 3687 } // namespace internal
3654 } // namespace v8 3688 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/operation-typer.cc ('k') | src/compiler/typed-optimization.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698