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 { |