5 #ifndef V8_COMPILER_MEMORY_OPTIMIZER_H_ 6 #define V8_COMPILER_MEMORY_OPTIMIZER_H_ 8 #include "src/compiler/graph-assembler.h" 9 #include "src/zone/zone-containers.h" 16 class CommonOperatorBuilder;
20 class MachineOperatorBuilder;
34 enum class AllocationFolding { kDoAllocationFolding, kDontAllocationFolding };
37 PoisoningMitigationLevel poisoning_level,
38 AllocationFolding allocation_folding);
46 class AllocationGroup final :
public ZoneObject {
48 AllocationGroup(
Node* node, PretenureFlag pretenure,
Zone* zone);
49 AllocationGroup(
Node* node, PretenureFlag pretenure,
Node* size,
51 ~AllocationGroup() =
default;
53 void Add(
Node*
object);
54 bool Contains(
Node*
object)
const;
55 bool IsNewSpaceAllocation()
const {
return pretenure() == NOT_TENURED; }
57 PretenureFlag pretenure()
const {
return pretenure_; }
58 Node* size()
const {
return size_; }
62 PretenureFlag
const pretenure_;
65 DISALLOW_IMPLICIT_CONSTRUCTORS(AllocationGroup);
69 class AllocationState final :
public ZoneObject {
71 static AllocationState
const* Empty(
Zone* zone) {
72 return new (zone) AllocationState();
74 static AllocationState
const* Closed(AllocationGroup* group,
Zone* zone) {
75 return new (zone) AllocationState(group);
77 static AllocationState
const* Open(AllocationGroup* group, intptr_t size,
79 return new (zone) AllocationState(group, size, top);
82 bool IsNewSpaceAllocation()
const;
84 AllocationGroup* group()
const {
return group_; }
85 Node* top()
const {
return top_; }
86 intptr_t size()
const {
return size_; }
90 explicit AllocationState(AllocationGroup* group);
91 AllocationState(AllocationGroup* group, intptr_t size,
Node* top);
93 AllocationGroup*
const group_;
99 DISALLOW_COPY_AND_ASSIGN(AllocationState);
109 AllocationState
const* state;
112 void VisitNode(
Node*, AllocationState
const*);
113 void VisitAllocateRaw(
Node*, AllocationState
const*);
114 void VisitCall(
Node*, AllocationState
const*);
115 void VisitCallWithCallerSavedRegisters(
Node*, AllocationState
const*);
116 void VisitLoadElement(
Node*, AllocationState
const*);
117 void VisitLoadField(
Node*, AllocationState
const*);
118 void VisitStoreElement(
Node*, AllocationState
const*);
119 void VisitStoreField(
Node*, AllocationState
const*);
120 void VisitOtherEffect(
Node*, AllocationState
const*);
123 WriteBarrierKind ComputeWriteBarrierKind(
Node*
object,
124 AllocationState
const* state,
129 void EnqueueMerge(
Node*,
int, AllocationState
const*);
130 void EnqueueUses(
Node*, AllocationState
const*);
131 void EnqueueUse(
Node*,
int, AllocationState
const*);
133 bool NeedsPoisoning(LoadSensitivity load_sensitivity)
const;
135 AllocationState
const* empty_state()
const {
return empty_state_; }
136 Graph* graph()
const;
138 JSGraph* jsgraph()
const {
return jsgraph_; }
141 Zone* zone()
const {
return zone_; }
146 AllocationState
const*
const empty_state_;
151 PoisoningMitigationLevel poisoning_level_;
152 AllocationFolding allocation_folding_;
161 #endif // V8_COMPILER_MEMORY_OPTIMIZER_H_