Reviewers: danno,
Message:
PTAL.
Description:
Fix deopts caused by misplaced COW checks.
TEST=Performance of pixel-array-blur back to normal.
Please review this at http://codereview.chromium.org/7471034/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/hydrogen-instructions.h
M src/hydrogen.cc
Index: src/hydrogen-instructions.h
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
index
63ee683d74cd032d08ef057f0cabfd78e8882a14..9b7a95b2f0a00923529e4577de47a9ad37a630a2
100644
--- a/src/hydrogen-instructions.h
+++ b/src/hydrogen-instructions.h
@@ -1898,10 +1898,14 @@ class HLoadExternalArrayPointer: public
HUnaryOperation {
};
-class HCheckMap: public HUnaryOperation {
+class HCheckMap: public HTemplateInstruction<2> {
public:
- HCheckMap(HValue* value, Handle<Map> map)
- : HUnaryOperation(value), map_(map) {
+ HCheckMap(HValue* value, Handle<Map> map, HValue* typecheck = NULL)
+ : map_(map) {
+ SetOperandAt(0, value);
+ // If callers don't depend on a typecheck, they can pass in NULL. In
that
+ // case we use a copy of the |value| argument as a dummy value.
+ SetOperandAt(1, typecheck != NULL ? typecheck : value);
set_representation(Representation::Tagged());
SetFlag(kUseGVN);
SetFlag(kDependsOnMaps);
@@ -1913,6 +1917,7 @@ class HCheckMap: public HUnaryOperation {
virtual void PrintDataTo(StringStream* stream);
virtual HType CalculateInferredType();
+ HValue* value() { return OperandAt(0); }
Handle<Map> map() const { return map_; }
DECLARE_CONCRETE_INSTRUCTION(CheckMap)
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index
69a060df56ac1d5743ed71a82fe8b6d08aadd59f..78ea443e76519a2d0e9a2bf8ce0f0829c15c19c1
100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -3911,7 +3911,7 @@ HInstruction*
HGraphBuilder::BuildMonomorphicElementAccess(HValue* object,
HInstruction* mapcheck = AddInstruction(new(zone()) HCheckMap(object,
map));
HInstruction* elements = AddInstruction(new(zone())
HLoadElements(object));
bool fast_double_elements = map->has_fast_double_elements();
- if (is_store && !fast_double_elements) {
+ if (is_store && map->has_fast_elements()) {
AddInstruction(new(zone()) HCheckMap(
elements, isolate()->factory()->fixed_array_map()));
}
@@ -4024,7 +4024,8 @@ HValue*
HGraphBuilder::HandlePolymorphicElementAccess(HValue* object,
elements_kind == JSObject::FAST_DOUBLE_ELEMENTS;
if (is_store && !fast_double_elements) {
AddInstruction(new(zone()) HCheckMap(
- elements, isolate()->factory()->fixed_array_map()));
+ elements, isolate()->factory()->fixed_array_map(),
+ elements_kind_branch));
}
HBasicBlock* if_jsarray = graph()->CreateBasicBlock();
HBasicBlock* if_fastobject = graph()->CreateBasicBlock();
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev