Title: [98831] trunk/Source/_javascript_Core
Revision
98831
Author
[email protected]
Date
2011-10-30 15:47:31 -0700 (Sun, 30 Oct 2011)

Log Message

The DFG inliner should not flush the callee
https://bugs.webkit.org/show_bug.cgi?id=71191

Reviewed by Oliver Hunt.
        
0.6% speed-up on V8.

* bytecode/CodeBlock.cpp:
(JSC::CodeBlock::visitAggregate):
* bytecode/CodeOrigin.h:
* dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::flush):
(JSC::DFG::ByteCodeParser::handleInlining):
(JSC::DFG::ByteCodeParser::parseBlock):
(JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):
(JSC::DFG::ByteCodeParser::parse):
* dfg/DFGJITCompiler.cpp:
(JSC::DFG::JITCompiler::exitSpeculativeWithOSR):
* dfg/DFGJITCompiler32_64.cpp:
(JSC::DFG::JITCompiler::exitSpeculativeWithOSR):
* interpreter/CallFrame.cpp:
(JSC::CallFrame::trueCallerFrameSlow):

Modified Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (98830 => 98831)


--- trunk/Source/_javascript_Core/ChangeLog	2011-10-30 22:42:24 UTC (rev 98830)
+++ trunk/Source/_javascript_Core/ChangeLog	2011-10-30 22:47:31 UTC (rev 98831)
@@ -1,3 +1,28 @@
+2011-10-30  Filip Pizlo  <[email protected]>
+
+        The DFG inliner should not flush the callee
+        https://bugs.webkit.org/show_bug.cgi?id=71191
+
+        Reviewed by Oliver Hunt.
+        
+        0.6% speed-up on V8.
+
+        * bytecode/CodeBlock.cpp:
+        (JSC::CodeBlock::visitAggregate):
+        * bytecode/CodeOrigin.h:
+        * dfg/DFGByteCodeParser.cpp:
+        (JSC::DFG::ByteCodeParser::flush):
+        (JSC::DFG::ByteCodeParser::handleInlining):
+        (JSC::DFG::ByteCodeParser::parseBlock):
+        (JSC::DFG::ByteCodeParser::InlineStackEntry::InlineStackEntry):
+        (JSC::DFG::ByteCodeParser::parse):
+        * dfg/DFGJITCompiler.cpp:
+        (JSC::DFG::JITCompiler::exitSpeculativeWithOSR):
+        * dfg/DFGJITCompiler32_64.cpp:
+        (JSC::DFG::JITCompiler::exitSpeculativeWithOSR):
+        * interpreter/CallFrame.cpp:
+        (JSC::CallFrame::trueCallerFrameSlow):
+
 2011-10-28  Mark Hahnenberg  <[email protected]>
 
         De-virtualize isGlobalObject, isVariableObject, isActivationObject, and isErrorInstance in JSObject

Modified: trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp (98830 => 98831)


--- trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp	2011-10-30 22:42:24 UTC (rev 98830)
+++ trunk/Source/_javascript_Core/bytecode/CodeBlock.cpp	2011-10-30 22:47:31 UTC (rev 98831)
@@ -1585,8 +1585,10 @@
     if (hasCodeOrigins()) {
         // Make sure that executables that we have inlined don't die.
         // FIXME: If they would have otherwise died, we should probably trigger recompilation.
-        for (size_t i = 0; i < inlineCallFrames().size(); ++i)
+        for (size_t i = 0; i < inlineCallFrames().size(); ++i) {
             visitor.append(&inlineCallFrames()[i].executable);
+            visitor.append(&inlineCallFrames()[i].callee);
+        }
     }
 #endif
 

Modified: trunk/Source/_javascript_Core/bytecode/CodeOrigin.h (98830 => 98831)


--- trunk/Source/_javascript_Core/bytecode/CodeOrigin.h	2011-10-30 22:42:24 UTC (rev 98830)
+++ trunk/Source/_javascript_Core/bytecode/CodeOrigin.h	2011-10-30 22:47:31 UTC (rev 98831)
@@ -34,6 +34,7 @@
 
 struct InlineCallFrame;
 class ExecutableBase;
