OLD | NEW |
---|---|
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 <iterator> | 5 #include <iterator> |
6 | 6 |
7 #include "src/compiler/store-store-elimination.h" | 7 #include "src/compiler/store-store-elimination.h" |
8 | 8 |
9 #include "src/compiler/all-nodes.h" | 9 #include "src/compiler/all-nodes.h" |
10 #include "src/compiler/js-graph.h" | 10 #include "src/compiler/js-graph.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
65 // Assumption: every byte of a JS object is only ever accessed through one | 65 // Assumption: every byte of a JS object is only ever accessed through one |
66 // offset. For instance, byte 15 of a given object may be accessed using a | 66 // offset. For instance, byte 15 of a given object may be accessed using a |
67 // two-byte read at offset 14, or a four-byte read at offset 12, but never | 67 // two-byte read at offset 14, or a four-byte read at offset 12, but never |
68 // both in the same program. | 68 // both in the same program. |
69 // | 69 // |
70 // This implementation needs all dead nodes removed from the graph, and the | 70 // This implementation needs all dead nodes removed from the graph, and the |
71 // graph should be trimmed. | 71 // graph should be trimmed. |
72 | 72 |
73 namespace { | 73 namespace { |
74 | 74 |
75 // 16 bits was chosen fairly arbitrarily; it seems enough now. 8 bits is too | 75 // 4GiB ought to be enough for anybody. |
Jarin
2016/08/19 09:30:35
Just remove the comment.
bgeron
2016/08/19 10:42:10
Done.
| |
76 // few. | 76 typedef uint32_t StoreOffset; |
77 typedef uint16_t StoreOffset; | |
78 | 77 |
79 struct UnobservableStore { | 78 struct UnobservableStore { |
80 NodeId id_; | 79 NodeId id_; |
81 StoreOffset offset_; | 80 StoreOffset offset_; |
82 | 81 |
83 bool operator==(const UnobservableStore) const; | 82 bool operator==(const UnobservableStore) const; |
84 bool operator!=(const UnobservableStore) const; | 83 bool operator!=(const UnobservableStore) const; |
85 bool operator<(const UnobservableStore) const; | 84 bool operator<(const UnobservableStore) const; |
86 }; | 85 }; |
87 | 86 |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
164 Zone* const temp_zone_; | 163 Zone* const temp_zone_; |
165 | 164 |
166 ZoneStack<Node*> revisit_; | 165 ZoneStack<Node*> revisit_; |
167 ZoneVector<bool> in_revisit_; | 166 ZoneVector<bool> in_revisit_; |
168 // Maps node IDs to UnobservableNodeSets. | 167 // Maps node IDs to UnobservableNodeSets. |
169 ZoneVector<UnobservablesSet> unobservable_; | 168 ZoneVector<UnobservablesSet> unobservable_; |
170 ZoneSet<Node*> to_remove_; | 169 ZoneSet<Node*> to_remove_; |
171 const UnobservablesSet unobservables_visited_empty_; | 170 const UnobservablesSet unobservables_visited_empty_; |
172 }; | 171 }; |
173 | 172 |
174 // To safely cast an offset from a FieldAccess, which has a wider range | 173 // To safely cast an offset from a FieldAccess, which has a potentially wider |
175 // (namely int). | 174 // range (namely int). |
176 StoreOffset ToOffset(int offset) { | 175 StoreOffset ToOffset(int offset) { |
177 CHECK(0 <= offset && offset < (1 << 8 * sizeof(StoreOffset))); | 176 CHECK(0 <= offset && (int64_t)offset < (1ll << 8 * sizeof(StoreOffset))); |
Jarin
2016/08/19 09:30:35
At this point, the upper bound check is useless, j
bgeron
2016/08/19 10:42:10
Done.
| |
178 return (StoreOffset)offset; | 177 return (StoreOffset)offset; |
Jarin
2016/08/19 09:30:35
static_cast, please.
bgeron
2016/08/19 10:42:10
Done.
| |
179 } | 178 } |
180 | 179 |
181 StoreOffset ToOffset(const FieldAccess& access) { | 180 StoreOffset ToOffset(const FieldAccess& access) { |
182 return ToOffset(access.offset); | 181 return ToOffset(access.offset); |
183 } | 182 } |
184 | 183 |
185 unsigned int RepSizeOf(MachineRepresentation rep) { | 184 unsigned int RepSizeOf(MachineRepresentation rep) { |
186 return 1u << ElementSizeLog2Of(rep); | 185 return 1u << ElementSizeLog2Of(rep); |
187 } | 186 } |
188 unsigned int RepSizeOf(FieldAccess access) { | 187 unsigned int RepSizeOf(FieldAccess access) { |
(...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
561 return !(*this == other); | 560 return !(*this == other); |
562 } | 561 } |
563 | 562 |
564 bool UnobservableStore::operator<(const UnobservableStore other) const { | 563 bool UnobservableStore::operator<(const UnobservableStore other) const { |
565 return (id_ < other.id_) || (id_ == other.id_ && offset_ < other.offset_); | 564 return (id_ < other.id_) || (id_ == other.id_ && offset_ < other.offset_); |
566 } | 565 } |
567 | 566 |
568 } // namespace compiler | 567 } // namespace compiler |
569 } // namespace internal | 568 } // namespace internal |
570 } // namespace v8 | 569 } // namespace v8 |
OLD | NEW |