Changeset 194372 in webkit
- Timestamp:
- Dec 22, 2015, 1:59:59 PM (11 years ago)
- Location:
- trunk/Source
- Files:
-
- 1 added
- 17 edited
-
JavaScriptCore/ChangeLog (modified) (1 diff)
-
JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (modified) (4 diffs)
-
JavaScriptCore/b3/B3BasicBlock.cpp (modified) (2 diffs)
-
JavaScriptCore/b3/B3BasicBlock.h (modified) (4 diffs)
-
JavaScriptCore/b3/B3LowerToAir.cpp (modified) (2 diffs)
-
JavaScriptCore/b3/B3Origin.h (modified) (1 diff)
-
JavaScriptCore/b3/B3OriginDump.h (added)
-
JavaScriptCore/b3/B3Procedure.cpp (modified) (2 diffs)
-
JavaScriptCore/b3/B3Procedure.h (modified) (3 diffs)
-
JavaScriptCore/b3/B3Value.cpp (modified) (3 diffs)
-
JavaScriptCore/b3/B3Value.h (modified) (4 diffs)
-
JavaScriptCore/ftl/FTLB3Output.cpp (modified) (1 diff)
-
JavaScriptCore/ftl/FTLB3Output.h (modified) (4 diffs)
-
JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp (modified) (7 diffs)
-
JavaScriptCore/ftl/FTLOutput.h (modified) (1 diff)
-
JavaScriptCore/ftl/FTLState.cpp (modified) (1 diff)
-
WTF/ChangeLog (modified) (1 diff)
-
WTF/wtf/SharedTask.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r194369 r194372 1 2015-12-22 Filip Pizlo <fpizlo@apple.com> 2 3 FTL B3 does not logicalNot correctly 4 https://bugs.webkit.org/show_bug.cgi?id=152512 5 6 Reviewed by Saam Barati. 7 8 I'm working on a bug where V8/richards does not run correctly. I noticed that the codegen was 9 doing a log of Not32's followed by branches, which smelled like badness. To debug this, I 10 needed B3's origins to dump as something other than a hexed pointer to a node. The node index 11 would be better. So, I added the notion of an origin printer to Procedure. 12 13 The bug was easy enough to fix. This introduces Output::logicalNot(). In LLVM, it's the same 14 as bitNot(). In B3, it's compiled to Equal(value, 0). We could have also compiled it to 15 BitXor(value, 1), except that B3 will strength-reduce to that anyway whenever it's safe. It's 16 sort of nice that right now, you could use logicalNot() on non-bool values and get C-like 17 behavior. 18 19 Richards still doesn't run, though. There are more bugs! 20 21 * JavaScriptCore.xcodeproj/project.pbxproj: 22 * b3/B3BasicBlock.cpp: 23 (JSC::B3::BasicBlock::dump): 24 (JSC::B3::BasicBlock::deepDump): 25 * b3/B3BasicBlock.h: 26 (JSC::B3::BasicBlock::frequency): 27 (JSC::B3::DeepBasicBlockDump::DeepBasicBlockDump): 28 (JSC::B3::DeepBasicBlockDump::dump): 29 (JSC::B3::deepDump): 30 * b3/B3LowerToAir.cpp: 31 (JSC::B3::Air::LowerToAir::run): 32 (JSC::B3::Air::LowerToAir::lower): 33 * b3/B3Origin.h: 34 (JSC::B3::Origin::data): 35 * b3/B3OriginDump.h: Added. 36 (JSC::B3::OriginDump::OriginDump): 37 (JSC::B3::OriginDump::dump): 38 * b3/B3Procedure.cpp: 39 (JSC::B3::Procedure::~Procedure): 40 (JSC::B3::Procedure::printOrigin): 41 (JSC::B3::Procedure::addBlock): 42 (JSC::B3::Procedure::dump): 43 * b3/B3Procedure.h: 44 (JSC::B3::Procedure::setOriginPrinter): 45 * b3/B3Value.cpp: 46 (JSC::B3::Value::dumpChildren): 47 (JSC::B3::Value::deepDump): 48 * b3/B3Value.h: 49 (JSC::B3::DeepValueDump::DeepValueDump): 50 (JSC::B3::DeepValueDump::dump): 51 (JSC::B3::deepDump): 52 * ftl/FTLB3Output.cpp: 53 (JSC::FTL::Output::lockedStackSlot): 54 (JSC::FTL::Output::bitNot): 55 (JSC::FTL::Output::logicalNot): 56 (JSC::FTL::Output::load): 57 * ftl/FTLB3Output.h: 58 (JSC::FTL::Output::aShr): 59 (JSC::FTL::Output::lShr): 60 (JSC::FTL::Output::ctlz32): 61 (JSC::FTL::Output::addWithOverflow32): 62 (JSC::FTL::Output::lessThanOrEqual): 63 (JSC::FTL::Output::doubleEqual): 64 (JSC::FTL::Output::doubleEqualOrUnordered): 65 (JSC::FTL::Output::doubleNotEqualOrUnordered): 66 (JSC::FTL::Output::doubleLessThan): 67 (JSC::FTL::Output::doubleLessThanOrEqual): 68 (JSC::FTL::Output::doubleGreaterThan): 69 (JSC::FTL::Output::doubleGreaterThanOrEqual): 70 (JSC::FTL::Output::doubleNotEqualAndOrdered): 71 (JSC::FTL::Output::doubleLessThanOrUnordered): 72 (JSC::FTL::Output::doubleLessThanOrEqualOrUnordered): 73 (JSC::FTL::Output::doubleGreaterThanOrUnordered): 74 (JSC::FTL::Output::doubleGreaterThanOrEqualOrUnordered): 75 (JSC::FTL::Output::isZero32): 76 (JSC::FTL::Output::notZero32): 77 (JSC::FTL::Output::addIncomingToPhi): 78 (JSC::FTL::Output::bitCast): 79 (JSC::FTL::Output::bitNot): Deleted. 80 * ftl/FTLLowerDFGToLLVM.cpp: 81 (JSC::FTL::DFG::LowerDFGToLLVM::compileCheckArray): 82 (JSC::FTL::DFG::LowerDFGToLLVM::compileGetTypedArrayByteOffset): 83 (JSC::FTL::DFG::LowerDFGToLLVM::compileLogicalNot): 84 (JSC::FTL::DFG::LowerDFGToLLVM::compileCallOrConstruct): 85 (JSC::FTL::DFG::LowerDFGToLLVM::compileInstanceOfCustom): 86 (JSC::FTL::DFG::LowerDFGToLLVM::compileCountExecution): 87 (JSC::FTL::DFG::LowerDFGToLLVM::boolify): 88 (JSC::FTL::DFG::LowerDFGToLLVM::isMisc): 89 (JSC::FTL::DFG::LowerDFGToLLVM::isNotBoolean): 90 (JSC::FTL::DFG::LowerDFGToLLVM::isBoolean): 91 (JSC::FTL::DFG::LowerDFGToLLVM::unboxBoolean): 92 (JSC::FTL::DFG::LowerDFGToLLVM::isNotType): 93 (JSC::FTL::DFG::LowerDFGToLLVM::speculateObject): 94 * ftl/FTLOutput.h: 95 (JSC::FTL::Output::aShr): 96 (JSC::FTL::Output::lShr): 97 (JSC::FTL::Output::bitNot): 98 (JSC::FTL::Output::logicalNot): 99 (JSC::FTL::Output::insertElement): 100 * ftl/FTLState.cpp: 101 (JSC::FTL::State::State): 102 1 103 2015-12-22 Keith Miller <keith_miller@apple.com> 2 104 -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r194363 r194372 374 374 0F493AFA16D0CAD30084508B /* SourceProvider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F493AF816D0CAD10084508B /* SourceProvider.cpp */; }; 375 375 0F4B94DC17B9F07500DD03A4 /* TypedArrayInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4B94DB17B9F07500DD03A4 /* TypedArrayInlines.h */; settings = {ATTRIBUTES = (Private, ); }; }; 376 0F4C91661C29F4F2004341A6 /* B3OriginDump.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4C91651C29F4F2004341A6 /* B3OriginDump.h */; }; 376 377 0F4F29DF18B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0F4F29DD18B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.cpp */; }; 377 378 0F4F29E018B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F4F29DE18B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.h */; }; … … 2507 2508 0F493AF816D0CAD10084508B /* SourceProvider.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SourceProvider.cpp; sourceTree = "<group>"; }; 2508 2509 0F4B94DB17B9F07500DD03A4 /* TypedArrayInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TypedArrayInlines.h; sourceTree = "<group>"; }; 2510 0F4C91651C29F4F2004341A6 /* B3OriginDump.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = B3OriginDump.h; path = b3/B3OriginDump.h; sourceTree = "<group>"; }; 2509 2511 0F4F29DD18B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DFGStaticExecutionCountEstimationPhase.cpp; path = dfg/DFGStaticExecutionCountEstimationPhase.cpp; sourceTree = "<group>"; }; 2510 2512 0F4F29DE18B6AD1C0057BC15 /* DFGStaticExecutionCountEstimationPhase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DFGStaticExecutionCountEstimationPhase.h; path = dfg/DFGStaticExecutionCountEstimationPhase.h; sourceTree = "<group>"; }; … … 4702 4704 0FEC84D91BDACDAC0080FF74 /* B3Origin.cpp */, 4703 4705 0FEC84DA1BDACDAC0080FF74 /* B3Origin.h */, 4706 0F4C91651C29F4F2004341A6 /* B3OriginDump.h */, 4704 4707 0FEC84DB1BDACDAC0080FF74 /* B3PatchpointSpecial.cpp */, 4705 4708 0FEC84DC1BDACDAC0080FF74 /* B3PatchpointSpecial.h */, … … 6987 6990 7094C4DF1AE439530041A2EE /* BytecodeIntrinsicRegistry.h in Headers */, 6988 6991 0F2DD80B1AB3D85800BBB8E8 /* BytecodeKills.h in Headers */, 6992 0F4C91661C29F4F2004341A6 /* B3OriginDump.h in Headers */, 6989 6993 C2FCAE1317A9C24E0034C735 /* BytecodeLivenessAnalysis.h in Headers */, 6990 6994 0F666EC0183566F900D017F1 /* BytecodeLivenessAnalysisInlines.h in Headers */, -
trunk/Source/JavaScriptCore/b3/B3BasicBlock.cpp
r192346 r194372 109 109 } 110 110 111 void BasicBlock::deepDump( PrintStream& out) const111 void BasicBlock::deepDump(const Procedure& proc, PrintStream& out) const 112 112 { 113 113 out.print("BB", *this, ": ; frequency = ", m_frequency, "\n"); … … 115 115 out.print(" Predecessors: ", pointerListDump(predecessors()), "\n"); 116 116 for (Value* value : *this) 117 out.print(" ", B3::deepDump( value), "\n");117 out.print(" ", B3::deepDump(proc, value), "\n"); 118 118 } 119 119 -
trunk/Source/JavaScriptCore/b3/B3BasicBlock.h
r192346 r194372 115 115 116 116 void dump(PrintStream&) const; 117 void deepDump( PrintStream&) const;117 void deepDump(const Procedure&, PrintStream&) const; 118 118 119 119 private: … … 133 133 class DeepBasicBlockDump { 134 134 public: 135 DeepBasicBlockDump(const BasicBlock* block) 136 : m_block(block) 135 DeepBasicBlockDump(const Procedure& proc, const BasicBlock* block) 136 : m_proc(proc) 137 , m_block(block) 137 138 { 138 139 } … … 141 142 { 142 143 if (m_block) 143 m_block->deepDump( out);144 m_block->deepDump(m_proc, out); 144 145 else 145 146 out.print("<null>"); … … 147 148 148 149 private: 150 const Procedure& m_proc; 149 151 const BasicBlock* m_block; 150 152 }; 151 153 152 inline DeepBasicBlockDump deepDump(const BasicBlock* block)154 inline DeepBasicBlockDump deepDump(const Procedure& proc, const BasicBlock* block) 153 155 { 154 return DeepBasicBlockDump( block);156 return DeepBasicBlockDump(proc, block); 155 157 } 156 158 -
trunk/Source/JavaScriptCore/b3/B3LowerToAir.cpp
r194354 r194372 103 103 m_insts.append(Vector<Inst>()); 104 104 if (verbose) 105 dataLog("Lowering ", deepDump(m_ value), ":\n");105 dataLog("Lowering ", deepDump(m_procedure, m_value), ":\n"); 106 106 lower(); 107 107 if (verbose) { … … 2148 2148 } 2149 2149 2150 dataLog("FATAL: could not lower ", deepDump(m_ value), "\n");2150 dataLog("FATAL: could not lower ", deepDump(m_procedure, m_value), "\n"); 2151 2151 RELEASE_ASSERT_NOT_REACHED(); 2152 2152 } -
trunk/Source/JavaScriptCore/b3/B3Origin.h
r191705 r194372 48 48 const void* data() const { return m_data; } 49 49 50 // You should avoid using this. Use OriginDump instead. 50 51 void dump(PrintStream&) const; 51 52 -
trunk/Source/JavaScriptCore/b3/B3Procedure.cpp
r193683 r194372 53 53 } 54 54 55 void Procedure::printOrigin(PrintStream& out, Origin origin) const 56 { 57 if (m_originPrinter) 58 m_originPrinter->run(out, origin); 59 else 60 out.print(origin); 61 } 62 55 63 BasicBlock* Procedure::addBlock(double frequency) 56 64 { … … 127 135 { 128 136 for (BasicBlock* block : *this) 129 out.print(deepDump( block));137 out.print(deepDump(*this, block)); 130 138 if (m_byproducts->count()) 131 139 out.print(*m_byproducts); -
trunk/Source/JavaScriptCore/b3/B3Procedure.h
r193682 r194372 40 40 #include <wtf/Noncopyable.h> 41 41 #include <wtf/PrintStream.h> 42 #include <wtf/SharedTask.h> 42 43 #include <wtf/TriState.h> 43 44 #include <wtf/Vector.h> … … 60 61 JS_EXPORT_PRIVATE Procedure(); 61 62 JS_EXPORT_PRIVATE ~Procedure(); 63 64 template<typename Callback> 65 void setOriginPrinter(Callback&& callback) 66 { 67 m_originPrinter = createSharedTask<void(PrintStream&, Origin)>( 68 std::forward<Callback>(callback)); 69 } 70 71 // Usually you use this via OriginDump, though it's cool to use it directly. 72 void printOrigin(PrintStream& out, Origin origin) const; 62 73 63 74 JS_EXPORT_PRIVATE BasicBlock* addBlock(double frequency = 1); … … 262 273 std::unique_ptr<OpaqueByproducts> m_byproducts; 263 274 std::unique_ptr<Air::Code> m_code; 275 RefPtr<SharedTask<void(PrintStream&, Origin)>> m_originPrinter; 264 276 }; 265 277 -
trunk/Source/JavaScriptCore/b3/B3Value.cpp
r194341 r194372 33 33 #include "B3ControlValue.h" 34 34 #include "B3MemoryValue.h" 35 #include "B3OriginDump.h" 35 36 #include "B3ProcedureInlines.h" 36 37 #include "B3StackSlotValue.h" … … 100 101 } 101 102 102 void Value::deepDump( PrintStream& out) const103 void Value::deepDump(const Procedure& proc, PrintStream& out) const 103 104 { 104 105 out.print(m_type, " ", *this, " = ", m_opcode); … … 109 110 110 111 if (m_origin) 111 out.print(comma, m_origin);112 out.print(comma, OriginDump(proc, m_origin)); 112 113 113 114 dumpMeta(comma, out); -
trunk/Source/JavaScriptCore/b3/B3Value.h
r194331 r194372 86 86 87 87 void dump(PrintStream&) const; 88 void deepDump( PrintStream&) const;88 void deepDump(const Procedure&, PrintStream&) const; 89 89 90 90 // This is how you cast Values. For example, if you want to do something provided that we have a … … 315 315 class DeepValueDump { 316 316 public: 317 DeepValueDump(const Value* value) 318 : m_value(value) 317 DeepValueDump(const Procedure& proc, const Value* value) 318 : m_proc(proc) 319 , m_value(value) 319 320 { 320 321 } … … 323 324 { 324 325 if (m_value) 325 m_value->deepDump( out);326 m_value->deepDump(m_proc, out); 326 327 else 327 328 out.print("<null>"); … … 329 330 330 331 private: 332 const Procedure& m_proc; 331 333 const Value* m_value; 332 334 }; 333 335 334 inline DeepValueDump deepDump(const Value* value)336 inline DeepValueDump deepDump(const Procedure& proc, const Value* value) 335 337 { 336 return DeepValueDump( value);338 return DeepValueDump(proc, value); 337 339 } 338 340 -
trunk/Source/JavaScriptCore/ftl/FTLB3Output.cpp
r194341 r194372 68 68 } 69 69 70 LValue Output::bitNot(LValue value) 71 { 72 return m_block->appendNew<B3::Value>(m_proc, B3::BitXor, origin(), 73 value, 74 m_block->appendIntConstant(m_proc, origin(), value->type(), -1)); 75 } 76 77 LValue Output::logicalNot(LValue value) 78 { 79 return m_block->appendNew<B3::Value>(m_proc, B3::Equal, origin(), value, int32Zero); 80 } 81 70 82 LValue Output::load(TypedPointer pointer, LType type) 71 83 { -
trunk/Source/JavaScriptCore/ftl/FTLB3Output.h
r194341 r194372 154 154 LValue lShr(LValue left, LValue right) { return m_block->appendNew<B3::Value>(m_proc, B3::ZShr, origin(), left, castToInt32(right)); } 155 155 LValue bitNot(LValue); 156 LValue logicalNot(LValue); 156 157 157 158 LValue ctlz32(LValue operand) { return m_block->appendNew<B3::Value>(m_proc, B3::Clz, origin(), operand); } … … 336 337 337 338 LValue doubleEqual(LValue left, LValue right) { return m_block->appendNew<B3::Value>(m_proc, B3::Equal, origin(), left, right); } 339 LValue doubleEqualOrUnordered(LValue left, LValue right) { return m_block->appendNew<B3::Value>(m_proc, B3::EqualOrUnordered, origin(), left, right); } 338 340 LValue doubleNotEqualOrUnordered(LValue left, LValue right) { return m_block->appendNew<B3::Value>(m_proc, B3::NotEqual, origin(), left, right); } 339 341 LValue doubleLessThan(LValue left, LValue right) { return m_block->appendNew<B3::Value>(m_proc, B3::LessThan, origin(), left, right); } … … 341 343 LValue doubleGreaterThan(LValue left, LValue right) { return m_block->appendNew<B3::Value>(m_proc, B3::GreaterThan, origin(), left, right); } 342 344 LValue doubleGreaterThanOrEqual(LValue left, LValue right) { return m_block->appendNew<B3::Value>(m_proc, B3::GreaterEqual, origin(), left, right); } 343 LValue doubleNotEqualAndOrdered(LValue left, LValue right) 344 { 345 LValue equalOrUnordered = m_block->appendNew<B3::Value>(m_proc, B3::EqualOrUnordered, origin(), left, right); 346 return bitXor(equalOrUnordered, int32One); 347 } 348 LValue doubleLessThanOrUnordered(LValue left, LValue right) 349 { 350 return m_block->appendNew<B3::Value>( 351 m_proc, B3::Equal, origin(), 352 m_block->appendNew<B3::Value>(m_proc, B3::GreaterEqual, origin(), left, right), 353 int32Zero); 354 } 355 LValue doubleLessThanOrEqualOrUnordered(LValue left, LValue right) 356 { 357 return m_block->appendNew<B3::Value>( 358 m_proc, B3::Equal, origin(), 359 m_block->appendNew<B3::Value>(m_proc, B3::GreaterThan, origin(), left, right), 360 int32Zero); 361 } 362 LValue doubleGreaterThanOrUnordered(LValue left, LValue right) 363 { 364 return m_block->appendNew<B3::Value>( 365 m_proc, B3::Equal, origin(), 366 m_block->appendNew<B3::Value>(m_proc, B3::LessEqual, origin(), left, right), 367 int32Zero); 368 } 369 LValue doubleGreaterThanOrEqualOrUnordered(LValue left, LValue right) 370 { 371 return m_block->appendNew<B3::Value>( 372 m_proc, B3::Equal, origin(), 373 m_block->appendNew<B3::Value>(m_proc, B3::LessThan, origin(), left, right), 374 int32Zero); 375 } 345 LValue doubleNotEqualAndOrdered(LValue left, LValue right) { return logicalNot(doubleEqualOrUnordered(left, right)); } 346 LValue doubleLessThanOrUnordered(LValue left, LValue right) { return logicalNot(doubleGreaterThanOrEqual(left, right)); } 347 LValue doubleLessThanOrEqualOrUnordered(LValue left, LValue right) { return logicalNot(doubleGreaterThan(left, right)); } 348 LValue doubleGreaterThanOrUnordered(LValue left, LValue right) { return logicalNot(doubleLessThanOrEqual(left, right)); } 349 LValue doubleGreaterThanOrEqualOrUnordered(LValue left, LValue right) { return logicalNot(doubleLessThan(left, right)); } 376 350 377 351 LValue isZero32(LValue value) { return m_block->appendNew<B3::Value>(m_proc, B3::Equal, origin(), value, int32Zero); } … … 541 515 } 542 516 543 inline LValue Output::bitNot(LValue value)544 {545 return m_block->appendNew<B3::Value>(m_proc, B3::BitXor, origin(),546 value,547 m_block->appendIntConstant(m_proc, origin(), value->type(), -1));548 }549 550 517 inline LValue Output::bitCast(LValue value, LType type) 551 518 { -
trunk/Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp
r194368 r194372 2701 2701 speculate( 2702 2702 BadIndexingType, jsValueValue(cell), 0, 2703 m_out. bitNot(isArrayType(cell, m_node->arrayMode())));2703 m_out.logicalNot(isArrayType(cell, m_node->arrayMode()))); 2704 2704 } 2705 2705 … … 4900 4900 void compileLogicalNot() 4901 4901 { 4902 setBoolean(m_out. bitNot(boolify(m_node->child1())));4902 setBoolean(m_out.logicalNot(boolify(m_node->child1()))); 4903 4903 } 4904 4904 … … 6169 6169 LValue hasInstance = lowJSValue(m_node->child3()); 6170 6170 6171 setBoolean(m_out. bitNot(m_out.equal(m_out.constInt32(0), vmCall(m_out.int32, m_out.operation(operationInstanceOfCustom), m_callFrame, value, constructor, hasInstance))));6171 setBoolean(m_out.logicalNot(m_out.equal(m_out.constInt32(0), vmCall(m_out.int32, m_out.operation(operationInstanceOfCustom), m_callFrame, value, constructor, hasInstance)))); 6172 6172 } 6173 6173 … … 7632 7632 return m_out.doubleNotEqualAndOrdered(lowDouble(edge), m_out.doubleZero); 7633 7633 case ObjectOrOtherUse: 7634 return m_out. bitNot(7634 return m_out.logicalNot( 7635 7635 equalNullOrUndefined( 7636 7636 edge, CellCaseSpeculatesObject, SpeculateNullOrUndefined, … … 9105 9105 if (LValue proven = isProvenValue(type, SpecMisc)) 9106 9106 return proven; 9107 return m_out. bitNot(isNotMisc(value));9107 return m_out.logicalNot(isNotMisc(value)); 9108 9108 } 9109 9109 … … 9120 9120 if (LValue proven = isProvenValue(type, SpecBoolean)) 9121 9121 return proven; 9122 return m_out. bitNot(isNotBoolean(jsValue));9122 return m_out.logicalNot(isNotBoolean(jsValue)); 9123 9123 } 9124 9124 LValue unboxBoolean(LValue jsValue) … … 9411 9411 LValue isNotType(LValue cell, JSType type) 9412 9412 { 9413 return m_out. bitNot(isType(cell, type));9413 return m_out.logicalNot(isType(cell, type)); 9414 9414 } 9415 9415 -
trunk/Source/JavaScriptCore/ftl/FTLOutput.h
r194341 r194372 145 145 LValue lShr(LValue left, LValue right) { return buildLShr(m_builder, left, right); } // logical = unsigned 146 146 LValue bitNot(LValue value) { return buildNot(m_builder, value); } 147 LValue logicalNot(LValue value) { return bitNot(value); } 147 148 148 149 LValue insertElement(LValue vector, LValue element, LValue index) { return buildInsertElement(m_builder, vector, element, index); } -
trunk/Source/JavaScriptCore/ftl/FTLState.cpp
r193362 r194372 73 73 #if FTL_USES_B3 74 74 proc = std::make_unique<Procedure>(); 75 76 proc->setOriginPrinter( 77 [this] (PrintStream& out, B3::Origin origin) { 78 out.print("DFG:", bitwise_cast<Node*>(origin.data())); 79 }); 75 80 #endif // FTL_USES_B3 76 81 } -
trunk/Source/WTF/ChangeLog
r194323 r194372 1 2015-12-22 Filip Pizlo <fpizlo@apple.com> 2 3 FTL B3 does not logicalNot correctly 4 https://bugs.webkit.org/show_bug.cgi?id=152512 5 6 Reviewed by Saam Barati. 7 8 This change introduces yet another use of SharedTask in JSC. While doing this, I noticed that 9 SharedTask::run() always demands that whatever arguments the callback takes, they must be 10 passed as rvalue references. This was a clear misuse of perfect forwarding. This change makes 11 SharedTask's approach to forwarding match what we were already doing in ScopedLambda. 12 13 * wtf/SharedTask.h: 14 1 15 2015-12-20 Michael Catanzaro <mcatanzaro@igalia.com> 2 16 -
trunk/Source/WTF/wtf/SharedTask.h
r191705 r194372 66 66 virtual ~SharedTask() { } 67 67 68 virtual ResultType run(ArgumentTypes &&...) = 0;68 virtual ResultType run(ArgumentTypes...) = 0; 69 69 }; 70 70 … … 86 86 87 87 private: 88 ResultType run(ArgumentTypes &&... arguments) override88 ResultType run(ArgumentTypes... arguments) override 89 89 { 90 return m_functor( std::forward<ArgumentTypes>(arguments)...);90 return m_functor(arguments...); 91 91 } 92 92
Note:
See TracChangeset
for help on using the changeset viewer.