+class JSFunction;
 
 struct CodeOrigin {
     uint32_t bytecodeIndex;
@@ -75,9 +76,9 @@
 
 struct InlineCallFrame {
     WriteBarrier<ExecutableBase> executable;
+    WriteBarrier<JSFunction> callee;
+    CodeOrigin caller;
     unsigned stackOffset;
-    unsigned calleeVR;
-    CodeOrigin caller;
     unsigned numArgumentsIncludingThis : 31;
     bool isCall : 1;
 };

Modified: trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp (98830 => 98831)


--- trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp	2011-10-30 22:42:24 UTC (rev 98830)
+++ trunk/Source/_javascript_Core/dfg/DFGByteCodeParser.cpp	2011-10-30 22:47:31 UTC (rev 98831)
@@ -255,6 +255,9 @@
     
     void flush(int operand)
     {
+        // FIXME: This should check if the same operand had already been flushed to
+        // some other local variable.
+        
         operand = m_inlineStackTop->remapOperand(operand);
         
         ASSERT(operand < FirstConstantRegisterIndex);
@@ -749,6 +752,7 @@
         CodeBlock* m_codeBlock;
         CodeBlock* m_profiledBlock;
         InlineCallFrame* m_inlineCallFrame;
+        VirtualRegister m_calleeVR; // absolute virtual register, not relative to call frame
         
         ScriptExecutable* executable() { return m_codeBlock->ownerExecutable(); }
         
@@ -794,7 +798,7 @@
         
         InlineStackEntry* m_caller;
         
-        InlineStackEntry(ByteCodeParser*, CodeBlock*, CodeBlock* profiledBlock, BlockIndex callsiteBlockHead, VirtualRegister calleeVR, VirtualRegister returnValueVR, VirtualRegister inlineCallFrameStart, CodeSpecializationKind);
+        InlineStackEntry(ByteCodeParser*, CodeBlock*, CodeBlock* profiledBlock, BlockIndex callsiteBlockHead, VirtualRegister calleeVR, JSFunction* callee, VirtualRegister returnValueVR, VirtualRegister inlineCallFrameStart, CodeSpecializationKind);
         
         ~InlineStackEntry()
         {
@@ -965,7 +969,6 @@
     
     // FIXME: Don't flush constants!
     
-    flush(callTarget);
     for (int arg = firstArg + 1; arg <= lastArg; ++arg)
         flush(arg);
     
@@ -983,7 +986,7 @@
             m_graph.m_blocks[i]->ensureLocals(newNumLocals);
     }
 
-    InlineStackEntry inlineStackEntry(this, codeBlock.get(), profiledBlock, m_graph.m_blocks.size() - 1, (VirtualRegister)m_inlineStackTop->remapOperand(callTarget), (VirtualRegister)m_inlineStackTop->remapOperand(usesResult ? resultOperand : InvalidVirtualRegister), (VirtualRegister)inlineCallFrameStart, kind);
+    InlineStackEntry inlineStackEntry(this, codeBlock.get(), profiledBlock, m_graph.m_blocks.size() - 1, (VirtualRegister)m_inlineStackTop->remapOperand(callTarget), expectedFunction, (VirtualRegister)m_inlineStackTop->remapOperand(usesResult ? resultOperand : InvalidVirtualRegister), (VirtualRegister)inlineCallFrameStart, kind);
     
     // This is where the actual inlining really happens.
     unsigned oldIndex = m_currentIndex;
@@ -1297,7 +1300,7 @@
             
         case op_get_callee: {
             if (m_inlineStackTop->m_inlineCallFrame)
-                set(currentInstruction[1].u.operand, getDirect(m_inlineStackTop->m_inlineCallFrame->calleeVR));
+                set(currentInstruction[1].u.operand, getDirect(m_inlineStackTop->m_calleeVR));
             else
                 set(currentInstruction[1].u.operand, addToGraph(GetCallee));
             NEXT_OPCODE(op_get_callee);
@@ -2281,10 +2284,11 @@
     m_haveBuiltOperandMaps = true;
 }
 
-ByteCodeParser::InlineStackEntry::InlineStackEntry(ByteCodeParser* byteCodeParser, CodeBlock* codeBlock, CodeBlock* profiledBlock, BlockIndex callsiteBlockHead, VirtualRegister calleeVR, VirtualRegister returnValueVR, VirtualRegister inlineCallFrameStart, CodeSpecializationKind kind)
+ByteCodeParser::InlineStackEntry::InlineStackEntry(ByteCodeParser* byteCodeParser, CodeBlock* codeBlock, CodeBlock* profiledBlock, BlockIndex callsiteBlockHead, VirtualRegister calleeVR, JSFunction* callee, VirtualRegister returnValueVR, VirtualRegister inlineCallFrameStart, CodeSpecializationKind kind)
     : m_byteCodeParser(byteCodeParser)
     , m_codeBlock(codeBlock)
     , m_profiledBlock(profiledBlock)
+    , m_calleeVR(calleeVR)
     , m_callsiteBlockHead(callsiteBlockHead)
     , m_returnValue(returnValueVR)
     , m_didReturn(false)
@@ -2294,6 +2298,7 @@
     if (m_caller) {
         // Inline case.
         ASSERT(codeBlock != byteCodeParser->m_codeBlock);
+        ASSERT(callee);
         ASSERT(calleeVR != InvalidVirtualRegister);
         ASSERT(inlineCallFrameStart != InvalidVirtualRegister);
         ASSERT(callsiteBlockHead != NoBlock);
@@ -2301,7 +2306,7 @@
         InlineCallFrame inlineCallFrame;
         inlineCallFrame.executable.set(*byteCodeParser->m_globalData, byteCodeParser->m_codeBlock->ownerExecutable(), codeBlock->ownerExecutable());
         inlineCallFrame.stackOffset = inlineCallFrameStart + RegisterFile::CallFrameHeaderSize;
-        inlineCallFrame.calleeVR = calleeVR;
+        inlineCallFrame.callee.set(*byteCodeParser->m_globalData, byteCodeParser->m_codeBlock->ownerExecutable(), callee);
         inlineCallFrame.caller = byteCodeParser->currentCodeOrigin();
         inlineCallFrame.numArgumentsIncludingThis = codeBlock->m_numParameters;
         inlineCallFrame.isCall = isCall(kind);
@@ -2334,6 +2339,7 @@
     } else {
         // Machine code block case.
         ASSERT(codeBlock == byteCodeParser->m_codeBlock);
+        ASSERT(!callee);
         ASSERT(calleeVR == InvalidVirtualRegister);
         ASSERT(returnValueVR == InvalidVirtualRegister);
         ASSERT(inlineCallFrameStart == InvalidVirtualRegister);
@@ -2435,7 +2441,7 @@
     // Set during construction.
     ASSERT(!m_currentIndex);
     
-    InlineStackEntry inlineStackEntry(this, m_codeBlock, m_profiledBlock, NoBlock, InvalidVirtualRegister, InvalidVirtualRegister, InvalidVirtualRegister, CodeForCall);
+    InlineStackEntry inlineStackEntry(this, m_codeBlock, m_profiledBlock, NoBlock, InvalidVirtualRegister, 0, InvalidVirtualRegister, InvalidVirtualRegister, CodeForCall);
     
     parseCodeBlock();
 

Modified: trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp (98830 => 98831)


--- trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp	2011-10-30 22:42:24 UTC (rev 98830)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCompiler.cpp	2011-10-30 22:47:31 UTC (rev 98831)
@@ -534,8 +534,6 @@
         
         void* jumpTarget = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(baselineCodeBlockForCaller->getJITCode().start()) + mapping->m_machineCodeOffset);
 
-        loadPtr(addressFor((VirtualRegister)inlineCallFrame->calleeVR), GPRInfo::regT1);
-        loadPtr(MacroAssembler::Address(GPRInfo::regT1, OBJECT_OFFSETOF(JSFunction, m_scopeChain)), GPRInfo::regT2);
         GPRReg callerFrameGPR;
         if (inlineCallFrame->caller.inlineCallFrame) {
             addPtr(Imm32(inlineCallFrame->caller.inlineCallFrame->stackOffset * sizeof(EncodedJSValue)), GPRInfo::callFrameRegister, GPRInfo::regT3);
@@ -544,11 +542,11 @@
             callerFrameGPR = GPRInfo::callFrameRegister;
         
         storePtr(TrustedImmPtr(baselineCodeBlock), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::CodeBlock)));
-        storePtr(GPRInfo::regT2, addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ScopeChain)));
+        storePtr(TrustedImmPtr(inlineCallFrame->callee->scope()), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ScopeChain)));
         storePtr(callerFrameGPR, addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::CallerFrame)));
         storePtr(TrustedImmPtr(jumpTarget), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ReturnPC)));
         storePtr(TrustedImmPtr(JSValue::encode(jsNumber(inlineCallFrame->numArgumentsIncludingThis))), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ArgumentCount)));
