Revision: 16028
Author: [email protected]
Date: Fri Aug 2 04:24:55 2013
Log: Store transition on HStoreNamedField as HConstant.
This allows optimization passes that run in the parallel compiler thread
to use the map that a store transitions to for further analysis even
though the map handle cannot be dereferenced.
[email protected]
Review URL: https://codereview.chromium.org/21560002
http://code.google.com/p/v8/source/detail?r=16028
Modified:
/branches/bleeding_edge/src/arm/lithium-arm.cc
/branches/bleeding_edge/src/arm/lithium-arm.h
/branches/bleeding_edge/src/hydrogen-instructions.cc
/branches/bleeding_edge/src/hydrogen-instructions.h
/branches/bleeding_edge/src/hydrogen.cc
/branches/bleeding_edge/src/ia32/lithium-ia32.cc
/branches/bleeding_edge/src/ia32/lithium-ia32.h
/branches/bleeding_edge/src/mips/lithium-mips.cc
/branches/bleeding_edge/src/mips/lithium-mips.h
/branches/bleeding_edge/src/x64/lithium-x64.cc
/branches/bleeding_edge/src/x64/lithium-x64.h
=======================================
--- /branches/bleeding_edge/src/arm/lithium-arm.cc Fri Aug 2 04:17:26 2013
+++ /branches/bleeding_edge/src/arm/lithium-arm.cc Fri Aug 2 04:24:55 2013
@@ -2311,7 +2311,7 @@
LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
bool is_in_object = instr->access().IsInobject();
bool needs_write_barrier = instr->NeedsWriteBarrier();
- bool needs_write_barrier_for_map = !instr->transition().is_null() &&
+ bool needs_write_barrier_for_map = instr->has_transition() &&
instr->NeedsWriteBarrierForMap();
LOperand* obj;
=======================================
--- /branches/bleeding_edge/src/arm/lithium-arm.h Fri Aug 2 02:53:11 2013
+++ /branches/bleeding_edge/src/arm/lithium-arm.h Fri Aug 2 04:24:55 2013
@@ -2150,7 +2150,7 @@
virtual void PrintDataTo(StringStream* stream);
- Handle<Map> transition() const { return hydrogen()->transition(); }
+ Handle<Map> transition() const { return hydrogen()->transition_map(); }
Representation representation() const {
return hydrogen()->field_representation();
}
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.cc Fri Aug 2
04:17:26 2013
+++ /branches/bleeding_edge/src/hydrogen-instructions.cc Fri Aug 2
04:24:55 2013
@@ -1389,10 +1389,10 @@
// for which the map is known.
if (HasNoUses() && dominator->IsStoreNamedField()) {
HStoreNamedField* store = HStoreNamedField::cast(dominator);
- UniqueValueId map_unique_id = store->transition_unique_id();
- if (!map_unique_id.IsInitialized() || store->object() != value())
return;
+ if (!store->has_transition() || store->object() != value()) return;
+ HConstant* transition = HConstant::cast(store->transition());
for (int i = 0; i < map_set()->length(); i++) {
- if (map_unique_id == map_unique_ids_.at(i)) {
+ if (transition->UniqueValueIdsMatch(map_unique_ids_.at(i))) {
DeleteAndReplaceWith(NULL);
return;
}
@@ -3160,8 +3160,8 @@
if (NeedsWriteBarrier()) {
stream->Add(" (write-barrier)");
}
- if (!transition().is_null()) {
- stream->Add(" (transition map %p)", *transition());
+ if (has_transition()) {
+ stream->Add(" (transition map %p)", *transition_map());
}
}
=======================================
--- /branches/bleeding_edge/src/hydrogen-instructions.h Fri Aug 2 04:17:26
2013
+++ /branches/bleeding_edge/src/hydrogen-instructions.h Fri Aug 2 04:24:55
2013
@@ -5971,7 +5971,7 @@
};
-class HStoreNamedField: public HTemplateInstruction<2> {
+class HStoreNamedField: public HTemplateInstruction<3> {
public:
DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*,
HObjectAccess, HValue*);
@@ -6003,24 +6003,37 @@
return write_barrier_mode_ == SKIP_WRITE_BARRIER;
}
- HValue* object() { return OperandAt(0); }
- HValue* value() { return OperandAt(1); }
+ HValue* object() const { return OperandAt(0); }
+ HValue* value() const { return OperandAt(1); }
+ HValue* transition() const { return OperandAt(2); }
HObjectAccess access() const { return access_; }
- Handle<Map> transition() const { return transition_; }
- UniqueValueId transition_unique_id() const { return
transition_unique_id_; }
- void SetTransition(Handle<Map> map, CompilationInfo* info) {
- ASSERT(transition_.is_null()); // Only set once.
+ HValue* new_space_dominator() const { return new_space_dominator_; }
+
+ bool has_transition() const {
+ return transition() != object();
+ }
+
+ Handle<Map> transition_map() const {
+ if (has_transition()) {
+ return Handle<Map>::cast(HConstant::cast(transition())->handle());
+ } else {
+ return Handle<Map>();
+ }
+ }
+
+ void SetTransition(HConstant* map_constant, CompilationInfo* info) {
+ ASSERT(!has_transition()); // Only set once.
+ Handle<Map> map = Handle<Map>::cast(map_constant->handle());
if (map->CanBeDeprecated()) {
map->AddDependentCompilationInfo(DependentCode::kTransitionGroup,
info);
}
- transition_ = map;
+ SetOperandAt(2, map_constant);
}
- HValue* new_space_dominator() const { return new_space_dominator_; }
bool NeedsWriteBarrier() {
ASSERT(!(FLAG_track_double_fields &&
field_representation().IsDouble()) ||
- transition_.is_null());
+ !has_transition());
if (IsSkipWriteBarrier()) return false;
if (field_representation().IsDouble()) return false;
if (field_representation().IsSmi()) return false;
@@ -6034,10 +6047,6 @@
if (IsSkipWriteBarrier()) return false;
return ReceiverObjectNeedsWriteBarrier(object(),
new_space_dominator());
}
-
- virtual void FinalizeUniqueValueId() {
- transition_unique_id_ = UniqueValueId(transition_);
- }
Representation field_representation() const {
return access_.representation();
@@ -6048,18 +6057,15 @@
HObjectAccess access,
HValue* val)
: access_(access),
- transition_(),
- transition_unique_id_(),
new_space_dominator_(NULL),
write_barrier_mode_(UPDATE_WRITE_BARRIER) {
SetOperandAt(0, obj);
SetOperandAt(1, val);
+ SetOperandAt(2, obj);
access.SetGVNFlags(this, true);
}
HObjectAccess access_;
- Handle<Map> transition_;
- UniqueValueId transition_unique_id_;
HValue* new_space_dominator_;
WriteBarrierMode write_barrier_mode_;
};
=======================================
--- /branches/bleeding_edge/src/hydrogen.cc Fri Aug 2 04:17:26 2013
+++ /branches/bleeding_edge/src/hydrogen.cc Fri Aug 2 04:24:55 2013
@@ -4506,7 +4506,8 @@
if (transition_to_field) {
Handle<Map> transition(lookup->GetTransitionMapFromMap(*map));
- instr->SetTransition(transition, top_info());
+ HConstant* transition_constant = Add<HConstant>(transition);
+ instr->SetTransition(transition_constant, top_info());
// TODO(fschneider): Record the new map type of the object in the IR to
// enable elimination of redundant checks after the transition store.
instr->SetGVNFlag(kChangesMaps);
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.cc Fri Aug 2 04:17:26
2013
+++ /branches/bleeding_edge/src/ia32/lithium-ia32.cc Fri Aug 2 04:24:55
2013
@@ -2407,7 +2407,7 @@
bool is_external_location = instr->access().IsExternalMemory() &&
instr->access().offset() == 0;
bool needs_write_barrier = instr->NeedsWriteBarrier();
- bool needs_write_barrier_for_map = !instr->transition().is_null() &&
+ bool needs_write_barrier_for_map = instr->has_transition() &&
instr->NeedsWriteBarrierForMap();
LOperand* obj;
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-ia32.h Fri Aug 2 02:53:11 2013
+++ /branches/bleeding_edge/src/ia32/lithium-ia32.h Fri Aug 2 04:24:55 2013
@@ -2236,7 +2236,7 @@
virtual void PrintDataTo(StringStream* stream);
- Handle<Map> transition() const { return hydrogen()->transition(); }
+ Handle<Map> transition() const { return hydrogen()->transition_map(); }
Representation representation() const {
return hydrogen()->field_representation();
}
=======================================
--- /branches/bleeding_edge/src/mips/lithium-mips.cc Fri Aug 2 04:17:26
2013
+++ /branches/bleeding_edge/src/mips/lithium-mips.cc Fri Aug 2 04:24:55
2013
@@ -2234,7 +2234,7 @@
LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) {
bool is_in_object = instr->access().IsInobject();
bool needs_write_barrier = instr->NeedsWriteBarrier();
- bool needs_write_barrier_for_map = !instr->transition().is_null() &&
+ bool needs_write_barrier_for_map = instr->has_transition() &&
instr->NeedsWriteBarrierForMap();
LOperand* obj;
=======================================
--- /branches/bleeding_edge/src/mips/lithium-mips.h Fri Aug 2 02:53:11 2013
+++ /branches/bleeding_edge/src/mips/lithium-mips.h Fri Aug 2 04:24:55 2013
@@ -2128,7 +2128,7 @@
virtual void PrintDataTo(StringStream* stream);
- Handle<Map> transition() const { return hydrogen()->transition(); }
+ Handle<Map> transition() const { return hydrogen()->transition_map(); }
Representation representation() const {
return hydrogen()->field_representation();
}
=======================================
--- /branches/bleeding_edge/src/x64/lithium-x64.cc Fri Aug 2 04:17:26 2013
+++ /branches/bleeding_edge/src/x64/lithium-x64.cc Fri Aug 2 04:24:55 2013
@@ -2222,7 +2222,7 @@
bool is_external_location = instr->access().IsExternalMemory() &&
instr->access().offset() == 0;
bool needs_write_barrier = instr->NeedsWriteBarrier();
- bool needs_write_barrier_for_map = !instr->transition().is_null() &&
+ bool needs_write_barrier_for_map = instr->has_transition() &&
instr->NeedsWriteBarrierForMap();
LOperand* obj;
=======================================
--- /branches/bleeding_edge/src/x64/lithium-x64.h Fri Aug 2 02:53:11 2013
+++ /branches/bleeding_edge/src/x64/lithium-x64.h Fri Aug 2 04:24:55 2013
@@ -2066,7 +2066,7 @@
virtual void PrintDataTo(StringStream* stream);
- Handle<Map> transition() const { return hydrogen()->transition(); }
+ Handle<Map> transition() const { return hydrogen()->transition_map(); }
Representation representation() const {
return hydrogen()->field_representation();
}
--
--
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/groups/opt_out.