Remove HFixedArrayBaseLength instruction and replace with regular HLoadNamedField.
BUG= Review URL: https://codereview.chromium.org/18508002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15454 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
15c28b8006
commit
63abcc515b
@ -1796,13 +1796,6 @@ LInstruction* LChunkBuilder::DoClassOfTestAndBranch(
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoFixedArrayBaseLength(
|
||||
HFixedArrayBaseLength* instr) {
|
||||
LOperand* array = UseRegisterAtStart(instr->value());
|
||||
return DefineAsRegister(new(zone()) LFixedArrayBaseLength(array));
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) {
|
||||
LOperand* map = UseRegisterAtStart(instr->value());
|
||||
return DefineAsRegister(new(zone()) LMapEnumLength(map));
|
||||
|
@ -99,7 +99,6 @@ class LCodeGen;
|
||||
V(DoubleToSmi) \
|
||||
V(DummyUse) \
|
||||
V(ElementsKind) \
|
||||
V(FixedArrayBaseLength) \
|
||||
V(FunctionLiteral) \
|
||||
V(GetCachedArrayIndex) \
|
||||
V(GlobalObject) \
|
||||
@ -1281,20 +1280,6 @@ class LCmpMapAndBranch: public LControlInstruction<1, 1> {
|
||||
};
|
||||
|
||||
|
||||
class LFixedArrayBaseLength: public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LFixedArrayBaseLength(LOperand* value) {
|
||||
inputs_[0] = value;
|
||||
}
|
||||
|
||||
LOperand* value() { return inputs_[0]; }
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength,
|
||||
"fixed-array-base-length")
|
||||
DECLARE_HYDROGEN_ACCESSOR(FixedArrayBaseLength)
|
||||
};
|
||||
|
||||
|
||||
class LMapEnumLength: public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LMapEnumLength(LOperand* value) {
|
||||
|
@ -1846,13 +1846,6 @@ void LCodeGen::DoConstantT(LConstantT* instr) {
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoFixedArrayBaseLength(LFixedArrayBaseLength* instr) {
|
||||
Register result = ToRegister(instr->result());
|
||||
Register array = ToRegister(instr->value());
|
||||
__ ldr(result, FieldMemOperand(array, FixedArrayBase::kLengthOffset));
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoMapEnumLength(LMapEnumLength* instr) {
|
||||
Register result = ToRegister(instr->result());
|
||||
Register map = ToRegister(instr->value());
|
||||
|
@ -510,8 +510,7 @@ HValue* CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() {
|
||||
|
||||
HInstruction* elements = AddLoadElements(js_array);
|
||||
|
||||
HInstruction* elements_length =
|
||||
AddInstruction(new(zone) HFixedArrayBaseLength(elements));
|
||||
HInstruction* elements_length = AddLoadFixedArrayLength(elements);
|
||||
|
||||
HValue* new_elements = BuildAllocateElementsAndInitializeElementsHeader(
|
||||
context(), to_kind, elements_length);
|
||||
|
@ -111,7 +111,6 @@ class LChunkBuilder;
|
||||
V(ElementsKind) \
|
||||
V(EnterInlined) \
|
||||
V(EnvironmentMarker) \
|
||||
V(FixedArrayBaseLength) \
|
||||
V(ForceRepresentation) \
|
||||
V(FunctionLiteral) \
|
||||
V(GetCachedArrayIndex) \
|
||||
@ -2542,29 +2541,6 @@ class HCallRuntime: public HCall<1> {
|
||||
};
|
||||
|
||||
|
||||
class HFixedArrayBaseLength: public HUnaryOperation {
|
||||
public:
|
||||
explicit HFixedArrayBaseLength(HValue* value) : HUnaryOperation(value) {
|
||||
set_type(HType::Smi());
|
||||
set_representation(Representation::Smi());
|
||||
SetFlag(kUseGVN);
|
||||
SetGVNFlag(kDependsOnArrayLengths);
|
||||
}
|
||||
|
||||
virtual Representation RequiredInputRepresentation(int index) {
|
||||
return Representation::Tagged();
|
||||
}
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength)
|
||||
|
||||
protected:
|
||||
virtual bool DataEquals(HValue* other) { return true; }
|
||||
|
||||
private:
|
||||
virtual bool IsDeletable() const { return true; }
|
||||
};
|
||||
|
||||
|
||||
class HMapEnumLength: public HUnaryOperation {
|
||||
public:
|
||||
explicit HMapEnumLength(HValue* value) : HUnaryOperation(value) {
|
||||
|
@ -1132,7 +1132,7 @@ HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object,
|
||||
length_checker.IfCompare(length, key, Token::EQ);
|
||||
length_checker.Then();
|
||||
|
||||
HValue* current_capacity = Add<HFixedArrayBaseLength>(elements);
|
||||
HValue* current_capacity = AddLoadFixedArrayLength(elements);
|
||||
|
||||
IfBuilder capacity_checker(this);
|
||||
|
||||
@ -1188,7 +1188,7 @@ HValue* HGraphBuilder::BuildCopyElementsOnWrite(HValue* object,
|
||||
Handle<Map>(heap->fixed_cow_array_map()));
|
||||
cow_checker.Then();
|
||||
|
||||
HValue* capacity = Add<HFixedArrayBaseLength>(elements);
|
||||
HValue* capacity = AddLoadFixedArrayLength(elements);
|
||||
|
||||
HValue* new_elements = BuildGrowElementsCapacity(object, elements,
|
||||
kind, length, capacity);
|
||||
@ -1243,10 +1243,10 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess(
|
||||
if (is_js_array) {
|
||||
length = AddLoad(object, HObjectAccess::ForArrayLength(), mapcheck,
|
||||
Representation::Smi());
|
||||
length->set_type(HType::Smi());
|
||||
} else {
|
||||
length = Add<HFixedArrayBaseLength>(elements);
|
||||
length = AddLoadFixedArrayLength(elements);
|
||||
}
|
||||
length->set_type(HType::Smi());
|
||||
HValue* checked_key = NULL;
|
||||
if (IsExternalArrayElementsKind(elements_kind)) {
|
||||
if (store_mode == STORE_NO_TRANSITION_IGNORE_OUT_OF_BOUNDS) {
|
||||
@ -1416,6 +1416,14 @@ HLoadNamedField* HGraphBuilder::AddLoadElements(HValue* object,
|
||||
}
|
||||
|
||||
|
||||
HLoadNamedField* HGraphBuilder::AddLoadFixedArrayLength(HValue* object) {
|
||||
HLoadNamedField* instr = AddLoad(object, HObjectAccess::ForFixedArrayLength(),
|
||||
NULL, Representation::Smi());
|
||||
instr->set_type(HType::Smi());
|
||||
return instr;
|
||||
}
|
||||
|
||||
|
||||
HValue* HGraphBuilder::BuildNewElementsCapacity(HValue* context,
|
||||
HValue* old_capacity) {
|
||||
Zone* zone = this->zone();
|
||||
@ -6813,7 +6821,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess(
|
||||
LAST_ELEMENTS_KIND);
|
||||
if (elements_kind == FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND
|
||||
&& todo_external_array) {
|
||||
HInstruction* length = Add<HFixedArrayBaseLength>(elements);
|
||||
HInstruction* length = AddLoadFixedArrayLength(elements);
|
||||
checked_key = Add<HBoundsCheck>(key, length);
|
||||
external_elements = Add<HLoadExternalArrayPointer>(elements);
|
||||
}
|
||||
@ -6873,7 +6881,7 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess(
|
||||
if_jsarray->GotoNoSimulate(join);
|
||||
|
||||
set_current_block(if_fastobject);
|
||||
length = AddInstruction(new(zone()) HFixedArrayBaseLength(elements));
|
||||
length = AddLoadFixedArrayLength(elements);
|
||||
checked_key = Add<HBoundsCheck>(key, length);
|
||||
access = AddInstruction(BuildFastElementAccess(
|
||||
elements, checked_key, val, elements_kind_branch,
|
||||
|
@ -1135,6 +1135,8 @@ class HGraphBuilder {
|
||||
|
||||
HLoadNamedField* AddLoadElements(HValue *object, HValue *typecheck = NULL);
|
||||
|
||||
HLoadNamedField* AddLoadFixedArrayLength(HValue *object);
|
||||
|
||||
class IfBuilder {
|
||||
public:
|
||||
explicit IfBuilder(HGraphBuilder* builder,
|
||||
|
@ -1773,14 +1773,6 @@ void LCodeGen::DoConstantT(LConstantT* instr) {
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoFixedArrayBaseLength(
|
||||
LFixedArrayBaseLength* instr) {
|
||||
Register result = ToRegister(instr->result());
|
||||
Register array = ToRegister(instr->value());
|
||||
__ mov(result, FieldOperand(array, FixedArrayBase::kLengthOffset));
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoMapEnumLength(LMapEnumLength* instr) {
|
||||
Register result = ToRegister(instr->result());
|
||||
Register map = ToRegister(instr->value());
|
||||
|
@ -1816,13 +1816,6 @@ LInstruction* LChunkBuilder::DoClassOfTestAndBranch(
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoFixedArrayBaseLength(
|
||||
HFixedArrayBaseLength* instr) {
|
||||
LOperand* array = UseRegisterAtStart(instr->value());
|
||||
return DefineAsRegister(new(zone()) LFixedArrayBaseLength(array));
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) {
|
||||
LOperand* map = UseRegisterAtStart(instr->value());
|
||||
return DefineAsRegister(new(zone()) LMapEnumLength(map));
|
||||
|
@ -94,7 +94,6 @@ class LCodeGen;
|
||||
V(DoubleToSmi) \
|
||||
V(DummyUse) \
|
||||
V(ElementsKind) \
|
||||
V(FixedArrayBaseLength) \
|
||||
V(FunctionLiteral) \
|
||||
V(GetCachedArrayIndex) \
|
||||
V(GlobalObject) \
|
||||
@ -1251,20 +1250,6 @@ class LCmpMapAndBranch: public LControlInstruction<1, 0> {
|
||||
};
|
||||
|
||||
|
||||
class LFixedArrayBaseLength: public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LFixedArrayBaseLength(LOperand* value) {
|
||||
inputs_[0] = value;
|
||||
}
|
||||
|
||||
LOperand* value() { return inputs_[0]; }
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength,
|
||||
"fixed-array-base-length")
|
||||
DECLARE_HYDROGEN_ACCESSOR(FixedArrayBaseLength)
|
||||
};
|
||||
|
||||
|
||||
class LMapEnumLength: public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LMapEnumLength(LOperand* value) {
|
||||
|
@ -1675,13 +1675,6 @@ void LCodeGen::DoConstantT(LConstantT* instr) {
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoFixedArrayBaseLength(LFixedArrayBaseLength* instr) {
|
||||
Register result = ToRegister(instr->result());
|
||||
Register array = ToRegister(instr->value());
|
||||
__ lw(result, FieldMemOperand(array, FixedArrayBase::kLengthOffset));
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoMapEnumLength(LMapEnumLength* instr) {
|
||||
Register result = ToRegister(instr->result());
|
||||
Register map = ToRegister(instr->value());
|
||||
|
@ -1716,13 +1716,6 @@ LInstruction* LChunkBuilder::DoClassOfTestAndBranch(
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoFixedArrayBaseLength(
|
||||
HFixedArrayBaseLength* instr) {
|
||||
LOperand* array = UseRegisterAtStart(instr->value());
|
||||
return DefineAsRegister(new(zone()) LFixedArrayBaseLength(array));
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) {
|
||||
LOperand* map = UseRegisterAtStart(instr->value());
|
||||
return DefineAsRegister(new(zone()) LMapEnumLength(map));
|
||||
|
@ -99,7 +99,6 @@ class LCodeGen;
|
||||
V(DoubleToSmi) \
|
||||
V(DummyUse) \
|
||||
V(ElementsKind) \
|
||||
V(FixedArrayBaseLength) \
|
||||
V(FunctionLiteral) \
|
||||
V(GetCachedArrayIndex) \
|
||||
V(GlobalObject) \
|
||||
@ -1260,20 +1259,6 @@ class LCmpMapAndBranch: public LControlInstruction<1, 1> {
|
||||
};
|
||||
|
||||
|
||||
class LFixedArrayBaseLength: public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LFixedArrayBaseLength(LOperand* value) {
|
||||
inputs_[0] = value;
|
||||
}
|
||||
|
||||
LOperand* value() { return inputs_[0]; }
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength,
|
||||
"fixed-array-base-length")
|
||||
DECLARE_HYDROGEN_ACCESSOR(FixedArrayBaseLength)
|
||||
};
|
||||
|
||||
|
||||
class LMapEnumLength: public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LMapEnumLength(LOperand* value) {
|
||||
|
@ -1553,13 +1553,6 @@ void LCodeGen::DoConstantT(LConstantT* instr) {
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoFixedArrayBaseLength(LFixedArrayBaseLength* instr) {
|
||||
Register result = ToRegister(instr->result());
|
||||
Register array = ToRegister(instr->value());
|
||||
__ movq(result, FieldOperand(array, FixedArrayBase::kLengthOffset));
|
||||
}
|
||||
|
||||
|
||||
void LCodeGen::DoMapEnumLength(LMapEnumLength* instr) {
|
||||
Register result = ToRegister(instr->result());
|
||||
Register map = ToRegister(instr->value());
|
||||
|
@ -1718,13 +1718,6 @@ LInstruction* LChunkBuilder::DoClassOfTestAndBranch(
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoFixedArrayBaseLength(
|
||||
HFixedArrayBaseLength* instr) {
|
||||
LOperand* array = UseRegisterAtStart(instr->value());
|
||||
return DefineAsRegister(new(zone()) LFixedArrayBaseLength(array));
|
||||
}
|
||||
|
||||
|
||||
LInstruction* LChunkBuilder::DoMapEnumLength(HMapEnumLength* instr) {
|
||||
LOperand* map = UseRegisterAtStart(instr->value());
|
||||
return DefineAsRegister(new(zone()) LMapEnumLength(map));
|
||||
|
@ -99,7 +99,6 @@ class LCodeGen;
|
||||
V(DoubleToSmi) \
|
||||
V(DummyUse) \
|
||||
V(ElementsKind) \
|
||||
V(FixedArrayBaseLength) \
|
||||
V(MapEnumLength) \
|
||||
V(FunctionLiteral) \
|
||||
V(GetCachedArrayIndex) \
|
||||
@ -1233,20 +1232,6 @@ class LCmpMapAndBranch: public LControlInstruction<1, 0> {
|
||||
};
|
||||
|
||||
|
||||
class LFixedArrayBaseLength: public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LFixedArrayBaseLength(LOperand* value) {
|
||||
inputs_[0] = value;
|
||||
}
|
||||
|
||||
LOperand* value() { return inputs_[0]; }
|
||||
|
||||
DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength,
|
||||
"fixed-array-base-length")
|
||||
DECLARE_HYDROGEN_ACCESSOR(FixedArrayBaseLength)
|
||||
};
|
||||
|
||||
|
||||
class LMapEnumLength: public LTemplateInstruction<1, 1, 0> {
|
||||
public:
|
||||
explicit LMapEnumLength(LOperand* value) {
|
||||
|
Loading…
Reference in New Issue
Block a user