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

Side by Side Diff: src/hydrogen-instructions.h

Issue 21348002: Avoid the use of set_type() in instruction constructors. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 4 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/hydrogen-instructions.cc » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1434 matching lines...) Expand 10 before | Expand all | Expand 10 after
1445 virtual Representation RequiredInputRepresentation(int index) { 1445 virtual Representation RequiredInputRepresentation(int index) {
1446 return Representation::None(); 1446 return Representation::None();
1447 } 1447 }
1448 1448
1449 DECLARE_CONCRETE_INSTRUCTION(BlockEntry) 1449 DECLARE_CONCRETE_INSTRUCTION(BlockEntry)
1450 }; 1450 };
1451 1451
1452 1452
1453 class HDummyUse: public HTemplateInstruction<1> { 1453 class HDummyUse: public HTemplateInstruction<1> {
1454 public: 1454 public:
1455 explicit HDummyUse(HValue* value) { 1455 explicit HDummyUse(HValue* value)
1456 : HTemplateInstruction<1>(HType::Smi()) {
1456 SetOperandAt(0, value); 1457 SetOperandAt(0, value);
1457 // Pretend to be a Smi so that the HChange instructions inserted 1458 // Pretend to be a Smi so that the HChange instructions inserted
1458 // before any use generate as little code as possible. 1459 // before any use generate as little code as possible.
1459 set_representation(Representation::Tagged()); 1460 set_representation(Representation::Tagged());
1460 set_type(HType::Smi());
1461 } 1461 }
1462 1462
1463 HValue* value() { return OperandAt(0); } 1463 HValue* value() { return OperandAt(0); }
1464 1464
1465 virtual bool HasEscapingOperandAt(int index) { return false; } 1465 virtual bool HasEscapingOperandAt(int index) { return false; }
1466 virtual Representation RequiredInputRepresentation(int index) { 1466 virtual Representation RequiredInputRepresentation(int index) {
1467 return Representation::None(); 1467 return Representation::None();
1468 } 1468 }
1469 1469
1470 virtual void PrintDataTo(StringStream* stream); 1470 virtual void PrintDataTo(StringStream* stream);
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
1659 virtual Representation RequiredInputRepresentation(int index) { 1659 virtual Representation RequiredInputRepresentation(int index) {
1660 return Representation::None(); 1660 return Representation::None();
1661 } 1661 }
1662 1662
1663 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit) 1663 DECLARE_CONCRETE_INSTRUCTION(AbnormalExit)
1664 }; 1664 };
1665 1665
1666 1666
1667 class HUnaryOperation: public HTemplateInstruction<1> { 1667 class HUnaryOperation: public HTemplateInstruction<1> {
1668 public: 1668 public:
1669 explicit HUnaryOperation(HValue* value) { 1669 HUnaryOperation(HValue* value, HType type = HType::Tagged())
1670 : HTemplateInstruction<1>(type) {
1670 SetOperandAt(0, value); 1671 SetOperandAt(0, value);
1671 } 1672 }
1672 1673
1673 static HUnaryOperation* cast(HValue* value) { 1674 static HUnaryOperation* cast(HValue* value) {
1674 return reinterpret_cast<HUnaryOperation*>(value); 1675 return reinterpret_cast<HUnaryOperation*>(value);
1675 } 1676 }
1676 1677
1677 HValue* value() const { return OperandAt(0); } 1678 HValue* value() const { return OperandAt(0); }
1678 virtual void PrintDataTo(StringStream* stream); 1679 virtual void PrintDataTo(StringStream* stream);
1679 }; 1680 };
(...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after
2504 DECLARE_CONCRETE_INSTRUCTION(CallRuntime) 2505 DECLARE_CONCRETE_INSTRUCTION(CallRuntime)
2505 2506
2506 private: 2507 private:
2507 const Runtime::Function* c_function_; 2508 const Runtime::Function* c_function_;
2508 Handle<String> name_; 2509 Handle<String> name_;
2509 }; 2510 };
2510 2511
2511 2512
2512 class HMapEnumLength: public HUnaryOperation { 2513 class HMapEnumLength: public HUnaryOperation {
2513 public: 2514 public:
2514 explicit HMapEnumLength(HValue* value) : HUnaryOperation(value) { 2515 explicit HMapEnumLength(HValue* value)
2515 set_type(HType::Smi()); 2516 : HUnaryOperation(value, HType::Smi()) {
2516 set_representation(Representation::Smi()); 2517 set_representation(Representation::Smi());
2517 SetFlag(kUseGVN); 2518 SetFlag(kUseGVN);
2518 SetGVNFlag(kDependsOnMaps); 2519 SetGVNFlag(kDependsOnMaps);
2519 } 2520 }
2520 2521
2521 virtual Representation RequiredInputRepresentation(int index) { 2522 virtual Representation RequiredInputRepresentation(int index) {
2522 return Representation::Tagged(); 2523 return Representation::Tagged();
2523 } 2524 }
2524 2525
2525 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength) 2526 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength)
(...skipping 23 matching lines...) Expand all
2549 protected: 2550 protected:
2550 virtual bool DataEquals(HValue* other) { return true; } 2551 virtual bool DataEquals(HValue* other) { return true; }
2551 2552
2552 private: 2553 private:
2553 virtual bool IsDeletable() const { return true; } 2554 virtual bool IsDeletable() const { return true; }
2554 }; 2555 };
2555 2556
2556 2557
2557 class HBitNot: public HUnaryOperation { 2558 class HBitNot: public HUnaryOperation {
2558 public: 2559 public:
2559 explicit HBitNot(HValue* value) : HUnaryOperation(value) { 2560 explicit HBitNot(HValue* value)
2561 : HUnaryOperation(value, HType::TaggedNumber()) {
2560 set_representation(Representation::Integer32()); 2562 set_representation(Representation::Integer32());
2561 SetFlag(kUseGVN); 2563 SetFlag(kUseGVN);
2562 SetFlag(kTruncatingToInt32); 2564 SetFlag(kTruncatingToInt32);
2563 SetFlag(kAllowUndefinedAsNaN); 2565 SetFlag(kAllowUndefinedAsNaN);
2564 set_type(HType::TaggedNumber());
2565 } 2566 }
2566 2567
2567 virtual Representation RequiredInputRepresentation(int index) { 2568 virtual Representation RequiredInputRepresentation(int index) {
2568 return Representation::Integer32(); 2569 return Representation::Integer32();
2569 } 2570 }
2570 virtual Representation observed_input_representation(int index) { 2571 virtual Representation observed_input_representation(int index) {
2571 return Representation::Integer32(); 2572 return Representation::Integer32();
2572 } 2573 }
2573 2574
2574 virtual HValue* Canonicalize(); 2575 virtual HValue* Canonicalize();
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2632 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation) 2633 DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation)
2633 2634
2634 protected: 2635 protected:
2635 virtual bool DataEquals(HValue* other) { 2636 virtual bool DataEquals(HValue* other) {
2636 HUnaryMathOperation* b = HUnaryMathOperation::cast(other); 2637 HUnaryMathOperation* b = HUnaryMathOperation::cast(other);
2637 return op_ == b->op(); 2638 return op_ == b->op();
2638 } 2639 }
2639 2640
2640 private: 2641 private:
2641 HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op) 2642 HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op)
2642 : op_(op) { 2643 : HTemplateInstruction<2>(HType::TaggedNumber()), op_(op) {
2643 SetOperandAt(0, context); 2644 SetOperandAt(0, context);
2644 SetOperandAt(1, value); 2645 SetOperandAt(1, value);
2645 switch (op) { 2646 switch (op) {
2646 case kMathFloor: 2647 case kMathFloor:
2647 case kMathRound: 2648 case kMathRound:
2648 // TODO(verwaest): Set representation to flexible int starting as smi. 2649 // TODO(verwaest): Set representation to flexible int starting as smi.
2649 set_representation(Representation::Integer32()); 2650 set_representation(Representation::Integer32());
2650 break; 2651 break;
2651 case kMathAbs: 2652 case kMathAbs:
2652 // Not setting representation here: it is None intentionally. 2653 // Not setting representation here: it is None intentionally.
(...skipping 13 matching lines...) Expand all
2666 case kMathExp: 2667 case kMathExp:
2667 case kMathSqrt: 2668 case kMathSqrt:
2668 case kMathPowHalf: 2669 case kMathPowHalf:
2669 set_representation(Representation::Double()); 2670 set_representation(Representation::Double());
2670 break; 2671 break;
2671 default: 2672 default:
2672 UNREACHABLE(); 2673 UNREACHABLE();
2673 } 2674 }
2674 SetFlag(kUseGVN); 2675 SetFlag(kUseGVN);
2675 SetFlag(kAllowUndefinedAsNaN); 2676 SetFlag(kAllowUndefinedAsNaN);
2676 set_type(HType::TaggedNumber());
2677 } 2677 }
2678 2678
2679 virtual bool IsDeletable() const { return true; } 2679 virtual bool IsDeletable() const { return true; }
2680 2680
2681 BuiltinFunctionId op_; 2681 BuiltinFunctionId op_;
2682 }; 2682 };
2683 2683
2684 2684
2685 class HLoadExternalArrayPointer: public HUnaryOperation { 2685 class HLoadExternalArrayPointer: public HUnaryOperation {
2686 public: 2686 public:
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2758 if (map_unique_ids_.at(i) != b->map_unique_ids_.at(i)) { 2758 if (map_unique_ids_.at(i) != b->map_unique_ids_.at(i)) {
2759 return false; 2759 return false;
2760 } 2760 }
2761 } 2761 }
2762 return true; 2762 return true;
2763 } 2763 }
2764 2764
2765 private: 2765 private:
2766 // Clients should use one of the static New* methods above. 2766 // Clients should use one of the static New* methods above.
2767 HCheckMaps(HValue* value, Zone *zone, HValue* typecheck) 2767 HCheckMaps(HValue* value, Zone *zone, HValue* typecheck)
2768 : omit_(false), map_unique_ids_(0, zone) { 2768 : HTemplateInstruction<2>(value->type()),
2769 omit_(false), map_unique_ids_(0, zone) {
2769 SetOperandAt(0, value); 2770 SetOperandAt(0, value);
2770 // Use the object value for the dependency if NULL is passed. 2771 // Use the object value for the dependency if NULL is passed.
2771 // TODO(titzer): do GVN flags already express this dependency? 2772 // TODO(titzer): do GVN flags already express this dependency?
2772 SetOperandAt(1, typecheck != NULL ? typecheck : value); 2773 SetOperandAt(1, typecheck != NULL ? typecheck : value);
2773 set_representation(Representation::Tagged()); 2774 set_representation(Representation::Tagged());
2774 SetFlag(kUseGVN); 2775 SetFlag(kUseGVN);
2775 SetFlag(kTrackSideEffectDominators); 2776 SetFlag(kTrackSideEffectDominators);
2776 SetGVNFlag(kDependsOnMaps); 2777 SetGVNFlag(kDependsOnMaps);
2777 SetGVNFlag(kDependsOnElementsKind); 2778 SetGVNFlag(kDependsOnElementsKind);
2778 set_type(value->type());
2779 } 2779 }
2780 2780
2781 void omit(CompilationInfo* info) { 2781 void omit(CompilationInfo* info) {
2782 omit_ = true; 2782 omit_ = true;
2783 for (int i = 0; i < map_set_.length(); i++) { 2783 for (int i = 0; i < map_set_.length(); i++) {
2784 Handle<Map> map = map_set_.at(i); 2784 Handle<Map> map = map_set_.at(i);
2785 map->AddDependentCompilationInfo(DependentCode::kPrototypeCheckGroup, 2785 map->AddDependentCompilationInfo(DependentCode::kPrototypeCheckGroup,
2786 info); 2786 info);
2787 } 2787 }
2788 } 2788 }
2789 2789
2790 bool omit_; 2790 bool omit_;
2791 SmallMapList map_set_; 2791 SmallMapList map_set_;
2792 ZoneList<UniqueValueId> map_unique_ids_; 2792 ZoneList<UniqueValueId> map_unique_ids_;
2793 }; 2793 };
2794 2794
2795 2795
2796 class HCheckFunction: public HUnaryOperation { 2796 class HCheckFunction: public HUnaryOperation {
2797 public: 2797 public:
2798 HCheckFunction(HValue* value, Handle<JSFunction> function) 2798 HCheckFunction(HValue* value, Handle<JSFunction> function)
2799 : HUnaryOperation(value), target_(function), target_unique_id_() { 2799 : HUnaryOperation(value, value->type()),
2800 target_(function), target_unique_id_() {
2800 set_representation(Representation::Tagged()); 2801 set_representation(Representation::Tagged());
2801 SetFlag(kUseGVN); 2802 SetFlag(kUseGVN);
2802 target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function); 2803 target_in_new_space_ = Isolate::Current()->heap()->InNewSpace(*function);
2803 set_type(value->type());
2804 } 2804 }
2805 2805
2806 virtual Representation RequiredInputRepresentation(int index) { 2806 virtual Representation RequiredInputRepresentation(int index) {
2807 return Representation::Tagged(); 2807 return Representation::Tagged();
2808 } 2808 }
2809 virtual void PrintDataTo(StringStream* stream); 2809 virtual void PrintDataTo(StringStream* stream);
2810 2810
2811 virtual HValue* Canonicalize(); 2811 virtual HValue* Canonicalize();
2812 2812
2813 #ifdef DEBUG 2813 #ifdef DEBUG
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
2891 set_representation(Representation::Tagged()); 2891 set_representation(Representation::Tagged());
2892 SetFlag(kUseGVN); 2892 SetFlag(kUseGVN);
2893 } 2893 }
2894 2894
2895 const Check check_; 2895 const Check check_;
2896 }; 2896 };
2897 2897
2898 2898
2899 class HCheckSmi: public HUnaryOperation { 2899 class HCheckSmi: public HUnaryOperation {
2900 public: 2900 public:
2901 explicit HCheckSmi(HValue* value) : HUnaryOperation(value) { 2901 explicit HCheckSmi(HValue* value) : HUnaryOperation(value, HType::Smi()) {
2902 set_representation(Representation::Smi()); 2902 set_representation(Representation::Smi());
2903 SetFlag(kUseGVN); 2903 SetFlag(kUseGVN);
2904 set_type(HType::Smi());
2905 } 2904 }
2906 2905
2907 virtual Representation RequiredInputRepresentation(int index) { 2906 virtual Representation RequiredInputRepresentation(int index) {
2908 return Representation::Tagged(); 2907 return Representation::Tagged();
2909 } 2908 }
2910 2909
2911 virtual HValue* Canonicalize() { 2910 virtual HValue* Canonicalize() {
2912 HType value_type = value()->type(); 2911 HType value_type = value()->type();
2913 if (value_type.IsSmi()) { 2912 if (value_type.IsSmi()) {
2914 return NULL; 2913 return NULL;
(...skipping 18 matching lines...) Expand all
2933 virtual Representation RequiredInputRepresentation(int index) { 2932 virtual Representation RequiredInputRepresentation(int index) {
2934 return Representation::None(); 2933 return Representation::None();
2935 } 2934 }
2936 2935
2937 DECLARE_CONCRETE_INSTRUCTION(IsNumberAndBranch) 2936 DECLARE_CONCRETE_INSTRUCTION(IsNumberAndBranch)
2938 }; 2937 };
2939 2938
2940 2939
2941 class HCheckHeapObject: public HUnaryOperation { 2940 class HCheckHeapObject: public HUnaryOperation {
2942 public: 2941 public:
2943 explicit HCheckHeapObject(HValue* value) : HUnaryOperation(value) { 2942 explicit HCheckHeapObject(HValue* value)
2943 : HUnaryOperation(value, HType::NonPrimitive()) {
2944 set_representation(Representation::Tagged()); 2944 set_representation(Representation::Tagged());
2945 SetFlag(kUseGVN); 2945 SetFlag(kUseGVN);
2946 set_type(HType::NonPrimitive());
2947 } 2946 }
2948 2947
2949 virtual Representation RequiredInputRepresentation(int index) { 2948 virtual Representation RequiredInputRepresentation(int index) {
2950 return Representation::Tagged(); 2949 return Representation::Tagged();
2951 } 2950 }
2952 2951
2953 #ifdef DEBUG 2952 #ifdef DEBUG
2954 virtual void Verify(); 2953 virtual void Verify();
2955 #endif 2954 #endif
2956 2955
(...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after
3691 bool is_cell_ : 1; 3690 bool is_cell_ : 1;
3692 bool boolean_value_ : 1; 3691 bool boolean_value_ : 1;
3693 int32_t int32_value_; 3692 int32_t int32_value_;
3694 double double_value_; 3693 double double_value_;
3695 ExternalReference external_reference_value_; 3694 ExternalReference external_reference_value_;
3696 }; 3695 };
3697 3696
3698 3697
3699 class HBinaryOperation: public HTemplateInstruction<3> { 3698 class HBinaryOperation: public HTemplateInstruction<3> {
3700 public: 3699 public:
3701 HBinaryOperation(HValue* context, HValue* left, HValue* right) 3700 HBinaryOperation(HValue* context, HValue* left, HValue* right,
3702 : observed_output_representation_(Representation::None()) { 3701 HType type = HType::Tagged())
3702 : HTemplateInstruction<3>(type),
3703 observed_output_representation_(Representation::None()) {
3703 ASSERT(left != NULL && right != NULL); 3704 ASSERT(left != NULL && right != NULL);
3704 SetOperandAt(0, context); 3705 SetOperandAt(0, context);
3705 SetOperandAt(1, left); 3706 SetOperandAt(1, left);
3706 SetOperandAt(2, right); 3707 SetOperandAt(2, right);
3707 observed_input_representation_[0] = Representation::None(); 3708 observed_input_representation_[0] = Representation::None();
3708 observed_input_representation_[1] = Representation::None(); 3709 observed_input_representation_[1] = Representation::None();
3709 } 3710 }
3710 3711
3711 HValue* context() const { return OperandAt(0); } 3712 HValue* context() const { return OperandAt(0); }
3712 HValue* left() const { return OperandAt(1); } 3713 HValue* left() const { return OperandAt(1); }
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
4043 bounds_check()->SetResponsibilityForRange(direction); 4044 bounds_check()->SetResponsibilityForRange(direction);
4044 } 4045 }
4045 virtual void TryGuaranteeRangeChanging(RangeEvaluationContext* context) { 4046 virtual void TryGuaranteeRangeChanging(RangeEvaluationContext* context) {
4046 bounds_check()->TryGuaranteeRangeChanging(context); 4047 bounds_check()->TryGuaranteeRangeChanging(context);
4047 } 4048 }
4048 }; 4049 };
4049 4050
4050 4051
4051 class HBitwiseBinaryOperation: public HBinaryOperation { 4052 class HBitwiseBinaryOperation: public HBinaryOperation {
4052 public: 4053 public:
4053 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right) 4054 HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right,
4054 : HBinaryOperation(context, left, right) { 4055 HType type = HType::Tagged())
4056 : HBinaryOperation(context, left, right, type) {
4055 SetFlag(kFlexibleRepresentation); 4057 SetFlag(kFlexibleRepresentation);
4056 SetFlag(kTruncatingToInt32); 4058 SetFlag(kTruncatingToInt32);
4057 SetFlag(kAllowUndefinedAsNaN); 4059 SetFlag(kAllowUndefinedAsNaN);
4058 SetAllSideEffects(); 4060 SetAllSideEffects();
4059 } 4061 }
4060 4062
4061 virtual void RepresentationChanged(Representation to) { 4063 virtual void RepresentationChanged(Representation to) {
4062 if (!to.IsTagged()) { 4064 if (!to.IsTagged()) {
4063 ASSERT(to.IsSmiOrInteger32()); 4065 ASSERT(to.IsSmiOrInteger32());
4064 ClearAllSideEffects(); 4066 ClearAllSideEffects();
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
4120 virtual bool DataEquals(HValue* other) { return true; } 4122 virtual bool DataEquals(HValue* other) { return true; }
4121 4123
4122 private: 4124 private:
4123 virtual bool IsDeletable() const { return true; } 4125 virtual bool IsDeletable() const { return true; }
4124 }; 4126 };
4125 4127
4126 4128
4127 class HArithmeticBinaryOperation: public HBinaryOperation { 4129 class HArithmeticBinaryOperation: public HBinaryOperation {
4128 public: 4130 public:
4129 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right) 4131 HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right)
4130 : HBinaryOperation(context, left, right) { 4132 : HBinaryOperation(context, left, right, HType::TaggedNumber()) {
4131 SetAllSideEffects(); 4133 SetAllSideEffects();
4132 SetFlag(kFlexibleRepresentation); 4134 SetFlag(kFlexibleRepresentation);
4133 SetFlag(kAllowUndefinedAsNaN); 4135 SetFlag(kAllowUndefinedAsNaN);
4134 set_type(HType::TaggedNumber());
4135 } 4136 }
4136 4137
4137 virtual void RepresentationChanged(Representation to) { 4138 virtual void RepresentationChanged(Representation to) {
4138 if (to.IsTagged()) { 4139 if (to.IsTagged()) {
4139 SetAllSideEffects(); 4140 SetAllSideEffects();
4140 ClearFlag(kUseGVN); 4141 ClearFlag(kUseGVN);
4141 } else { 4142 } else {
4142 ClearAllSideEffects(); 4143 ClearAllSideEffects();
4143 SetFlag(kUseGVN); 4144 SetFlag(kUseGVN);
4144 } 4145 }
4145 } 4146 }
4146 4147
4147 DECLARE_ABSTRACT_INSTRUCTION(ArithmeticBinaryOperation) 4148 DECLARE_ABSTRACT_INSTRUCTION(ArithmeticBinaryOperation)
4148 4149
4149 private: 4150 private:
4150 virtual bool IsDeletable() const { return true; } 4151 virtual bool IsDeletable() const { return true; }
4151 }; 4152 };
4152 4153
4153 4154
4154 class HCompareGeneric: public HBinaryOperation { 4155 class HCompareGeneric: public HBinaryOperation {
4155 public: 4156 public:
4156 HCompareGeneric(HValue* context, 4157 HCompareGeneric(HValue* context,
4157 HValue* left, 4158 HValue* left,
4158 HValue* right, 4159 HValue* right,
4159 Token::Value token) 4160 Token::Value token)
4160 : HBinaryOperation(context, left, right), token_(token) { 4161 : HBinaryOperation(context, left, right, HType::Boolean()),
4162 token_(token) {
4161 ASSERT(Token::IsCompareOp(token)); 4163 ASSERT(Token::IsCompareOp(token));
4162 set_representation(Representation::Tagged()); 4164 set_representation(Representation::Tagged());
4163 set_type(HType::Boolean());
4164 SetAllSideEffects(); 4165 SetAllSideEffects();
4165 } 4166 }
4166 4167
4167 virtual Representation RequiredInputRepresentation(int index) { 4168 virtual Representation RequiredInputRepresentation(int index) {
4168 return index == 0 4169 return index == 0
4169 ? Representation::Tagged() 4170 ? Representation::Tagged()
4170 : representation(); 4171 : representation();
4171 } 4172 }
4172 4173
4173 Token::Value token() const { return token_; } 4174 Token::Value token() const { return token_; }
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
4441 } 4442 }
4442 4443
4443 private: 4444 private:
4444 Handle<String> type_literal_; 4445 Handle<String> type_literal_;
4445 }; 4446 };
4446 4447
4447 4448
4448 class HInstanceOf: public HBinaryOperation { 4449 class HInstanceOf: public HBinaryOperation {
4449 public: 4450 public:
4450 HInstanceOf(HValue* context, HValue* left, HValue* right) 4451 HInstanceOf(HValue* context, HValue* left, HValue* right)
4451 : HBinaryOperation(context, left, right) { 4452 : HBinaryOperation(context, left, right, HType::Boolean()) {
4452 set_representation(Representation::Tagged()); 4453 set_representation(Representation::Tagged());
4453 set_type(HType::Boolean());
4454 SetAllSideEffects(); 4454 SetAllSideEffects();
4455 } 4455 }
4456 4456
4457 virtual Representation RequiredInputRepresentation(int index) { 4457 virtual Representation RequiredInputRepresentation(int index) {
4458 return Representation::Tagged(); 4458 return Representation::Tagged();
4459 } 4459 }
4460 4460
4461 virtual void PrintDataTo(StringStream* stream); 4461 virtual void PrintDataTo(StringStream* stream);
4462 4462
4463 DECLARE_CONCRETE_INSTRUCTION(InstanceOf) 4463 DECLARE_CONCRETE_INSTRUCTION(InstanceOf)
4464 }; 4464 };
4465 4465
4466 4466
4467 class HInstanceOfKnownGlobal: public HTemplateInstruction<2> { 4467 class HInstanceOfKnownGlobal: public HTemplateInstruction<2> {
4468 public: 4468 public:
4469 HInstanceOfKnownGlobal(HValue* context, 4469 HInstanceOfKnownGlobal(HValue* context,
4470 HValue* left, 4470 HValue* left,
4471 Handle<JSFunction> right) 4471 Handle<JSFunction> right)
4472 : function_(right) { 4472 : HTemplateInstruction<2>(HType::Boolean()), function_(right) {
4473 SetOperandAt(0, context); 4473 SetOperandAt(0, context);
4474 SetOperandAt(1, left); 4474 SetOperandAt(1, left);
4475 set_type(HType::Boolean());
4476 set_representation(Representation::Tagged()); 4475 set_representation(Representation::Tagged());
4477 SetAllSideEffects(); 4476 SetAllSideEffects();
4478 } 4477 }
4479 4478
4480 HValue* context() { return OperandAt(0); } 4479 HValue* context() { return OperandAt(0); }
4481 HValue* left() { return OperandAt(1); } 4480 HValue* left() { return OperandAt(1); }
4482 Handle<JSFunction> function() { return function_; } 4481 Handle<JSFunction> function() { return function_; }
4483 4482
4484 virtual Representation RequiredInputRepresentation(int index) { 4483 virtual Representation RequiredInputRepresentation(int index) {
4485 return Representation::Tagged(); 4484 return Representation::Tagged();
(...skipping 380 matching lines...) Expand 10 before | Expand all | Expand 10 after
4866 4865
4867 protected: 4866 protected:
4868 virtual bool DataEquals(HValue* other) { 4867 virtual bool DataEquals(HValue* other) {
4869 return op() == HBitwise::cast(other)->op(); 4868 return op() == HBitwise::cast(other)->op();
4870 } 4869 }
4871 4870
4872 virtual Range* InferRange(Zone* zone); 4871 virtual Range* InferRange(Zone* zone);
4873 4872
4874 private: 4873 private:
4875 HBitwise(Token::Value op, HValue* context, HValue* left, HValue* right) 4874 HBitwise(Token::Value op, HValue* context, HValue* left, HValue* right)
4876 : HBitwiseBinaryOperation(context, left, right), op_(op) { 4875 : HBitwiseBinaryOperation(context, left, right, HType::TaggedNumber()),
4876 op_(op) {
4877 ASSERT(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR); 4877 ASSERT(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR);
4878 // BIT_AND with a smi-range positive value will always unset the 4878 // BIT_AND with a smi-range positive value will always unset the
4879 // entire sign-extension of the smi-sign. 4879 // entire sign-extension of the smi-sign.
4880 if (op == Token::BIT_AND && 4880 if (op == Token::BIT_AND &&
4881 ((left->IsConstant() && 4881 ((left->IsConstant() &&
4882 left->representation().IsSmi() && 4882 left->representation().IsSmi() &&
4883 HConstant::cast(left)->Integer32Value() >= 0) || 4883 HConstant::cast(left)->Integer32Value() >= 0) ||
4884 (right->IsConstant() && 4884 (right->IsConstant() &&
4885 right->representation().IsSmi() && 4885 right->representation().IsSmi() &&
4886 HConstant::cast(right)->Integer32Value() >= 0))) { 4886 HConstant::cast(right)->Integer32Value() >= 0))) {
4887 SetFlag(kTruncatingToSmi); 4887 SetFlag(kTruncatingToSmi);
4888 // BIT_OR with a smi-range negative value will always set the entire 4888 // BIT_OR with a smi-range negative value will always set the entire
4889 // sign-extension of the smi-sign. 4889 // sign-extension of the smi-sign.
4890 } else if (op == Token::BIT_OR && 4890 } else if (op == Token::BIT_OR &&
4891 ((left->IsConstant() && 4891 ((left->IsConstant() &&
4892 left->representation().IsSmi() && 4892 left->representation().IsSmi() &&
4893 HConstant::cast(left)->Integer32Value() < 0) || 4893 HConstant::cast(left)->Integer32Value() < 0) ||
4894 (right->IsConstant() && 4894 (right->IsConstant() &&
4895 right->representation().IsSmi() && 4895 right->representation().IsSmi() &&
4896 HConstant::cast(right)->Integer32Value() < 0))) { 4896 HConstant::cast(right)->Integer32Value() < 0))) {
4897 SetFlag(kTruncatingToSmi); 4897 SetFlag(kTruncatingToSmi);
4898 } 4898 }
4899 set_type(HType::TaggedNumber());
4900 } 4899 }
4901 4900
4902 Token::Value op_; 4901 Token::Value op_;
4903 }; 4902 };
4904 4903
4905 4904
4906 class HShl: public HBitwiseBinaryOperation { 4905 class HShl: public HBitwiseBinaryOperation {
4907 public: 4906 public:
4908 static HInstruction* New(Zone* zone, 4907 static HInstruction* New(Zone* zone,
4909 HValue* context, 4908 HValue* context,
(...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after
5231 bool for_typeof_; 5230 bool for_typeof_;
5232 }; 5231 };
5233 5232
5234 5233
5235 class HAllocate: public HTemplateInstruction<2> { 5234 class HAllocate: public HTemplateInstruction<2> {
5236 public: 5235 public:
5237 HAllocate(HValue* context, 5236 HAllocate(HValue* context,
5238 HValue* size, 5237 HValue* size,
5239 HType type, 5238 HType type,
5240 bool pretenure, 5239 bool pretenure,
5241 ElementsKind kind = FAST_ELEMENTS) { 5240 ElementsKind kind = FAST_ELEMENTS)
5241 : HTemplateInstruction<2>(type) {
5242 SetOperandAt(0, context); 5242 SetOperandAt(0, context);
5243 SetOperandAt(1, size); 5243 SetOperandAt(1, size);
5244 set_type(type);
5245 set_representation(Representation::Tagged()); 5244 set_representation(Representation::Tagged());
5246 SetFlag(kTrackSideEffectDominators); 5245 SetFlag(kTrackSideEffectDominators);
5247 SetGVNFlag(kChangesNewSpacePromotion); 5246 SetGVNFlag(kChangesNewSpacePromotion);
5248 SetGVNFlag(kDependsOnNewSpacePromotion); 5247 SetGVNFlag(kDependsOnNewSpacePromotion);
5249 if (pretenure) { 5248 if (pretenure) {
5250 if (IsFastDoubleElementsKind(kind)) { 5249 if (IsFastDoubleElementsKind(kind)) {
5251 flags_ = static_cast<HAllocate::Flags>(ALLOCATE_IN_OLD_DATA_SPACE | 5250 flags_ = static_cast<HAllocate::Flags>(ALLOCATE_IN_OLD_DATA_SPACE |
5252 ALLOCATE_DOUBLE_ALIGNED); 5251 ALLOCATE_DOUBLE_ALIGNED);
5253 } else { 5252 } else {
5254 flags_ = ALLOCATE_IN_OLD_POINTER_SPACE; 5253 flags_ = ALLOCATE_IN_OLD_POINTER_SPACE;
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
5333 }; 5332 };
5334 5333
5335 Flags flags_; 5334 Flags flags_;
5336 Handle<Map> known_initial_map_; 5335 Handle<Map> known_initial_map_;
5337 }; 5336 };
5338 5337
5339 5338
5340 class HInnerAllocatedObject: public HTemplateInstruction<1> { 5339 class HInnerAllocatedObject: public HTemplateInstruction<1> {
5341 public: 5340 public:
5342 HInnerAllocatedObject(HValue* value, int offset, HType type = HType::Tagged()) 5341 HInnerAllocatedObject(HValue* value, int offset, HType type = HType::Tagged())
5343 : offset_(offset) { 5342 : HTemplateInstruction<1>(type), offset_(offset) {
5344 ASSERT(value->IsAllocate()); 5343 ASSERT(value->IsAllocate());
5345 SetOperandAt(0, value); 5344 SetOperandAt(0, value);
5346 set_type(type);
5347 set_representation(Representation::Tagged()); 5345 set_representation(Representation::Tagged());
5348 } 5346 }
5349 5347
5350 HValue* base_object() { return OperandAt(0); } 5348 HValue* base_object() { return OperandAt(0); }
5351 int offset() { return offset_; } 5349 int offset() { return offset_; }
5352 5350
5353 virtual Representation RequiredInputRepresentation(int index) { 5351 virtual Representation RequiredInputRepresentation(int index) {
5354 return Representation::Tagged(); 5352 return Representation::Tagged();
5355 } 5353 }
5356 5354
(...skipping 1145 matching lines...) Expand 10 before | Expand all | Expand 10 after
6502 return Representation::Tagged(); 6500 return Representation::Tagged();
6503 } 6501 }
6504 6502
6505 DECLARE_CONCRETE_INSTRUCTION(StringAdd) 6503 DECLARE_CONCRETE_INSTRUCTION(StringAdd)
6506 6504
6507 protected: 6505 protected:
6508 virtual bool DataEquals(HValue* other) { return true; } 6506 virtual bool DataEquals(HValue* other) { return true; }
6509 6507
6510 private: 6508 private:
6511 HStringAdd(HValue* context, HValue* left, HValue* right, StringAddFlags flags) 6509 HStringAdd(HValue* context, HValue* left, HValue* right, StringAddFlags flags)
6512 : HBinaryOperation(context, left, right), flags_(flags) { 6510 : HBinaryOperation(context, left, right, HType::String()), flags_(flags) {
6513 set_representation(Representation::Tagged()); 6511 set_representation(Representation::Tagged());
6514 SetFlag(kUseGVN); 6512 SetFlag(kUseGVN);
6515 SetGVNFlag(kDependsOnMaps); 6513 SetGVNFlag(kDependsOnMaps);
6516 SetGVNFlag(kChangesNewSpacePromotion); 6514 SetGVNFlag(kChangesNewSpacePromotion);
6517 set_type(HType::String());
6518 } 6515 }
6519 6516
6520 // No side-effects except possible allocation. 6517 // No side-effects except possible allocation.
6521 // NOTE: this instruction _does not_ call ToString() on its inputs. 6518 // NOTE: this instruction _does not_ call ToString() on its inputs.
6522 virtual bool IsDeletable() const { return true; } 6519 virtual bool IsDeletable() const { return true; }
6523 6520
6524 const StringAddFlags flags_; 6521 const StringAddFlags flags_;
6525 }; 6522 };
6526 6523
6527 6524
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
6576 } 6573 }
6577 6574
6578 HValue* context() const { return OperandAt(0); } 6575 HValue* context() const { return OperandAt(0); }
6579 HValue* value() const { return OperandAt(1); } 6576 HValue* value() const { return OperandAt(1); }
6580 6577
6581 virtual bool DataEquals(HValue* other) { return true; } 6578 virtual bool DataEquals(HValue* other) { return true; }
6582 6579
6583 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) 6580 DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode)
6584 6581
6585 private: 6582 private:
6586 HStringCharFromCode(HValue* context, HValue* char_code) { 6583 HStringCharFromCode(HValue* context, HValue* char_code)
6584 : HTemplateInstruction<2>(HType::String()) {
6587 SetOperandAt(0, context); 6585 SetOperandAt(0, context);
6588 SetOperandAt(1, char_code); 6586 SetOperandAt(1, char_code);
6589 set_representation(Representation::Tagged()); 6587 set_representation(Representation::Tagged());
6590 SetFlag(kUseGVN); 6588 SetFlag(kUseGVN);
6591 SetGVNFlag(kChangesNewSpacePromotion); 6589 SetGVNFlag(kChangesNewSpacePromotion);
6592 set_type(HType::String());
6593 } 6590 }
6594 6591
6595 virtual bool IsDeletable() const { 6592 virtual bool IsDeletable() const {
6596 return !value()->ToNumberCanBeObserved(); 6593 return !value()->ToNumberCanBeObserved();
6597 } 6594 }
6598 }; 6595 };
6599 6596
6600 6597
6601 class HStringLength: public HUnaryOperation { 6598 class HStringLength: public HUnaryOperation {
6602 public: 6599 public:
6603 static HInstruction* New(Zone* zone, HValue* string); 6600 static HInstruction* New(Zone* zone, HValue* string);
6604 6601
6605 virtual Representation RequiredInputRepresentation(int index) { 6602 virtual Representation RequiredInputRepresentation(int index) {
6606 return Representation::Tagged(); 6603 return Representation::Tagged();
6607 } 6604 }
6608 6605
6609 DECLARE_CONCRETE_INSTRUCTION(StringLength) 6606 DECLARE_CONCRETE_INSTRUCTION(StringLength)
6610 6607
6611 protected: 6608 protected:
6612 virtual bool DataEquals(HValue* other) { return true; } 6609 virtual bool DataEquals(HValue* other) { return true; }
6613 6610
6614 virtual Range* InferRange(Zone* zone) { 6611 virtual Range* InferRange(Zone* zone) {
6615 return new(zone) Range(0, String::kMaxLength); 6612 return new(zone) Range(0, String::kMaxLength);
6616 } 6613 }
6617 6614
6618 private: 6615 private:
6619 explicit HStringLength(HValue* string) : HUnaryOperation(string) { 6616 explicit HStringLength(HValue* string)
6617 : HUnaryOperation(string, HType::Smi()) {
6620 STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); 6618 STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue);
6621 set_representation(Representation::Tagged()); 6619 set_representation(Representation::Tagged());
6622 SetFlag(kUseGVN); 6620 SetFlag(kUseGVN);
6623 SetGVNFlag(kDependsOnMaps); 6621 SetGVNFlag(kDependsOnMaps);
6624 set_type(HType::Smi());
6625 } 6622 }
6626 6623
6627 virtual bool IsDeletable() const { return true; } 6624 virtual bool IsDeletable() const { return true; }
6628 }; 6625 };
6629 6626
6630 6627
6631 template <int V> 6628 template <int V>
6632 class HMaterializedLiteral: public HTemplateInstruction<V> { 6629 class HMaterializedLiteral: public HTemplateInstruction<V> {
6633 public: 6630 public:
6634 HMaterializedLiteral<V>(int index, int depth, AllocationSiteMode mode) 6631 HMaterializedLiteral<V>(int index, int depth, AllocationSiteMode mode)
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
6689 Handle<String> pattern_; 6686 Handle<String> pattern_;
6690 Handle<String> flags_; 6687 Handle<String> flags_;
6691 }; 6688 };
6692 6689
6693 6690
6694 class HFunctionLiteral: public HTemplateInstruction<1> { 6691 class HFunctionLiteral: public HTemplateInstruction<1> {
6695 public: 6692 public:
6696 HFunctionLiteral(HValue* context, 6693 HFunctionLiteral(HValue* context,
6697 Handle<SharedFunctionInfo> shared, 6694 Handle<SharedFunctionInfo> shared,
6698 bool pretenure) 6695 bool pretenure)
6699 : shared_info_(shared), 6696 : HTemplateInstruction<1>(HType::JSObject()),
6697 shared_info_(shared),
6700 pretenure_(pretenure), 6698 pretenure_(pretenure),
6701 has_no_literals_(shared->num_literals() == 0), 6699 has_no_literals_(shared->num_literals() == 0),
6702 is_generator_(shared->is_generator()), 6700 is_generator_(shared->is_generator()),
6703 language_mode_(shared->language_mode()) { 6701 language_mode_(shared->language_mode()) {
6704 SetOperandAt(0, context); 6702 SetOperandAt(0, context);
6705 set_type(HType::JSObject());
6706 set_representation(Representation::Tagged()); 6703 set_representation(Representation::Tagged());
6707 SetGVNFlag(kChangesNewSpacePromotion); 6704 SetGVNFlag(kChangesNewSpacePromotion);
6708 } 6705 }
6709 6706
6710 HValue* context() { return OperandAt(0); } 6707 HValue* context() { return OperandAt(0); }
6711 6708
6712 virtual Representation RequiredInputRepresentation(int index) { 6709 virtual Representation RequiredInputRepresentation(int index) {
6713 return Representation::Tagged(); 6710 return Representation::Tagged();
6714 } 6711 }
6715 6712
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
6993 virtual bool IsDeletable() const { return true; } 6990 virtual bool IsDeletable() const { return true; }
6994 }; 6991 };
6995 6992
6996 6993
6997 #undef DECLARE_INSTRUCTION 6994 #undef DECLARE_INSTRUCTION
6998 #undef DECLARE_CONCRETE_INSTRUCTION 6995 #undef DECLARE_CONCRETE_INSTRUCTION
6999 6996
7000 } } // namespace v8::internal 6997 } } // namespace v8::internal
7001 6998
7002 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 6999 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« no previous file with comments | « no previous file | src/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698