Changeset 242954 in webkit
- Timestamp:
- Mar 14, 2019 12:27:28 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r242945 r242954 1 2019-03-14 Saam barati <sbarati@apple.com> 2 3 Fixup uses KnownInt32 incorrectly in some nodes 4 https://bugs.webkit.org/show_bug.cgi?id=195279 5 <rdar://problem/47915654> 6 7 Reviewed by Yusuke Suzuki. 8 9 * stress/known-int32-cant-be-used-across-bytecode-boundary.js: Added. 10 (foo): 11 1 12 2019-03-14 Keith Miller <keith_miller@apple.com> 2 13 -
trunk/Source/JavaScriptCore/ChangeLog
r242945 r242954 1 2019-03-14 Saam barati <sbarati@apple.com> 2 3 Fixup uses KnownInt32 incorrectly in some nodes 4 https://bugs.webkit.org/show_bug.cgi?id=195279 5 <rdar://problem/47915654> 6 7 Reviewed by Yusuke Suzuki. 8 9 Fixup was sometimes using KnownInt32 edges when it knew some 10 incoming value is an Int32 based on what the bytecode would return. 11 However, because bytecode may result in Int32 for some node does 12 not mean we'll pick Int32 as the value format for that local. For example, 13 we may choose for a value to be represented as a double. This patch 14 corrects such uses of KnownInt32. 15 16 * dfg/DFGArgumentsEliminationPhase.cpp: 17 * dfg/DFGFixupPhase.cpp: 18 (JSC::DFG::FixupPhase::fixupNode): 19 * dfg/DFGSpeculativeJIT.cpp: 20 (JSC::DFG::SpeculativeJIT::compileArrayPush): 21 (JSC::DFG::SpeculativeJIT::compileGetDirectPname): 22 * ftl/FTLLowerDFGToB3.cpp: 23 (JSC::FTL::DFG::LowerDFGToB3::compileArrayPush): 24 1 25 2019-03-14 Keith Miller <keith_miller@apple.com> 2 26 -
trunk/Source/JavaScriptCore/dfg/DFGArgumentsEliminationPhase.cpp
r241228 r242954 1 1 /* 2 * Copyright (C) 2015-201 8Apple Inc. All rights reserved.2 * Copyright (C) 2015-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 662 662 break; 663 663 664 ASSERT(node->origin.exitOK); 665 ASSERT(node->child1().useKind() == Int32Use); 666 insertionSet.insertNode( 667 nodeIndex, SpecNone, Check, node->origin, 668 node->child1()); 669 664 670 node->setOpAndDefaultFlags(PhantomCreateRest); 665 671 // We don't need this parameter for OSR exit, we can find out all the information -
trunk/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
r242715 r242954 1 1 /* 2 * Copyright (C) 2012-201 8Apple Inc. All rights reserved.2 * Copyright (C) 2012-2019 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 1150 1150 switch (node->arrayMode().type()) { 1151 1151 case Array::Int32: 1152 insertCheck<Int32Use>(element.node()); 1153 fixEdge<KnownInt32Use>(element); 1152 fixEdge<Int32Use>(element); 1154 1153 break; 1155 1154 case Array::Double: 1156 insertCheck<DoubleRepRealUse>(element.node()); 1157 fixEdge<DoubleRepUse>(element); 1155 fixEdge<DoubleRepRealUse>(element); 1158 1156 break; 1159 1157 case Array::Contiguous: … … 1164 1162 break; 1165 1163 } 1166 ASSERT(shouldNotHaveTypeCheck(element.useKind()));1167 1164 } 1168 1165 break; … … 1869 1866 blessArrayOperation(m_graph.varArgChild(node, 0), m_graph.varArgChild(node, 1), m_graph.varArgChild(node, 2)); 1870 1867 fixEdge<CellUse>(m_graph.varArgChild(node, 0)); 1871 fixEdge< KnownInt32Use>(m_graph.varArgChild(node, 1));1868 fixEdge<Int32Use>(m_graph.varArgChild(node, 1)); 1872 1869 break; 1873 1870 } … … 1879 1876 fixEdge<CellUse>(base); 1880 1877 fixEdge<KnownCellUse>(property); 1881 fixEdge< KnownInt32Use>(index);1878 fixEdge<Int32Use>(index); 1882 1879 fixEdge<KnownCellUse>(enumerator); 1883 1880 break; … … 1890 1887 case GetEnumeratorStructurePname: { 1891 1888 fixEdge<KnownCellUse>(node->child1()); 1892 fixEdge< KnownInt32Use>(node->child2());1889 fixEdge<Int32Use>(node->child2()); 1893 1890 break; 1894 1891 } 1895 1892 case GetEnumeratorGenericPname: { 1896 1893 fixEdge<KnownCellUse>(node->child1()); 1897 fixEdge< KnownInt32Use>(node->child2());1894 fixEdge<Int32Use>(node->child2()); 1898 1895 break; 1899 1896 } 1900 1897 case ToIndexString: { 1901 fixEdge< KnownInt32Use>(node->child1());1898 fixEdge<Int32Use>(node->child1()); 1902 1899 break; 1903 1900 } … … 1991 1988 case CreateRest: { 1992 1989 watchHavingABadTime(node); 1993 fixEdge< KnownInt32Use>(node->child1());1990 fixEdge<Int32Use>(node->child1()); 1994 1991 break; 1995 1992 } … … 2155 2152 fixEdge<UntypedUse>(propertyEdge); 2156 2153 fixEdge<UntypedUse>(m_graph.varArgChild(node, 2)); 2157 fixEdge< KnownInt32Use>(m_graph.varArgChild(node, 3));2154 fixEdge<Int32Use>(m_graph.varArgChild(node, 3)); 2158 2155 break; 2159 2156 } … … 2205 2202 fixEdge<CellUse>(m_graph.varArgChild(node, 2)); 2206 2203 fixEdge<CellUse>(m_graph.varArgChild(node, 3)); 2207 fixEdge< KnownInt32Use>(m_graph.varArgChild(node, 4));2204 fixEdge<Int32Use>(m_graph.varArgChild(node, 4)); 2208 2205 break; 2209 2206 } -
trunk/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r242812 r242954 8571 8571 if (elementCount == 1) { 8572 8572 Edge& element = m_jit.graph().varArgChild(node, elementOffset); 8573 if (node->arrayMode().type() == Array::Int32) { 8574 ASSERT(element.useKind() == Int32Use); 8575 speculateInt32(element); 8576 } 8573 8577 JSValueOperand value(this, element, ManualOperandSpeculation); 8574 8578 JSValueRegs valueRegs = value.jsValueRegs(); 8575 8576 if (node->arrayMode().type() == Array::Int32)8577 DFG_ASSERT(m_jit.graph(), node, !needsTypeCheck(element, SpecInt32Only));8578 8579 8579 8580 m_jit.load32(MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()), storageLengthGPR); … … 8591 8592 } 8592 8593 8594 if (node->arrayMode().type() == Array::Int32) { 8595 for (unsigned elementIndex = 0; elementIndex < elementCount; ++elementIndex) { 8596 Edge element = m_jit.graph().varArgChild(node, elementIndex + elementOffset); 8597 ASSERT(element.useKind() == Int32Use); 8598 speculateInt32(element); 8599 } 8600 } 8601 8593 8602 GPRTemporary buffer(this); 8594 8603 GPRReg bufferGPR = buffer.gpr(); … … 8616 8625 for (unsigned elementIndex = 0; elementIndex < elementCount; ++elementIndex) { 8617 8626 Edge& element = m_jit.graph().varArgChild(node, elementIndex + elementOffset); 8618 JSValueOperand value(this, element, ManualOperandSpeculation); 8627 JSValueOperand value(this, element, ManualOperandSpeculation); // We did type checks above. 8619 8628 JSValueRegs valueRegs = value.jsValueRegs(); 8620 8621 if (node->arrayMode().type() == Array::Int32)8622 DFG_ASSERT(m_jit.graph(), node, !needsTypeCheck(element, SpecInt32Only));8623 8629 8624 8630 m_jit.storeValue(valueRegs, MacroAssembler::Address(bufferGPR, sizeof(EncodedJSValue) * elementIndex)); … … 8644 8650 if (elementCount == 1) { 8645 8651 Edge& element = m_jit.graph().varArgChild(node, elementOffset); 8652 speculate(node, element); 8646 8653 SpeculateDoubleOperand value(this, element); 8647 8654 FPRReg valueFPR = value.fpr(); 8648 8649 DFG_ASSERT(m_jit.graph(), node, !needsTypeCheck(element, SpecDoubleReal));8650 8655 8651 8656 m_jit.load32(MacroAssembler::Address(storageGPR, Butterfly::offsetOfPublicLength()), storageLengthGPR); … … 8663 8668 } 8664 8669 8670 for (unsigned elementIndex = 0; elementIndex < elementCount; ++elementIndex) { 8671 Edge element = m_jit.graph().varArgChild(node, elementIndex + elementOffset); 8672 ASSERT(element.useKind() == DoubleRepRealUse); 8673 speculate(node, element); 8674 } 8675 8665 8676 GPRTemporary buffer(this); 8666 8677 GPRReg bufferGPR = buffer.gpr(); … … 8690 8701 SpeculateDoubleOperand value(this, element); 8691 8702 FPRReg valueFPR = value.fpr(); 8692 8693 DFG_ASSERT(m_jit.graph(), node, !needsTypeCheck(element, SpecDoubleReal));8694 8703 8695 8704 m_jit.storeDouble(valueFPR, MacroAssembler::Address(bufferGPR, sizeof(double) * elementIndex)); … … 13087 13096 Edge& baseEdge = m_jit.graph().varArgChild(node, 0); 13088 13097 Edge& propertyEdge = m_jit.graph().varArgChild(node, 1); 13098 Edge& indexEdge = m_jit.graph().varArgChild(node, 2); 13089 13099 13090 13100 SpeculateCellOperand base(this, baseEdge); … … 13095 13105 #if CPU(X86) 13096 13106 // Not enough registers on X86 for this code, so always use the slow path. 13107 speculate(node, indexEdge); 13097 13108 flushRegisters(); 13098 13109 JSValueRegsFlushedCallResult result(this); … … 13102 13113 jsValueResult(resultRegs, node); 13103 13114 #else 13104 Edge& indexEdge = m_jit.graph().varArgChild(node, 2);13105 13115 Edge& enumeratorEdge = m_jit.graph().varArgChild(node, 3); 13106 13116 SpeculateStrictInt32Operand index(this, indexEdge); -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
r242715 r242954 4675 4675 4676 4676 Edge& element = m_graph.varArgChild(m_node, elementOffset); 4677 speculate(element); 4677 4678 if (m_node->arrayMode().type() != Array::Double) { 4678 4679 value = lowJSValue(element, ManualOperandSpeculation); 4679 if (m_node->arrayMode().type() == Array::Int32)4680 DFG_ASSERT(m_graph, m_node, !m_interpreter.needsTypeCheck(element, SpecInt32Only));4681 4680 storeType = Output::Store64; 4682 4681 } else { 4683 4682 value = lowDouble(element); 4684 DFG_ASSERT(m_graph, m_node, !m_interpreter.needsTypeCheck(element, SpecDoubleReal));4685 4683 storeType = Output::StoreDouble; 4686 4684 } … … 4721 4719 } 4722 4720 4721 for (unsigned elementIndex = 0; elementIndex < elementCount; ++elementIndex) { 4722 Edge element = m_graph.varArgChild(m_node, elementIndex + elementOffset); 4723 speculate(element); 4724 } 4725 4723 4726 LValue prevLength = m_out.load32(storage, m_heaps.Butterfly_publicLength); 4724 4727 LValue newLength = m_out.add(prevLength, m_out.constInt32(elementCount)); … … 4757 4760 if (m_node->arrayMode().type() != Array::Double) { 4758 4761 value = lowJSValue(element, ManualOperandSpeculation); 4759 if (m_node->arrayMode().type() == Array::Int32)4760 DFG_ASSERT(m_graph, m_node, !m_interpreter.needsTypeCheck(element, SpecInt32Only));4761 4762 storeType = Output::Store64; 4762 4763 } else { 4763 4764 value = lowDouble(element); 4764 DFG_ASSERT(m_graph, m_node, !m_interpreter.needsTypeCheck(element, SpecDoubleReal));4765 4765 storeType = Output::StoreDouble; 4766 4766 }
Note: See TracChangeset
for help on using the changeset viewer.