Changeset 189692 in webkit
- Timestamp:
- Sep 14, 2015 1:34:21 AM (9 years ago)
- Location:
- releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/ChangeLog
r189691 r189692 1 2015-08-20 Filip Pizlo <fpizlo@apple.com> 2 3 DFG should have a KnownBooleanUse for cases where we are required to know that the child is a boolean and it's not OK to speculate 4 https://bugs.webkit.org/show_bug.cgi?id=148286 5 6 Reviewed by Benjamin Poulain. 7 8 This enables us to ensure that the Branch or LogicalNot after an effectful CompareXYZ can 9 be marked as !mayExit(). I need that for https://bugs.webkit.org/show_bug.cgi?id=145204. 10 11 * dfg/DFGFixupPhase.cpp: 12 (JSC::DFG::FixupPhase::fixupNode): 13 (JSC::DFG::FixupPhase::observeUseKindOnNode): 14 * dfg/DFGSafeToExecute.h: 15 (JSC::DFG::SafeToExecuteEdge::operator()): 16 * dfg/DFGSpeculativeJIT.cpp: 17 (JSC::DFG::SpeculativeJIT::speculate): 18 * dfg/DFGSpeculativeJIT.h: 19 (JSC::DFG::SpeculateBooleanOperand::SpeculateBooleanOperand): 20 * dfg/DFGSpeculativeJIT32_64.cpp: 21 (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): 22 (JSC::DFG::SpeculativeJIT::compileLogicalNot): 23 (JSC::DFG::SpeculativeJIT::emitBranch): 24 * dfg/DFGSpeculativeJIT64.cpp: 25 (JSC::DFG::SpeculativeJIT::fillSpeculateBoolean): 26 (JSC::DFG::SpeculativeJIT::compileLogicalNot): 27 (JSC::DFG::SpeculativeJIT::emitBranch): 28 * dfg/DFGUseKind.cpp: 29 (WTF::printInternal): 30 * dfg/DFGUseKind.h: 31 (JSC::DFG::typeFilterFor): 32 (JSC::DFG::shouldNotHaveTypeCheck): 33 * ftl/FTLCapabilities.cpp: 34 (JSC::FTL::canCompile): 35 * ftl/FTLLowerDFGToLLVM.cpp: 36 (JSC::FTL::DFG::LowerDFGToLLVM::boolify): 37 (JSC::FTL::DFG::LowerDFGToLLVM::lowBoolean): 38 1 39 2015-08-20 Filip Pizlo <fpizlo@apple.com> 2 40 -
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
r188464 r189692 357 357 358 358 case LogicalNot: { 359 if (node->child1()->shouldSpeculateBoolean()) 360 fixEdge<BooleanUse>(node->child1()); 361 else if (node->child1()->shouldSpeculateObjectOrOther()) 359 if (node->child1()->shouldSpeculateBoolean()) { 360 if (node->child1()->result() == NodeResultBoolean) { 361 // This is necessary in case we have a bytecode instruction implemented by: 362 // 363 // a: CompareEq(...) 364 // b: LogicalNot(@a) 365 // 366 // In that case, CompareEq might have a side-effect. Then, we need to make 367 // sure that we know that Branch does not exit. 368 fixEdge<KnownBooleanUse>(node->child1()); 369 } else 370 fixEdge<BooleanUse>(node->child1()); 371 } else if (node->child1()->shouldSpeculateObjectOrOther()) 362 372 fixEdge<ObjectOrOtherUse>(node->child1()); 363 373 else if (node->child1()->shouldSpeculateInt32OrBoolean()) … … 797 807 798 808 case Branch: { 799 if (node->child1()->shouldSpeculateBoolean()) 800 fixEdge<BooleanUse>(node->child1()); 801 else if (node->child1()->shouldSpeculateObjectOrOther()) 809 if (node->child1()->shouldSpeculateBoolean()) { 810 if (node->child1()->result() == NodeResultBoolean) { 811 // This is necessary in case we have a bytecode instruction implemented by: 812 // 813 // a: CompareEq(...) 814 // b: Branch(@a) 815 // 816 // In that case, CompareEq might have a side-effect. Then, we need to make 817 // sure that we know that Branch does not exit. 818 fixEdge<KnownBooleanUse>(node->child1()); 819 } else 820 fixEdge<BooleanUse>(node->child1()); 821 } else if (node->child1()->shouldSpeculateObjectOrOther()) 802 822 fixEdge<ObjectOrOtherUse>(node->child1()); 803 823 else if (node->child1()->shouldSpeculateInt32OrBoolean()) … … 1744 1764 switch (useKind) { 1745 1765 case Int32Use: 1766 case KnownInt32Use: 1746 1767 if (alwaysUnboxSimplePrimitives() 1747 1768 || isInt32Speculation(variable->prediction())) … … 1756 1777 break; 1757 1778 case BooleanUse: 1779 case KnownBooleanUse: 1758 1780 if (alwaysUnboxSimplePrimitives() 1759 1781 || isBooleanSpeculation(variable->prediction())) -
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/dfg/DFGSafeToExecute.h
r188299 r189692 73 73 case KnownInt32Use: 74 74 if (m_state.forNode(edge).m_type & ~SpecInt32) 75 m_result = false; 76 return; 77 78 case KnownBooleanUse: 79 if (m_state.forNode(edge).m_type & ~SpecBoolean) 75 80 m_result = false; 76 81 return; -
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
r188464 r189692 5865 5865 speculateBoolean(edge); 5866 5866 break; 5867 case KnownBooleanUse: 5868 ASSERT(!needsTypeCheck(edge, SpecBoolean)); 5869 break; 5867 5870 case CellUse: 5868 5871 speculateCell(edge); -
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
r188299 r189692 3227 3227 { 3228 3228 ASSERT(m_jit); 3229 ASSERT_UNUSED(mode, mode == ManualOperandSpeculation || edge.useKind() == BooleanUse );3229 ASSERT_UNUSED(mode, mode == ManualOperandSpeculation || edge.useKind() == BooleanUse || edge.useKind() == KnownBooleanUse); 3230 3230 if (jit->isFilled(node())) 3231 3231 gpr(); -
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
r188464 r189692 1056 1056 AbstractValue& value = m_state.forNode(edge); 1057 1057 SpeculatedType type = value.m_type; 1058 ASSERT(edge.useKind() != KnownBooleanUse || !(value.m_type & ~SpecBoolean)); 1058 1059 1059 1060 m_interpreter.filter(value, SpecBoolean); … … 1486 1487 { 1487 1488 switch (node->child1().useKind()) { 1488 case BooleanUse: { 1489 case BooleanUse: 1490 case KnownBooleanUse: { 1489 1491 SpeculateBooleanOperand value(this, node->child1()); 1490 1492 GPRTemporary result(this, Reuse, value); … … 1605 1607 1606 1608 switch (node->child1().useKind()) { 1607 case BooleanUse: { 1609 case BooleanUse: 1610 case KnownBooleanUse: { 1608 1611 SpeculateBooleanOperand value(this, node->child1()); 1609 1612 MacroAssembler::ResultCondition condition = MacroAssembler::NonZero; -
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
r188464 r189692 1168 1168 AbstractValue& value = m_state.forNode(edge); 1169 1169 SpeculatedType type = value.m_type; 1170 ASSERT(edge.useKind() != KnownBooleanUse || !(value.m_type & ~SpecBoolean)); 1170 1171 1171 1172 m_interpreter.filter(value, SpecBoolean); … … 1646 1647 } 1647 1648 1648 case BooleanUse: { 1649 case BooleanUse: 1650 case KnownBooleanUse: { 1649 1651 if (!needsTypeCheck(node->child1(), SpecBoolean)) { 1650 1652 SpeculateBooleanOperand value(this, node->child1()); … … 1798 1800 1799 1801 case UntypedUse: 1800 case BooleanUse: { 1802 case BooleanUse: 1803 case KnownBooleanUse: { 1801 1804 JSValueOperand value(this, node->child1(), ManualOperandSpeculation); 1802 1805 GPRReg valueGPR = value.gpr(); 1803 1806 1804 if (node->child1().useKind() == BooleanUse ) {1807 if (node->child1().useKind() == BooleanUse || node->child1().useKind() == KnownBooleanUse) { 1805 1808 if (!needsTypeCheck(node->child1(), SpecBoolean)) { 1806 1809 MacroAssembler::ResultCondition condition = MacroAssembler::NonZero; -
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/dfg/DFGUseKind.cpp
r188299 r189692 71 71 out.print("Boolean"); 72 72 return; 73 case KnownBooleanUse: 74 out.print("KnownBoolean"); 75 return; 73 76 case CellUse: 74 77 out.print("Cell"); -
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/dfg/DFGUseKind.h
r188299 r189692 49 49 RealNumberUse, 50 50 BooleanUse, 51 KnownBooleanUse, 51 52 CellUse, 52 53 KnownCellUse, … … 102 103 return SpecInt52AsDouble; 103 104 case BooleanUse: 105 case KnownBooleanUse: 104 106 return SpecBoolean; 105 107 case CellUse: … … 146 148 case KnownCellUse: 147 149 case KnownStringUse: 150 case KnownBooleanUse: 148 151 case Int52RepUse: 149 152 case DoubleRepUse: -
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/ftl/FTLCapabilities.cpp
r188464 r189692 409 409 case DoubleRepRealUse: 410 410 case BooleanUse: 411 case KnownBooleanUse: 411 412 case CellUse: 412 413 case KnownCellUse: -
releases/WebKitGTK/webkit-2.10/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp
r188464 r189692 6077 6077 switch (edge.useKind()) { 6078 6078 case BooleanUse: 6079 case KnownBooleanUse: 6079 6080 return lowBoolean(edge); 6080 6081 case Int32Use: … … 7067 7068 LValue lowBoolean(Edge edge, OperandSpeculationMode mode = AutomaticOperandSpeculation) 7068 7069 { 7069 ASSERT_UNUSED(mode, mode == ManualOperandSpeculation || edge.useKind() == BooleanUse );7070 ASSERT_UNUSED(mode, mode == ManualOperandSpeculation || edge.useKind() == BooleanUse || edge.useKind() == KnownBooleanUse); 7070 7071 7071 7072 if (edge->hasConstant()) {
Note: See TracChangeset
for help on using the changeset viewer.