Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 #ifndef V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 5 #ifndef V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
| 6 #define V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 6 #define V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
| 7 | 7 |
| 8 #include <cstring> | 8 #include <cstring> |
| 9 #include <iosfwd> | 9 #include <iosfwd> |
| 10 | 10 |
| (...skipping 4987 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4998 } | 4998 } |
| 4999 | 4999 |
| 5000 bool MustPrefillWithFiller() const { | 5000 bool MustPrefillWithFiller() const { |
| 5001 return (flags_ & PREFILL_WITH_FILLER) != 0; | 5001 return (flags_ & PREFILL_WITH_FILLER) != 0; |
| 5002 } | 5002 } |
| 5003 | 5003 |
| 5004 void MakePrefillWithFiller() { | 5004 void MakePrefillWithFiller() { |
| 5005 flags_ = static_cast<HAllocate::Flags>(flags_ | PREFILL_WITH_FILLER); | 5005 flags_ = static_cast<HAllocate::Flags>(flags_ | PREFILL_WITH_FILLER); |
| 5006 } | 5006 } |
| 5007 | 5007 |
| 5008 bool MustClearNextMapWord() const { | |
| 5009 return (flags_ & CLEAR_NEXT_MAP_WORD) != 0; | |
| 5010 } | |
| 5011 | |
| 5012 void MakeDoubleAligned() { | 5008 void MakeDoubleAligned() { |
| 5013 flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED); | 5009 flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED); |
| 5014 } | 5010 } |
| 5015 | 5011 |
| 5012 void MakeAllocationFoldingDominator() { | |
| 5013 flags_ = | |
| 5014 static_cast<HAllocate::Flags>(flags_ | ALLOCATION_FOLDING_DOMINATOR); | |
| 5015 } | |
| 5016 | |
| 5017 bool IsAllocationFoldingDominator() { | |
| 5018 return (flags_ & ALLOCATION_FOLDING_DOMINATOR) != 0; | |
| 5019 } | |
| 5020 | |
| 5021 void MakeAllocationFoldingDominated() { | |
| 5022 flags_ = | |
| 5023 static_cast<HAllocate::Flags>(flags_ | ALLOCATION_FOLDING_DOMINATED); | |
| 5024 ClearFlag(kTrackSideEffectDominators); | |
| 5025 ClearChangesFlag(kNewSpacePromotion); | |
| 5026 } | |
| 5027 | |
| 5028 bool IsAllocationFoldingDominated() { | |
| 5029 return (flags_ & ALLOCATION_FOLDING_DOMINATED) != 0; | |
| 5030 } | |
| 5031 | |
| 5016 bool HandleSideEffectDominator(GVNFlag side_effect, | 5032 bool HandleSideEffectDominator(GVNFlag side_effect, |
| 5017 HValue* dominator) override; | 5033 HValue* dominator) override; |
| 5018 | 5034 |
| 5019 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT | 5035 std::ostream& PrintDataTo(std::ostream& os) const override; // NOLINT |
| 5020 | 5036 |
| 5021 DECLARE_CONCRETE_INSTRUCTION(Allocate) | 5037 DECLARE_CONCRETE_INSTRUCTION(Allocate) |
| 5022 | 5038 |
| 5023 private: | 5039 private: |
| 5024 enum Flags { | 5040 enum Flags { |
| 5025 ALLOCATE_IN_NEW_SPACE = 1 << 0, | 5041 ALLOCATE_IN_NEW_SPACE = 1 << 0, |
| 5026 ALLOCATE_IN_OLD_SPACE = 1 << 2, | 5042 ALLOCATE_IN_OLD_SPACE = 1 << 2, |
| 5027 ALLOCATE_DOUBLE_ALIGNED = 1 << 3, | 5043 ALLOCATE_DOUBLE_ALIGNED = 1 << 3, |
| 5028 PREFILL_WITH_FILLER = 1 << 4, | 5044 PREFILL_WITH_FILLER = 1 << 4, |
| 5029 CLEAR_NEXT_MAP_WORD = 1 << 5 | 5045 ALLOCATION_FOLDING_DOMINATOR = 1 << 5, |
| 5046 ALLOCATION_FOLDING_DOMINATED = 1 << 6 | |
|
Benedikt Meurer
2016/04/19 07:25:38
Is there a better name than "dominated"?
Hannes Payer (out of office)
2016/04/19 11:03:56
Changed to ALLOCATION_FOLDED. Done.
| |
| 5030 }; | 5047 }; |
| 5031 | 5048 |
| 5032 HAllocate(HValue* context, | 5049 HAllocate(HValue* context, |
| 5033 HValue* size, | 5050 HValue* size, |
| 5034 HType type, | 5051 HType type, |
| 5035 PretenureFlag pretenure_flag, | 5052 PretenureFlag pretenure_flag, |
| 5036 InstanceType instance_type, | 5053 InstanceType instance_type, |
| 5037 Handle<AllocationSite> allocation_site = | 5054 Handle<AllocationSite> allocation_site = |
| 5038 Handle<AllocationSite>::null()) | 5055 Handle<AllocationSite>::null()) |
| 5039 : HTemplateInstruction<2>(type), | 5056 : HTemplateInstruction<2>(type), |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 5065 flags = static_cast<Flags>(flags | ALLOCATE_DOUBLE_ALIGNED); | 5082 flags = static_cast<Flags>(flags | ALLOCATE_DOUBLE_ALIGNED); |
| 5066 } | 5083 } |
| 5067 // We have to fill the allocated object with one word fillers if we do | 5084 // We have to fill the allocated object with one word fillers if we do |
| 5068 // not use allocation folding since some allocations may depend on each | 5085 // not use allocation folding since some allocations may depend on each |
| 5069 // other, i.e., have a pointer to each other. A GC in between these | 5086 // other, i.e., have a pointer to each other. A GC in between these |
| 5070 // allocations may leave such objects behind in a not completely initialized | 5087 // allocations may leave such objects behind in a not completely initialized |
| 5071 // state. | 5088 // state. |
| 5072 if (!FLAG_use_gvn || !FLAG_use_allocation_folding) { | 5089 if (!FLAG_use_gvn || !FLAG_use_allocation_folding) { |
| 5073 flags = static_cast<Flags>(flags | PREFILL_WITH_FILLER); | 5090 flags = static_cast<Flags>(flags | PREFILL_WITH_FILLER); |
| 5074 } | 5091 } |
| 5075 if (pretenure_flag == NOT_TENURED && | |
| 5076 AllocationSite::CanTrack(instance_type)) { | |
| 5077 flags = static_cast<Flags>(flags | CLEAR_NEXT_MAP_WORD); | |
| 5078 } | |
| 5079 return flags; | 5092 return flags; |
| 5080 } | 5093 } |
| 5081 | 5094 |
| 5082 void UpdateClearNextMapWord(bool clear_next_map_word) { | |
| 5083 flags_ = static_cast<Flags>(clear_next_map_word | |
| 5084 ? flags_ | CLEAR_NEXT_MAP_WORD | |
| 5085 : flags_ & ~CLEAR_NEXT_MAP_WORD); | |
| 5086 } | |
| 5087 | |
| 5088 void UpdateSize(HValue* size) { | 5095 void UpdateSize(HValue* size) { |
| 5089 SetOperandAt(1, size); | 5096 SetOperandAt(1, size); |
| 5090 if (size->IsInteger32Constant()) { | 5097 if (size->IsInteger32Constant()) { |
| 5091 size_upper_bound_ = HConstant::cast(size); | 5098 size_upper_bound_ = HConstant::cast(size); |
| 5092 } else { | 5099 } else { |
| 5093 size_upper_bound_ = NULL; | 5100 size_upper_bound_ = NULL; |
| 5094 } | 5101 } |
| 5095 } | 5102 } |
| 5096 | 5103 |
| 5097 HAllocate* GetFoldableDominator(HAllocate* dominator); | 5104 HAllocate* GetFoldableDominator(HAllocate* dominator); |
| 5098 | 5105 |
| 5099 void UpdateFreeSpaceFiller(int32_t filler_size); | |
| 5100 | |
| 5101 void CreateFreeSpaceFiller(int32_t filler_size); | |
| 5102 | |
| 5103 bool IsFoldable(HAllocate* allocate) { | 5106 bool IsFoldable(HAllocate* allocate) { |
| 5104 return (IsNewSpaceAllocation() && allocate->IsNewSpaceAllocation()) || | 5107 return (IsNewSpaceAllocation() && allocate->IsNewSpaceAllocation()) || |
| 5105 (IsOldSpaceAllocation() && allocate->IsOldSpaceAllocation()); | 5108 (IsOldSpaceAllocation() && allocate->IsOldSpaceAllocation()); |
| 5106 } | 5109 } |
| 5107 | 5110 |
| 5108 void ClearNextMapWord(int offset); | |
| 5109 | |
| 5110 Flags flags_; | 5111 Flags flags_; |
| 5111 Handle<Map> known_initial_map_; | 5112 Handle<Map> known_initial_map_; |
| 5112 HAllocate* dominating_allocate_; | 5113 HAllocate* dominating_allocate_; |
| 5113 HStoreNamedField* filler_free_space_size_; | 5114 HStoreNamedField* filler_free_space_size_; |
| 5114 HConstant* size_upper_bound_; | 5115 HConstant* size_upper_bound_; |
| 5115 }; | 5116 }; |
| 5116 | 5117 |
| 5117 | 5118 |
| 5118 class HStoreCodeEntry final : public HTemplateInstruction<2> { | 5119 class HStoreCodeEntry final : public HTemplateInstruction<2> { |
| 5119 public: | 5120 public: |
| (...skipping 2122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7242 bool IsDeletable() const override { return true; } | 7243 bool IsDeletable() const override { return true; } |
| 7243 }; | 7244 }; |
| 7244 | 7245 |
| 7245 #undef DECLARE_INSTRUCTION | 7246 #undef DECLARE_INSTRUCTION |
| 7246 #undef DECLARE_CONCRETE_INSTRUCTION | 7247 #undef DECLARE_CONCRETE_INSTRUCTION |
| 7247 | 7248 |
| 7248 } // namespace internal | 7249 } // namespace internal |
| 7249 } // namespace v8 | 7250 } // namespace v8 |
| 7250 | 7251 |
| 7251 #endif // V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ | 7252 #endif // V8_CRANKSHAFT_HYDROGEN_INSTRUCTIONS_H_ |
| OLD | NEW |