Changeset 209653 in webkit for trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
- Timestamp:
- Dec 9, 2016, 11:32:38 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r209638 r209653 75 75 , m_indexInBlock(0) 76 76 , m_generationInfo(m_jit.graph().frameRegisterCount()) 77 , m_argumentGenerationInfo(CallFrameSlot::callee + GPRInfo::numberOfArgumentRegisters) 77 78 , m_state(m_jit.graph()) 78 79 , m_interpreter(m_jit.graph(), m_state) … … 408 409 for (unsigned i = 0; i < m_generationInfo.size(); ++i) 409 410 m_generationInfo[i] = GenerationInfo(); 411 for (unsigned i = 0; i < m_argumentGenerationInfo.size(); ++i) 412 m_argumentGenerationInfo[i] = GenerationInfo(); 410 413 m_gprs = RegisterBank<GPRInfo>(); 411 414 m_fprs = RegisterBank<FPRInfo>(); … … 1200 1203 } 1201 1204 1205 static void dumpRegisterInfo(GenerationInfo& info, unsigned index) 1206 { 1207 if (info.alive()) 1208 dataLogF(" % 3d:%s%s", index, dataFormatString(info.registerFormat()), dataFormatString(info.spillFormat())); 1209 else 1210 dataLogF(" % 3d:[__][__]", index); 1211 if (info.registerFormat() == DataFormatDouble) 1212 dataLogF(":fpr%d\n", info.fpr()); 1213 else if (info.registerFormat() != DataFormatNone 1214 #if USE(JSVALUE32_64) 1215 && !(info.registerFormat() & DataFormatJS) 1216 #endif 1217 ) { 1218 ASSERT(info.gpr() != InvalidGPRReg); 1219 dataLogF(":%s\n", GPRInfo::debugName(info.gpr())); 1220 } else 1221 dataLogF("\n"); 1222 } 1223 1202 1224 void SpeculativeJIT::dump(const char* label) 1203 1225 { … … 1209 1231 dataLogF(" fprs:\n"); 1210 1232 m_fprs.dump(); 1211 dataLogF(" VirtualRegisters:\n"); 1212 for (unsigned i = 0; i < m_generationInfo.size(); ++i) { 1213 GenerationInfo& info = m_generationInfo[i]; 1214 if (info.alive()) 1215 dataLogF(" % 3d:%s%s", i, dataFormatString(info.registerFormat()), dataFormatString(info.spillFormat())); 1216 else 1217 dataLogF(" % 3d:[__][__]", i); 1218 if (info.registerFormat() == DataFormatDouble) 1219 dataLogF(":fpr%d\n", info.fpr()); 1220 else if (info.registerFormat() != DataFormatNone 1221 #if USE(JSVALUE32_64) 1222 && !(info.registerFormat() & DataFormatJS) 1223 #endif 1224 ) { 1225 ASSERT(info.gpr() != InvalidGPRReg); 1226 dataLogF(":%s\n", GPRInfo::debugName(info.gpr())); 1227 } else 1228 dataLogF("\n"); 1229 } 1233 1234 dataLogF(" Argument VirtualRegisters:\n"); 1235 for (unsigned i = 0; i < m_argumentGenerationInfo.size(); ++i) 1236 dumpRegisterInfo(m_argumentGenerationInfo[i], i); 1237 1238 dataLogF(" Local VirtualRegisters:\n"); 1239 for (unsigned i = 0; i < m_generationInfo.size(); ++i) 1240 dumpRegisterInfo(m_generationInfo[i], i); 1241 1230 1242 if (label) 1231 1243 dataLogF("</%s>\n", label); … … 1678 1690 m_jit.blockHeads()[m_block->index] = m_jit.label(); 1679 1691 1692 if (!m_block->index) 1693 checkArgumentTypes(); 1694 1680 1695 if (!m_block->intersectionOfCFAHasVisited) { 1681 1696 // Don't generate code for basic blocks that are unreachable according to CFA. … … 1688 1703 m_stream->appendAndLog(VariableEvent::reset()); 1689 1704 1705 if (!m_block->index) 1706 setupArgumentRegistersForEntry(); 1707 1690 1708 m_jit.jitAssertHasValidCallFrame(); 1691 1709 m_jit.jitAssertTagsInPlace(); … … 1697 1715 for (size_t i = m_block->variablesAtHead.size(); i--;) { 1698 1716 int operand = m_block->variablesAtHead.operandForIndex(i); 1717 if (!m_block->index && operandIsArgument(operand)) { 1718 unsigned argument = m_block->variablesAtHead.argumentForIndex(i); 1719 Node* argumentNode = m_jit.graph().m_argumentsForChecking[argument]; 1720 1721 if (argumentNode && argumentNode->op() == GetArgumentRegister) { 1722 if (!argumentNode->refCount()) 1723 continue; // No need to record dead GetArgumentRegisters's. 1724 m_stream->appendAndLog( 1725 VariableEvent::movHint( 1726 MinifiedID(argumentNode), 1727 argumentNode->local())); 1728 continue; 1729 } 1730 } 1731 1699 1732 Node* node = m_block->variablesAtHead[i]; 1700 1733 if (!node) … … 1783 1816 1784 1817 for (int i = 0; i < m_jit.codeBlock()->numParameters(); ++i) { 1785 Node* node = m_jit.graph().m_arguments [i];1818 Node* node = m_jit.graph().m_argumentsForChecking[i]; 1786 1819 if (!node) { 1787 1820 // The argument is dead. We don't do any checks for such arguments. … … 1789 1822 } 1790 1823 1791 ASSERT(node->op() == SetArgument); 1824 ASSERT(node->op() == SetArgument 1825 || (node->op() == SetLocal && node->child1()->op() == GetArgumentRegister) 1826 || node->op() == GetArgumentRegister); 1792 1827 ASSERT(node->shouldGenerate()); 1793 1828 … … 1800 1835 VirtualRegister virtualRegister = variableAccessData->local(); 1801 1836 1802 JSValueSource valueSource = JSValueSource(JITCompiler::addressFor(virtualRegister)); 1803 1837 JSValueSource valueSource; 1838 1839 #if USE(JSVALUE64) 1840 GPRReg argumentRegister = InvalidGPRReg; 1841 1842 #if NUMBER_OF_JS_FUNCTION_ARGUMENT_REGISTERS 1843 if (static_cast<unsigned>(i) < NUMBER_OF_JS_FUNCTION_ARGUMENT_REGISTERS) { 1844 argumentRegister = argumentRegisterForFunctionArgument(i); 1845 valueSource = JSValueSource(argumentRegister); 1846 } else 1847 #endif 1848 #endif 1849 valueSource = JSValueSource(JITCompiler::addressFor(virtualRegister)); 1850 1804 1851 #if USE(JSVALUE64) 1805 1852 switch (format) { 1806 1853 case FlushedInt32: { 1807 speculationCheck(BadType, valueSource, node, m_jit.branch64(MacroAssembler::Below, JITCompiler::addressFor(virtualRegister), GPRInfo::tagTypeNumberRegister)); 1854 if (argumentRegister != InvalidGPRReg) 1855 speculationCheck(BadType, valueSource, node, m_jit.branch64(MacroAssembler::Below, argumentRegister, GPRInfo::tagTypeNumberRegister)); 1856 else 1857 speculationCheck(BadType, valueSource, node, m_jit.branch64(MacroAssembler::Below, JITCompiler::addressFor(virtualRegister), GPRInfo::tagTypeNumberRegister)); 1808 1858 break; 1809 1859 } 1810 1860 case FlushedBoolean: { 1811 1861 GPRTemporary temp(this); 1812 m_jit.load64(JITCompiler::addressFor(virtualRegister), temp.gpr()); 1862 if (argumentRegister != InvalidGPRReg) 1863 m_jit.move(argumentRegister, temp.gpr()); 1864 else 1865 m_jit.load64(JITCompiler::addressFor(virtualRegister), temp.gpr()); 1813 1866 m_jit.xor64(TrustedImm32(static_cast<int32_t>(ValueFalse)), temp.gpr()); 1814 1867 speculationCheck(BadType, valueSource, node, m_jit.branchTest64(MacroAssembler::NonZero, temp.gpr(), TrustedImm32(static_cast<int32_t>(~1)))); … … 1816 1869 } 1817 1870 case FlushedCell: { 1818 speculationCheck(BadType, valueSource, node, m_jit.branchTest64(MacroAssembler::NonZero, JITCompiler::addressFor(virtualRegister), GPRInfo::tagMaskRegister)); 1871 if (argumentRegister != InvalidGPRReg) 1872 speculationCheck(BadType, valueSource, node, m_jit.branchTest64(MacroAssembler::NonZero, argumentRegister, GPRInfo::tagMaskRegister)); 1873 else 1874 speculationCheck(BadType, valueSource, node, m_jit.branchTest64(MacroAssembler::NonZero, JITCompiler::addressFor(virtualRegister), GPRInfo::tagMaskRegister)); 1819 1875 break; 1820 1876 } … … 1847 1903 } 1848 1904 1905 void SpeculativeJIT::setupArgumentRegistersForEntry() 1906 { 1907 #if NUMBER_OF_JS_FUNCTION_ARGUMENT_REGISTERS 1908 BasicBlock* firstBlock = m_jit.graph().block(0); 1909 1910 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=165720 1911 // We should scan m_arguemntsForChecking instead of looking for GetArgumentRegister 1912 // nodes in the root block. 1913 for (size_t indexInBlock = 0; indexInBlock < firstBlock->size(); ++indexInBlock) { 1914 Node* node = firstBlock->at(indexInBlock); 1915 1916 if (node->op() == GetArgumentRegister) { 1917 VirtualRegister virtualRegister = node->virtualRegister(); 1918 GenerationInfo& info = generationInfoFromVirtualRegister(virtualRegister); 1919 GPRReg argumentReg = GPRInfo::toArgumentRegister(node->argumentRegisterIndex()); 1920 1921 ASSERT(argumentReg != InvalidGPRReg); 1922 1923 ASSERT(!m_gprs.isLocked(argumentReg)); 1924 m_gprs.allocateSpecific(argumentReg); 1925 m_gprs.retain(argumentReg, virtualRegister, SpillOrderJS); 1926 info.initArgumentRegisterValue(node, node->refCount(), argumentReg, DataFormatJS); 1927 info.noticeOSRBirth(*m_stream, node, virtualRegister); 1928 // Don't leave argument registers locked. 1929 m_gprs.unlock(argumentReg); 1930 } 1931 } 1932 #endif 1933 } 1934 1849 1935 bool SpeculativeJIT::compile() 1850 1936 { 1851 checkArgumentTypes();1852 1853 1937 ASSERT(!m_currentNode); 1854 1938 for (BlockIndex blockIndex = 0; blockIndex < m_jit.graph().numBlocks(); ++blockIndex) {
Note:
See TracChangeset
for help on using the changeset viewer.