-        storePtr(GPRInfo::regT1, addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::Callee)));
+        storePtr(TrustedImmPtr(inlineCallFrame->callee.get()), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::Callee)));
     }
     
     if (exit.m_codeOrigin.inlineCallFrame)

Modified: trunk/Source/_javascript_Core/dfg/DFGJITCompiler32_64.cpp (98830 => 98831)


--- trunk/Source/_javascript_Core/dfg/DFGJITCompiler32_64.cpp	2011-10-30 22:42:24 UTC (rev 98830)
+++ trunk/Source/_javascript_Core/dfg/DFGJITCompiler32_64.cpp	2011-10-30 22:47:31 UTC (rev 98831)
@@ -490,8 +490,6 @@
         
         void* jumpTarget = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(baselineCodeBlockForCaller->getJITCode().start()) + mapping->m_machineCodeOffset);
 
-        loadPtr(payloadFor((VirtualRegister)inlineCallFrame->calleeVR), GPRInfo::regT4);
-        loadPtr(MacroAssembler::Address(GPRInfo::regT4, OBJECT_OFFSETOF(JSFunction, m_scopeChain)), GPRInfo::regT2);
         GPRReg callerFrameGPR;
         if (inlineCallFrame->caller.inlineCallFrame) {
             add32(Imm32(inlineCallFrame->caller.inlineCallFrame->stackOffset * sizeof(EncodedJSValue)), GPRInfo::callFrameRegister, GPRInfo::regT3);
@@ -501,14 +499,14 @@
         
         storePtr(TrustedImmPtr(baselineCodeBlock), addressFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::CodeBlock)));
         store32(Imm32(JSValue::CellTag), tagFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ScopeChain)));
