Make HForceRepresentation an idef.

An optimization in the array constructor wasn't firing because the code
would check for constant values, failing to find them through
intervening HForceRepresentation instructions. Repaired this site. A
follow-on CL will provide a better way of making decisions based on
constant HValues.

R=verwaest@chromium.org

Review URL: https://codereview.chromium.org/59623009

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@17708 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
mvstanton@chromium.org 2013-11-13 17:03:11 +00:00
parent e4ddf3ca48
commit 026c5507bd
2 changed files with 6 additions and 3 deletions

View File

@ -1579,6 +1579,9 @@ class HForceRepresentation V8_FINAL : public HTemplateInstruction<1> {
DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation)
protected:
virtual int RedefinedOperandIndex() { return 0; }
private: private:
HForceRepresentation(HValue* value, Representation required_representation) { HForceRepresentation(HValue* value, Representation required_representation) {
SetOperandAt(0, value); SetOperandAt(0, value);

View File

@ -2100,10 +2100,10 @@ void HGraphBuilder::BuildFillElementsWithHole(HValue* elements,
static const int kLoopUnfoldLimit = 4; static const int kLoopUnfoldLimit = 4;
bool unfold_loop = false; bool unfold_loop = false;
int initial_capacity = JSArray::kPreallocatedArrayElements; int initial_capacity = JSArray::kPreallocatedArrayElements;
if (from->IsConstant() && to->IsConstant() && if (from->ActualValue()->IsConstant() && to->ActualValue()->IsConstant() &&
initial_capacity <= kLoopUnfoldLimit) { initial_capacity <= kLoopUnfoldLimit) {
HConstant* constant_from = HConstant::cast(from); HConstant* constant_from = HConstant::cast(from->ActualValue());
HConstant* constant_to = HConstant::cast(to); HConstant* constant_to = HConstant::cast(to->ActualValue());
if (constant_from->HasInteger32Value() && if (constant_from->HasInteger32Value() &&
constant_from->Integer32Value() == 0 && constant_from->Integer32Value() == 0 &&