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/simplified-lowering.cc

Issue 2920193004: [turbofan] Improve representation selection for type guard. (Closed)
Patch Set: Created 3 years, 6 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 | test/mjsunit/compiler/regress-726554.js » ('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 712 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 MachineRepresentation representation = GetInfo(node)->representation(); 723 MachineRepresentation representation = GetInfo(node)->representation();
724 return IsAnyTagged(representation); 724 return IsAnyTagged(representation);
725 } 725 }
726 726
727 bool OneInputCannotBe(Node* node, Type* type) { 727 bool OneInputCannotBe(Node* node, Type* type) {
728 DCHECK_EQ(2, node->op()->ValueInputCount()); 728 DCHECK_EQ(2, node->op()->ValueInputCount());
729 return !GetUpperBound(node->InputAt(0))->Maybe(type) || 729 return !GetUpperBound(node->InputAt(0))->Maybe(type) ||
730 !GetUpperBound(node->InputAt(1))->Maybe(type); 730 !GetUpperBound(node->InputAt(1))->Maybe(type);
731 } 731 }
732 732
733 void ConvertInput(Node* node, int index, UseInfo use) { 733 // Converts input {index} of {node} according to given UseInfo {use},
734 // assuming the type of the input is {input_type}. If {input_type} is null,
735 // it takes the input from the input node {TypeOf(node->InputAt(index))}.
736 void ConvertInput(Node* node, int index, UseInfo use,
737 Type* input_type = nullptr) {
734 Node* input = node->InputAt(index); 738 Node* input = node->InputAt(index);
735 // In the change phase, insert a change before the use if necessary. 739 // In the change phase, insert a change before the use if necessary.
736 if (use.representation() == MachineRepresentation::kNone) 740 if (use.representation() == MachineRepresentation::kNone)
737 return; // No input requirement on the use. 741 return; // No input requirement on the use.
738 DCHECK_NOT_NULL(input); 742 DCHECK_NOT_NULL(input);
739 NodeInfo* input_info = GetInfo(input); 743 NodeInfo* input_info = GetInfo(input);
740 MachineRepresentation input_rep = input_info->representation(); 744 MachineRepresentation input_rep = input_info->representation();
741 if (input_rep != use.representation() || 745 if (input_rep != use.representation() ||
742 use.type_check() != TypeCheckKind::kNone) { 746 use.type_check() != TypeCheckKind::kNone) {
743 // Output representation doesn't match usage. 747 // Output representation doesn't match usage.
744 TRACE(" change: #%d:%s(@%d #%d:%s) ", node->id(), node->op()->mnemonic(), 748 TRACE(" change: #%d:%s(@%d #%d:%s) ", node->id(), node->op()->mnemonic(),
745 index, input->id(), input->op()->mnemonic()); 749 index, input->id(), input->op()->mnemonic());
746 TRACE(" from "); 750 TRACE(" from ");
747 PrintOutputInfo(input_info); 751 PrintOutputInfo(input_info);
748 TRACE(" to "); 752 TRACE(" to ");
749 PrintUseInfo(use); 753 PrintUseInfo(use);
750 TRACE("\n"); 754 TRACE("\n");
755 if (input_type == nullptr) {
756 input_type = TypeOf(input);
757 }
751 Node* n = changer_->GetRepresentationFor( 758 Node* n = changer_->GetRepresentationFor(
752 input, input_info->representation(), TypeOf(input), node, use); 759 input, input_info->representation(), input_type, node, use);
753 node->ReplaceInput(index, n); 760 node->ReplaceInput(index, n);
754 } 761 }
755 } 762 }
756 763
757 void ProcessInput(Node* node, int index, UseInfo use) { 764 void ProcessInput(Node* node, int index, UseInfo use) {
758 switch (phase_) { 765 switch (phase_) {
759 case PROPAGATE: 766 case PROPAGATE:
760 EnqueueInput(node, index, use); 767 EnqueueInput(node, index, use);
761 break; 768 break;
762 case RETYPE: 769 case RETYPE:
(...skipping 2047 matching lines...) Expand 10 before | Expand all | Expand 10 after
2810 MachineRepresentation::kFloat64); 2817 MachineRepresentation::kFloat64);
2811 if (lower()) NodeProperties::ChangeOp(node, Float64Op(node)); 2818 if (lower()) NodeProperties::ChangeOp(node, Float64Op(node));
2812 return; 2819 return;
2813 case IrOpcode::kFrameState: 2820 case IrOpcode::kFrameState:
2814 return VisitFrameState(node); 2821 return VisitFrameState(node);
2815 case IrOpcode::kStateValues: 2822 case IrOpcode::kStateValues:
2816 return VisitStateValues(node); 2823 return VisitStateValues(node);
2817 case IrOpcode::kObjectState: 2824 case IrOpcode::kObjectState:
2818 return VisitObjectState(node); 2825 return VisitObjectState(node);
2819 case IrOpcode::kTypeGuard: { 2826 case IrOpcode::kTypeGuard: {
2820 // We just get rid of the sigma here. In principle, it should be 2827 // We just get rid of the sigma here, choosing the best representation
2821 // possible to refine the truncation and representation based on 2828 // for the sigma's type.
2822 // the sigma's type. 2829 Type* type = TypeOf(node);
2823 MachineRepresentation representation = 2830 MachineRepresentation representation =
2824 GetOutputInfoForPhi(node, TypeOf(node->InputAt(0)), truncation); 2831 GetOutputInfoForPhi(node, type, truncation);
2825 2832
2826 // For now, we just handle specially the impossible case. 2833 // Here we pretend that the input has the sigma's type for the
2827 MachineRepresentation output = TypeOf(node)->IsInhabited() 2834 // conversion.
2828 ? representation 2835 UseInfo use(representation, truncation);
2829 : MachineRepresentation::kNone; 2836 if (propagate()) {
2830 2837 EnqueueInput(node, 0, use);
2831 VisitUnop(node, UseInfo(representation, truncation), output); 2838 } else if (lower()) {
2839 ConvertInput(node, 0, use, type);
2840 }
2841 ProcessRemainingInputs(node, 1);
2842 SetOutput(node, representation);
2832 if (lower()) DeferReplacement(node, node->InputAt(0)); 2843 if (lower()) DeferReplacement(node, node->InputAt(0));
2833 return; 2844 return;
2834 } 2845 }
2835 2846
2836 case IrOpcode::kFinishRegion: 2847 case IrOpcode::kFinishRegion:
2837 VisitInputs(node); 2848 VisitInputs(node);
2838 // Assume the output is tagged pointer. 2849 // Assume the output is tagged pointer.
2839 return SetOutput(node, MachineRepresentation::kTaggedPointer); 2850 return SetOutput(node, MachineRepresentation::kTaggedPointer);
2840 2851
2841 case IrOpcode::kReturn: 2852 case IrOpcode::kReturn:
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after
3720 isolate(), graph()->zone(), callable.descriptor(), 0, flags, 3731 isolate(), graph()->zone(), callable.descriptor(), 0, flags,
3721 Operator::kNoProperties); 3732 Operator::kNoProperties);
3722 to_number_operator_.set(common()->Call(desc)); 3733 to_number_operator_.set(common()->Call(desc));
3723 } 3734 }
3724 return to_number_operator_.get(); 3735 return to_number_operator_.get();
3725 } 3736 }
3726 3737
3727 } // namespace compiler 3738 } // namespace compiler
3728 } // namespace internal 3739 } // namespace internal
3729 } // namespace v8 3740 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/compiler/regress-726554.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698