| OLD | NEW |
| 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 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 878 ASSERT(CheckFlag(kFlexibleRepresentation)); | 878 ASSERT(CheckFlag(kFlexibleRepresentation)); |
| 879 RepresentationChanged(r); | 879 RepresentationChanged(r); |
| 880 representation_ = r; | 880 representation_ = r; |
| 881 if (r.IsTagged()) { | 881 if (r.IsTagged()) { |
| 882 // Tagged is the bottom of the lattice, don't go any further. | 882 // Tagged is the bottom of the lattice, don't go any further. |
| 883 ClearFlag(kFlexibleRepresentation); | 883 ClearFlag(kFlexibleRepresentation); |
| 884 } | 884 } |
| 885 } | 885 } |
| 886 virtual void AssumeRepresentation(Representation r); | 886 virtual void AssumeRepresentation(Representation r); |
| 887 | 887 |
| 888 virtual bool IsConvertibleToInteger() const { return true; } | 888 virtual Representation KnownOptimalRepresentation() { |
| 889 Representation r = representation(); |
| 890 if (r.IsTagged()) { |
| 891 HType t = type(); |
| 892 if (t.IsSmi()) return Representation::Smi(); |
| 893 if (t.IsHeapNumber()) return Representation::Double(); |
| 894 if (t.IsHeapObject()) return r; |
| 895 return Representation::None(); |
| 896 } |
| 897 return r; |
| 898 } |
| 889 | 899 |
| 890 HType type() const { return type_; } | 900 HType type() const { return type_; } |
| 891 void set_type(HType new_type) { | 901 void set_type(HType new_type) { |
| 892 ASSERT(new_type.IsSubtypeOf(type_)); | 902 ASSERT(new_type.IsSubtypeOf(type_)); |
| 893 type_ = new_type; | 903 type_ = new_type; |
| 894 } | 904 } |
| 895 | 905 |
| 896 // An operation needs to override this function iff: | 906 // An operation needs to override this function iff: |
| 897 // 1) it can produce an int32 output. | 907 // 1) it can produce an int32 output. |
| 898 // 2) the true value of its output can potentially be minus zero. | 908 // 2) the true value of its output can potentially be minus zero. |
| (...skipping 1543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2442 | 2452 |
| 2443 private: | 2453 private: |
| 2444 virtual bool IsDeletable() const { return true; } | 2454 virtual bool IsDeletable() const { return true; } |
| 2445 }; | 2455 }; |
| 2446 | 2456 |
| 2447 | 2457 |
| 2448 class HMapEnumLength: public HUnaryOperation { | 2458 class HMapEnumLength: public HUnaryOperation { |
| 2449 public: | 2459 public: |
| 2450 explicit HMapEnumLength(HValue* value) : HUnaryOperation(value) { | 2460 explicit HMapEnumLength(HValue* value) : HUnaryOperation(value) { |
| 2451 set_type(HType::Smi()); | 2461 set_type(HType::Smi()); |
| 2452 set_representation(Representation::Tagged()); | 2462 set_representation(Representation::Smi()); |
| 2453 SetFlag(kUseGVN); | 2463 SetFlag(kUseGVN); |
| 2454 SetGVNFlag(kDependsOnMaps); | 2464 SetGVNFlag(kDependsOnMaps); |
| 2455 } | 2465 } |
| 2456 | 2466 |
| 2457 virtual Representation RequiredInputRepresentation(int index) { | 2467 virtual Representation RequiredInputRepresentation(int index) { |
| 2458 return Representation::Tagged(); | 2468 return Representation::Tagged(); |
| 2459 } | 2469 } |
| 2460 | 2470 |
| 2461 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength) | 2471 DECLARE_CONCRETE_INSTRUCTION(MapEnumLength) |
| 2462 | 2472 |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2933 UniqueValueId first_prototype_unique_id_; | 2943 UniqueValueId first_prototype_unique_id_; |
| 2934 UniqueValueId last_prototype_unique_id_; | 2944 UniqueValueId last_prototype_unique_id_; |
| 2935 }; | 2945 }; |
| 2936 | 2946 |
| 2937 | 2947 |
| 2938 class HPhi: public HValue { | 2948 class HPhi: public HValue { |
| 2939 public: | 2949 public: |
| 2940 HPhi(int merged_index, Zone* zone) | 2950 HPhi(int merged_index, Zone* zone) |
| 2941 : inputs_(2, zone), | 2951 : inputs_(2, zone), |
| 2942 merged_index_(merged_index), | 2952 merged_index_(merged_index), |
| 2943 phi_id_(-1), | 2953 phi_id_(-1) { |
| 2944 is_convertible_to_integer_(true) { | |
| 2945 for (int i = 0; i < Representation::kNumRepresentations; i++) { | 2954 for (int i = 0; i < Representation::kNumRepresentations; i++) { |
| 2946 non_phi_uses_[i] = 0; | 2955 non_phi_uses_[i] = 0; |
| 2947 indirect_uses_[i] = 0; | 2956 indirect_uses_[i] = 0; |
| 2948 } | 2957 } |
| 2949 ASSERT(merged_index >= 0); | 2958 ASSERT(merged_index >= 0); |
| 2950 SetFlag(kFlexibleRepresentation); | 2959 SetFlag(kFlexibleRepresentation); |
| 2951 SetFlag(kAllowUndefinedAsNaN); | 2960 SetFlag(kAllowUndefinedAsNaN); |
| 2952 } | 2961 } |
| 2953 | 2962 |
| 2954 virtual Representation RepresentationFromInputs(); | 2963 virtual Representation RepresentationFromInputs(); |
| 2955 | 2964 |
| 2956 virtual Range* InferRange(Zone* zone); | 2965 virtual Range* InferRange(Zone* zone); |
| 2957 virtual void InferRepresentation(HInferRepresentation* h_infer); | 2966 virtual void InferRepresentation(HInferRepresentation* h_infer); |
| 2958 Representation RepresentationFromUseRequirements(); | 2967 Representation RepresentationFromUseRequirements(); |
| 2959 virtual Representation RequiredInputRepresentation(int index) { | 2968 virtual Representation RequiredInputRepresentation(int index) { |
| 2960 return representation(); | 2969 return representation(); |
| 2961 } | 2970 } |
| 2971 virtual Representation KnownOptimalRepresentation() { |
| 2972 return representation(); |
| 2973 } |
| 2962 virtual HType CalculateInferredType(); | 2974 virtual HType CalculateInferredType(); |
| 2963 virtual int OperandCount() { return inputs_.length(); } | 2975 virtual int OperandCount() { return inputs_.length(); } |
| 2964 virtual HValue* OperandAt(int index) const { return inputs_[index]; } | 2976 virtual HValue* OperandAt(int index) const { return inputs_[index]; } |
| 2965 HValue* GetRedundantReplacement(); | 2977 HValue* GetRedundantReplacement(); |
| 2966 void AddInput(HValue* value); | 2978 void AddInput(HValue* value); |
| 2967 bool HasRealUses(); | 2979 bool HasRealUses(); |
| 2968 | 2980 |
| 2969 bool IsReceiver() const { return merged_index_ == 0; } | 2981 bool IsReceiver() const { return merged_index_ == 0; } |
| 2970 | 2982 |
| 2971 int merged_index() const { return merged_index_; } | 2983 int merged_index() const { return merged_index_; } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3007 return indirect_uses_[Representation::kDouble]; | 3019 return indirect_uses_[Representation::kDouble]; |
| 3008 } | 3020 } |
| 3009 int phi_id() { return phi_id_; } | 3021 int phi_id() { return phi_id_; } |
| 3010 | 3022 |
| 3011 static HPhi* cast(HValue* value) { | 3023 static HPhi* cast(HValue* value) { |
| 3012 ASSERT(value->IsPhi()); | 3024 ASSERT(value->IsPhi()); |
| 3013 return reinterpret_cast<HPhi*>(value); | 3025 return reinterpret_cast<HPhi*>(value); |
| 3014 } | 3026 } |
| 3015 virtual Opcode opcode() const { return HValue::kPhi; } | 3027 virtual Opcode opcode() const { return HValue::kPhi; } |
| 3016 | 3028 |
| 3017 virtual bool IsConvertibleToInteger() const { | |
| 3018 return is_convertible_to_integer_; | |
| 3019 } | |
| 3020 | |
| 3021 void set_is_convertible_to_integer(bool b) { | |
| 3022 is_convertible_to_integer_ = b; | |
| 3023 } | |
| 3024 | |
| 3025 bool AllOperandsConvertibleToInteger() { | |
| 3026 for (int i = 0; i < OperandCount(); ++i) { | |
| 3027 if (!OperandAt(i)->IsConvertibleToInteger()) { | |
| 3028 if (FLAG_trace_representation) { | |
| 3029 HValue* input = OperandAt(i); | |
| 3030 PrintF("#%d %s: Input #%d %s at %d is NCTI\n", | |
| 3031 id(), Mnemonic(), input->id(), input->Mnemonic(), i); | |
| 3032 } | |
| 3033 return false; | |
| 3034 } | |
| 3035 } | |
| 3036 return true; | |
| 3037 } | |
| 3038 | |
| 3039 void SimplifyConstantInputs(); | 3029 void SimplifyConstantInputs(); |
| 3040 | 3030 |
| 3041 // TODO(titzer): we can't eliminate the receiver for generating backtraces | 3031 // TODO(titzer): we can't eliminate the receiver for generating backtraces |
| 3042 virtual bool IsDeletable() const { return !IsReceiver(); } | 3032 virtual bool IsDeletable() const { return !IsReceiver(); } |
| 3043 | 3033 |
| 3044 protected: | 3034 protected: |
| 3045 virtual void DeleteFromGraph(); | 3035 virtual void DeleteFromGraph(); |
| 3046 virtual void InternalSetOperandAt(int index, HValue* value) { | 3036 virtual void InternalSetOperandAt(int index, HValue* value) { |
| 3047 inputs_[index] = value; | 3037 inputs_[index] = value; |
| 3048 } | 3038 } |
| 3049 | 3039 |
| 3050 virtual bool IsRelationTrueInternal(NumericRelation relation, | 3040 virtual bool IsRelationTrueInternal(NumericRelation relation, |
| 3051 HValue* other, | 3041 HValue* other, |
| 3052 int offset = 0, | 3042 int offset = 0, |
| 3053 int scale = 0); | 3043 int scale = 0); |
| 3054 | 3044 |
| 3055 private: | 3045 private: |
| 3056 ZoneList<HValue*> inputs_; | 3046 ZoneList<HValue*> inputs_; |
| 3057 int merged_index_; | 3047 int merged_index_; |
| 3058 | 3048 |
| 3059 int non_phi_uses_[Representation::kNumRepresentations]; | 3049 int non_phi_uses_[Representation::kNumRepresentations]; |
| 3060 int indirect_uses_[Representation::kNumRepresentations]; | 3050 int indirect_uses_[Representation::kNumRepresentations]; |
| 3061 int phi_id_; | 3051 int phi_id_; |
| 3062 bool is_convertible_to_integer_; | |
| 3063 }; | 3052 }; |
| 3064 | 3053 |
| 3065 | 3054 |
| 3066 class HInductionVariableAnnotation : public HUnaryOperation { | 3055 class HInductionVariableAnnotation : public HUnaryOperation { |
| 3067 public: | 3056 public: |
| 3068 static HInductionVariableAnnotation* AddToGraph(HPhi* phi, | 3057 static HInductionVariableAnnotation* AddToGraph(HPhi* phi, |
| 3069 NumericRelation relation, | 3058 NumericRelation relation, |
| 3070 int operand_index); | 3059 int operand_index); |
| 3071 | 3060 |
| 3072 NumericRelation relation() { return relation_; } | 3061 NumericRelation relation() { return relation_; } |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3189 unique_id_ == UniqueValueId(heap->true_value()) || | 3178 unique_id_ == UniqueValueId(heap->true_value()) || |
| 3190 unique_id_ == UniqueValueId(heap->false_value()) || | 3179 unique_id_ == UniqueValueId(heap->false_value()) || |
| 3191 unique_id_ == UniqueValueId(heap->the_hole_value()) || | 3180 unique_id_ == UniqueValueId(heap->the_hole_value()) || |
| 3192 unique_id_ == UniqueValueId(heap->empty_string()); | 3181 unique_id_ == UniqueValueId(heap->empty_string()); |
| 3193 } | 3182 } |
| 3194 | 3183 |
| 3195 virtual Representation RequiredInputRepresentation(int index) { | 3184 virtual Representation RequiredInputRepresentation(int index) { |
| 3196 return Representation::None(); | 3185 return Representation::None(); |
| 3197 } | 3186 } |
| 3198 | 3187 |
| 3199 virtual bool IsConvertibleToInteger() const { | 3188 virtual Representation KnownOptimalRepresentation() { |
| 3200 return has_int32_value_; | 3189 if (HasSmiValue()) return Representation::Smi(); |
| 3190 if (HasInteger32Value()) return Representation::Integer32(); |
| 3191 if (HasNumberValue()) return Representation::Double(); |
| 3192 return Representation::Tagged(); |
| 3201 } | 3193 } |
| 3202 | 3194 |
| 3203 virtual bool EmitAtUses() { return !representation().IsDouble(); } | 3195 virtual bool EmitAtUses() { return !representation().IsDouble(); } |
| 3204 virtual void PrintDataTo(StringStream* stream); | 3196 virtual void PrintDataTo(StringStream* stream); |
| 3205 virtual HType CalculateInferredType(); | 3197 virtual HType CalculateInferredType(); |
| 3206 bool IsInteger() { return handle()->IsSmi(); } | 3198 bool IsInteger() { return handle()->IsSmi(); } |
| 3207 HConstant* CopyToRepresentation(Representation r, Zone* zone) const; | 3199 HConstant* CopyToRepresentation(Representation r, Zone* zone) const; |
| 3208 HConstant* CopyToTruncatedInt32(Zone* zone) const; | 3200 HConstant* CopyToTruncatedInt32(Zone* zone) const; |
| 3209 bool HasInteger32Value() const { return has_int32_value_; } | 3201 bool HasInteger32Value() const { return has_int32_value_; } |
| 3210 int32_t Integer32Value() const { | 3202 int32_t Integer32Value() const { |
| 3211 ASSERT(HasInteger32Value()); | 3203 ASSERT(HasInteger32Value()); |
| 3212 return int32_value_; | 3204 return int32_value_; |
| 3213 } | 3205 } |
| 3214 bool HasSmiValue() const { | 3206 bool HasSmiValue() const { return has_smi_value_; } |
| 3215 return has_smi_value_; | |
| 3216 } | |
| 3217 bool HasDoubleValue() const { return has_double_value_; } | 3207 bool HasDoubleValue() const { return has_double_value_; } |
| 3218 double DoubleValue() const { | 3208 double DoubleValue() const { |
| 3219 ASSERT(HasDoubleValue()); | 3209 ASSERT(HasDoubleValue()); |
| 3220 return double_value_; | 3210 return double_value_; |
| 3221 } | 3211 } |
| 3222 bool IsTheHole() const { | 3212 bool IsTheHole() const { |
| 3223 if (HasDoubleValue() && FixedDoubleArray::is_the_hole_nan(double_value_)) { | 3213 if (HasDoubleValue() && FixedDoubleArray::is_the_hole_nan(double_value_)) { |
| 3224 return true; | 3214 return true; |
| 3225 } | 3215 } |
| 3226 Heap* heap = isolate()->heap(); | 3216 Heap* heap = isolate()->heap(); |
| (...skipping 1482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4709 } | 4699 } |
| 4710 | 4700 |
| 4711 void set_incoming_value(HPhi* value) { | 4701 void set_incoming_value(HPhi* value) { |
| 4712 incoming_value_ = value; | 4702 incoming_value_ = value; |
| 4713 } | 4703 } |
| 4714 | 4704 |
| 4715 HPhi* incoming_value() { | 4705 HPhi* incoming_value() { |
| 4716 return incoming_value_; | 4706 return incoming_value_; |
| 4717 } | 4707 } |
| 4718 | 4708 |
| 4709 virtual Representation KnownOptimalRepresentation() { |
| 4710 if (incoming_value_ == NULL) return Representation::None(); |
| 4711 return incoming_value_->KnownOptimalRepresentation(); |
| 4712 } |
| 4713 |
| 4719 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) | 4714 DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) |
| 4720 | 4715 |
| 4721 private: | 4716 private: |
| 4722 HPhi* incoming_value_; | 4717 HPhi* incoming_value_; |
| 4723 }; | 4718 }; |
| 4724 | 4719 |
| 4725 | 4720 |
| 4726 class HLoadGlobalCell: public HTemplateInstruction<0> { | 4721 class HLoadGlobalCell: public HTemplateInstruction<0> { |
| 4727 public: | 4722 public: |
| 4728 HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, PropertyDetails details) | 4723 HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, PropertyDetails details) |
| (...skipping 1771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6500 virtual bool IsDeletable() const { return true; } | 6495 virtual bool IsDeletable() const { return true; } |
| 6501 }; | 6496 }; |
| 6502 | 6497 |
| 6503 | 6498 |
| 6504 #undef DECLARE_INSTRUCTION | 6499 #undef DECLARE_INSTRUCTION |
| 6505 #undef DECLARE_CONCRETE_INSTRUCTION | 6500 #undef DECLARE_CONCRETE_INSTRUCTION |
| 6506 | 6501 |
| 6507 } } // namespace v8::internal | 6502 } } // namespace v8::internal |
| 6508 | 6503 |
| 6509 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ | 6504 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |