Reviewers: Søren Gjesse, Description: Strengthen requirements for fixed registers at calls.
We now always require fixed input registers at calls to avoid overlap with temp registers. Please review this at http://codereview.chromium.org/6471021/ SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/ Affected files: M src/arm/lithium-arm.cc M src/ia32/lithium-ia32.cc M src/x64/lithium-x64.cc Index: src/arm/lithium-arm.cc =================================================================== --- src/arm/lithium-arm.cc (revision 6717) +++ src/arm/lithium-arm.cc (working copy) @@ -62,8 +62,7 @@ // Call instructions can use only fixed registers as // temporaries and outputs because all registers // are blocked by the calling convention. - // Inputs can use either fixed register or have a short lifetime (be - // used at start of the instruction). + // Inputs must use a fixed register. ASSERT(Output() == NULL || LUnallocated::cast(Output())->HasFixedPolicy() || !LUnallocated::cast(Output())->HasRegisterPolicy()); @@ -1831,8 +1830,8 @@ LInstruction* LChunkBuilder::DoDeleteProperty(HDeleteProperty* instr) { - LOperand* object = UseRegisterAtStart(instr->object()); - LOperand* key = UseRegisterAtStart(instr->key()); + LOperand* object = UseFixed(instr->object(), r0); + LOperand* key = UseFixed(instr->key(), r1); LDeleteProperty* result = new LDeleteProperty(object, key); return MarkAsCall(DefineFixed(result, r0), instr); } @@ -1880,7 +1879,7 @@ LInstruction* LChunkBuilder::DoTypeof(HTypeof* instr) { - LTypeof* result = new LTypeof(UseRegisterAtStart(instr->value())); + LTypeof* result = new LTypeof(UseFixed(instr->value(), r0)); return MarkAsCall(DefineFixed(result, r0), instr); } Index: src/ia32/lithium-ia32.cc =================================================================== --- src/ia32/lithium-ia32.cc (revision 6717) +++ src/ia32/lithium-ia32.cc (working copy) @@ -74,8 +74,7 @@ // Call instructions can use only fixed registers as // temporaries and outputs because all registers // are blocked by the calling convention. - // Inputs can use either fixed register or have a short lifetime (be - // used at start of the instruction). + // Inputs must use a fixed register. ASSERT(Output() == NULL || LUnallocated::cast(Output())->HasFixedPolicy() || !LUnallocated::cast(Output())->HasRegisterPolicy()); Index: src/x64/lithium-x64.cc =================================================================== --- src/x64/lithium-x64.cc (revision 6717) +++ src/x64/lithium-x64.cc (working copy) @@ -74,15 +74,13 @@ // Call instructions can use only fixed registers as // temporaries and outputs because all registers // are blocked by the calling convention. - // Inputs can use either fixed register or have a short lifetime (be - // used at start of the instruction). + // Inputs must use a fixed register. ASSERT(Output() == NULL || LUnallocated::cast(Output())->HasFixedPolicy() || !LUnallocated::cast(Output())->HasRegisterPolicy()); for (UseIterator it(this); it.HasNext(); it.Advance()) { LOperand* operand = it.Next(); ASSERT(LUnallocated::cast(operand)->HasFixedPolicy() || - LUnallocated::cast(operand)->IsUsedAtStart() || !LUnallocated::cast(operand)->HasRegisterPolicy()); } for (TempIterator it(this); it.HasNext(); it.Advance()) { -- v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev
