Reviewers: Igor Sheludko,
Message:
Hey Igor,
Here's that fix for store elimination I mentioned yesterday.
PTAL
-- Benedikt
Description:
Don't replace initializing smi stores during store elimination.
Please review this at https://codereview.chromium.org/286903019/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+14, -1 lines):
M src/hydrogen-instructions.h
M src/hydrogen-store-elimination.cc
Index: src/hydrogen-instructions.h
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
index
f820d73ccc4afc7e58a4c5d34823059af8bed96e..2fe04385790ec7b9cd0a09e8288754dfecc1f0e8
100644
--- a/src/hydrogen-instructions.h
+++ b/src/hydrogen-instructions.h
@@ -6753,6 +6753,19 @@ class HStoreNamedField V8_FINAL : public
HTemplateInstruction<3> {
SetOperandAt(1, value);
}
+ bool CanBeReplacedWith(HStoreNamedField* that) const {
+ if (!this->access().Equals(that->access())) return false;
+ if (SmiValuesAre32Bits() &&
+ this->field_representation().IsSmi() &&
+ this->store_mode() == INITIALIZING_STORE &&
+ that->store_mode() == STORE_TO_INITIALIZED_ENTRY) {
+ // We cannot replace an initializing store to a smi field with a
store to
+ // an initialized entry on 64-bit architectures (with 32-bit smis).
+ return false;
+ }
+ return true;
+ }
+
private:
HStoreNamedField(HValue* obj,
HObjectAccess access,
Index: src/hydrogen-store-elimination.cc
diff --git a/src/hydrogen-store-elimination.cc
b/src/hydrogen-store-elimination.cc
index
cf5f3a15e69822491cb8e0ebda685fd576223f95..bbb115a9b40dfb67935a2ec34bf7641cb3d430c9
100644
--- a/src/hydrogen-store-elimination.cc
+++ b/src/hydrogen-store-elimination.cc
@@ -58,7 +58,7 @@ void
HStoreEliminationPhase::ProcessStore(HStoreNamedField* store) {
while (i < unobserved_.length()) {
HStoreNamedField* prev = unobserved_.at(i);
if (aliasing_->MustAlias(object, prev->object()->ActualValue()) &&
- store->access().Equals(prev->access())) {
+ prev->CanBeReplacedWith(store)) {
// This store is guaranteed to overwrite the previous store.
prev->DeleteAndReplaceWith(NULL);
TRACE(("++ Unobserved store S%d overwritten by S%d\n",
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.