-        storePtr(GPRInfo::regT2, payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ScopeChain)));
+        storePtr(TrustedImmPtr(inlineCallFrame->callee->scope()), payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ScopeChain)));
         store32(Imm32(JSValue::CellTag), tagFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::CallerFrame)));
         storePtr(callerFrameGPR, payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::CallerFrame)));
         storePtr(TrustedImmPtr(jumpTarget), payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ReturnPC)));
         store32(Imm32(JSValue::Int32Tag), tagFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ArgumentCount)));
         store32(Imm32(inlineCallFrame->numArgumentsIncludingThis), payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::ArgumentCount)));
         store32(Imm32(JSValue::CellTag), tagFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::Callee)));
-        storePtr(GPRInfo::regT4, payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::Callee)));
+        storePtr(TrustedImmPtr(inlineCallFrame->callee.get()), payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + RegisterFile::Callee)));
     }
     
     if (exit.m_codeOrigin.inlineCallFrame)

Modified: trunk/Source/_javascript_Core/interpreter/CallFrame.cpp (98830 => 98831)


--- trunk/Source/_javascript_Core/interpreter/CallFrame.cpp	2011-10-30 22:42:24 UTC (rev 98830)
+++ trunk/Source/_javascript_Core/interpreter/CallFrame.cpp	2011-10-30 22:47:31 UTC (rev 98831)
@@ -96,10 +96,7 @@
         
         CallFrame* inlinedCaller = machineCaller + inlineCallFrame->stackOffset;
         
-        JSObject* callee = machineCaller->registers()[inlineCallFrame->calleeVR].function();
-        JSCell* calleeAsFunctionCell = getJSFunction(callee);
-        ASSERT(calleeAsFunctionCell);
-        JSFunction* calleeAsFunction = asFunction(calleeAsFunctionCell);
+        JSFunction* calleeAsFunction = inlineCallFrame->callee.get();
         
         // Fill in the inlinedCaller
         inlinedCaller->setCodeBlock(machineCaller->codeBlock());
@@ -112,7 +109,7 @@
         
         inlinedCaller->setInlineCallFrame(inlineCallFrame);
         inlinedCaller->setArgumentCountIncludingThis(inlineCallFrame->numArgumentsIncludingThis);
-        inlinedCaller->setCallee(callee);
+        inlinedCaller->setCallee(calleeAsFunction);
         
         inlineCallFrame = nextInlineCallFrame;
     }
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to