| Index: src/compiler/ia32/code-generator-ia32.cc
|
| diff --git a/src/compiler/ia32/code-generator-ia32.cc b/src/compiler/ia32/code-generator-ia32.cc
|
| index 7864d90a82672afc5c866125db897eb6b0b3f12c..3cb3d40539ca7a9e6e1a43d6275d86f6397a4277 100644
|
| --- a/src/compiler/ia32/code-generator-ia32.cc
|
| +++ b/src/compiler/ia32/code-generator-ia32.cc
|
| @@ -1119,7 +1119,19 @@ void CodeGenerator::AssembleMove(InstructionOperand* source,
|
| Constant src_constant = g.ToConstant(source);
|
| if (src_constant.type() == Constant::kHeapObject) {
|
| Handle<HeapObject> src = src_constant.ToHeapObject();
|
| - if (destination->IsRegister()) {
|
| + if (info()->IsOptimizing() && src.is_identical_to(info()->context())) {
|
| + // Loading the context from the frame is way cheaper than materializing
|
| + // the actual context heap object address.
|
| + if (destination->IsRegister()) {
|
| + Register dst = g.ToRegister(destination);
|
| + __ mov(dst, Operand(ebp, StandardFrameConstants::kContextOffset));
|
| + } else {
|
| + DCHECK(destination->IsStackSlot());
|
| + Operand dst = g.ToOperand(destination);
|
| + __ push(Operand(ebp, StandardFrameConstants::kContextOffset));
|
| + __ pop(dst);
|
| + }
|
| + } else if (destination->IsRegister()) {
|
| Register dst = g.ToRegister(destination);
|
| __ LoadHeapObject(dst, src);
|
| } else {
|
|
|