Changeset 231719 in webkit
- Timestamp:
- May 11, 2018 2:16:05 PM (6 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 added
- 18 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/CMakeLists.txt
r231565 r231719 455 455 bytecode/JumpTable.h 456 456 bytecode/LLIntCallLinkInfo.h 457 bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.h 457 458 bytecode/LazyOperandValueProfile.h 458 459 bytecode/ObjectAllocationProfile.h -
trunk/Source/JavaScriptCore/ChangeLog
r231710 r231719 1 2018-05-11 Commit Queue <commit-queue@webkit.org> 2 3 Unreviewed, rolling out r231316 and r231332. 4 https://bugs.webkit.org/show_bug.cgi?id=185564 5 6 Appears to be a Speedometer2/MotionMark regression (Requested 7 by keith_miller on #webkit). 8 9 Reverted changesets: 10 11 "Remove the prototype caching for get_by_id in the LLInt" 12 https://bugs.webkit.org/show_bug.cgi?id=185226 13 https://trac.webkit.org/changeset/231316 14 15 "Unreviewed, fix 32-bit profile offset for change in bytecode" 16 https://trac.webkit.org/changeset/231332 17 1 18 2018-05-11 Michael Saboff <msaboff@apple.com> 2 19 -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r231589 r231719 1038 1038 53F6BF6D1C3F060A00F41E5D /* InternalFunctionAllocationProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 53F6BF6C1C3F060A00F41E5D /* InternalFunctionAllocationProfile.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1039 1039 53F8D2001E8387D400D21116 /* WasmBBQPlanInlines.h in Headers */ = {isa = PBXBuildFile; fileRef = 53F8D1FF1E8387D400D21116 /* WasmBBQPlanInlines.h */; }; 1040 53FA2AE11CF37F3F0022711D /* LLIntPrototypeLoadAdaptiveStructureWatchpoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 53FA2AE01CF37F3F0022711D /* LLIntPrototypeLoadAdaptiveStructureWatchpoint.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1040 1041 53FD04D41D7AB291003287D3 /* WasmCallingConvention.h in Headers */ = {isa = PBXBuildFile; fileRef = 53FD04D21D7AB187003287D3 /* WasmCallingConvention.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1041 1042 53FF7F991DBFCD9000A26CCC /* WasmValidate.h in Headers */ = {isa = PBXBuildFile; fileRef = 53FF7F981DBFCD9000A26CCC /* WasmValidate.h */; }; … … 3463 3464 53F6BF6C1C3F060A00F41E5D /* InternalFunctionAllocationProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InternalFunctionAllocationProfile.h; sourceTree = "<group>"; }; 3464 3465 53F8D1FF1E8387D400D21116 /* WasmBBQPlanInlines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WasmBBQPlanInlines.h; sourceTree = "<group>"; }; 3466 53FA2AE01CF37F3F0022711D /* LLIntPrototypeLoadAdaptiveStructureWatchpoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LLIntPrototypeLoadAdaptiveStructureWatchpoint.h; sourceTree = "<group>"; }; 3467 53FA2AE21CF380390022711D /* LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp; sourceTree = "<group>"; }; 3465 3468 53FD04D11D7AB187003287D3 /* WasmCallingConvention.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WasmCallingConvention.cpp; sourceTree = "<group>"; }; 3466 3469 53FD04D21D7AB187003287D3 /* WasmCallingConvention.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WasmCallingConvention.h; sourceTree = "<group>"; }; … … 6659 6662 FE2B0B681FD0D2970075DA5F /* JSCPoison.cpp */, 6660 6663 FE2B0B701FD8C4630075DA5F /* JSCPoison.h */, 6661 FE7497E5209001B00003565B /* JSCPtrTag.h */,6662 6664 72AAF7CB1D0D318B005E60BE /* JSCustomGetterSetterFunction.cpp */, 6663 6665 72AAF7CC1D0D318B005E60BE /* JSCustomGetterSetterFunction.h */, … … 6745 6747 862553CE16136AA5009F17D0 /* JSProxy.cpp */, 6746 6748 862553CF16136AA5009F17D0 /* JSProxy.h */, 6749 FE7497E5209001B00003565B /* JSCPtrTag.h */, 6747 6750 534638721E70D01500F12AC1 /* JSRunLoopTimer.cpp */, 6748 6751 534638701E70CF3D00F12AC1 /* JSRunLoopTimer.h */, … … 7627 7630 0FB5467614F59AD1002C2989 /* LazyOperandValueProfile.h */, 7628 7631 0F0FC45814BD15F100B81154 /* LLIntCallLinkInfo.h */, 7632 53FA2AE21CF380390022711D /* LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp */, 7633 53FA2AE01CF37F3F0022711D /* LLIntPrototypeLoadAdaptiveStructureWatchpoint.h */, 7629 7634 0FB5467C14F5CFD3002C2989 /* MethodOfGettingAValueProfile.cpp */, 7630 7635 0FB5467A14F5C7D4002C2989 /* MethodOfGettingAValueProfile.h */, … … 8993 8998 148CD1D8108CF902008163C6 /* JSContextRefPrivate.h in Headers */, 8994 8999 FE2B0B731FD9EF700075DA5F /* JSCPoison.h in Headers */, 8995 FE7497E6209001B10003565B /* JSCPtrTag.h in Headers */,8996 9000 A72028B81797601E0098028C /* JSCTestRunnerUtils.h in Headers */, 8997 9001 72AAF7CE1D0D31B3005E60BE /* JSCustomGetterSetterFunction.h in Headers */, … … 9069 9073 7C184E1F17BEE22E007CB63A /* JSPromisePrototype.h in Headers */, 9070 9074 996B731F1BDA08EF00331B84 /* JSPromisePrototype.lut.h in Headers */, 9075 FE7497E6209001B10003565B /* JSCPtrTag.h in Headers */, 9071 9076 2A05ABD61961DF2400341750 /* JSPropertyNameEnumerator.h in Headers */, 9072 9077 862553D216136E1A009F17D0 /* JSProxy.h in Headers */, … … 9157 9162 FED287B215EC9A5700DA8161 /* LLIntOpcode.h in Headers */, 9158 9163 79CFC6F01C33B10000C768EA /* LLIntPCRanges.h in Headers */, 9164 53FA2AE11CF37F3F0022711D /* LLIntPrototypeLoadAdaptiveStructureWatchpoint.h in Headers */, 9159 9165 0F4680A514BA7F8D00BFE272 /* LLIntSlowPaths.h in Headers */, 9160 9166 0F0B839D14BCF46600885B4F /* LLIntThunks.h in Headers */, -
trunk/Source/JavaScriptCore/Sources.txt
r231560 r231719 225 225 bytecode/IntrinsicGetterAccessCase.cpp 226 226 bytecode/JumpTable.cpp 227 bytecode/LLIntPrototypeLoadAdaptiveStructureWatchpoint.cpp 227 228 bytecode/LazyOperandValueProfile.cpp 228 229 bytecode/MethodOfGettingAValueProfile.cpp -
trunk/Source/JavaScriptCore/bytecode/BytecodeDumper.cpp
r231316 r231719 378 378 op = "get_by_id"; 379 379 break; 380 case op_get_by_id_proto_load: 381 op = "get_by_id_proto_load"; 382 break; 383 case op_get_by_id_unset: 384 op = "get_by_id_unset"; 385 break; 380 386 case op_get_array_length: 381 387 op = "array_length"; … … 392 398 printLocationAndOp(out, location, it, op); 393 399 out.printf("%s, %s, %s", registerName(r0).data(), registerName(r1).data(), idName(id0, identifier(id0)).data()); 394 it += 3; // Increment up to the value profiler.400 it += 4; // Increment up to the value profiler. 395 401 } 396 402 … … 437 443 dumpStructure(out, "struct", structure, ident); 438 444 out.printf(")"); 445 if (Interpreter::getOpcodeID(instruction[0]) == op_get_by_id_proto_load) 446 out.printf(" proto(%p)", getPointer(instruction[6])); 439 447 } 440 448 … … 1031 1039 } 1032 1040 case op_get_by_id: 1041 case op_get_by_id_proto_load: 1042 case op_get_by_id_unset: 1033 1043 case op_get_array_length: { 1034 1044 printGetByIdOp(out, location, it); -
trunk/Source/JavaScriptCore/bytecode/BytecodeList.json
r231316 r231719 82 82 { "name" : "op_is_cell_with_type", "length" : 4 }, 83 83 { "name" : "op_in", "length" : 5 }, 84 { "name" : "op_get_array_length", "length" : 8 }, 85 { "name" : "op_get_by_id", "length" : 8 }, 84 { "name" : "op_get_array_length", "length" : 9 }, 85 { "name" : "op_get_by_id", "length" : 9 }, 86 { "name" : "op_get_by_id_proto_load", "length" : 9 }, 87 { "name" : "op_get_by_id_unset", "length" : 9 }, 86 88 { "name" : "op_get_by_id_with_this", "length" : 6 }, 87 89 { "name" : "op_get_by_val_with_this", "length" : 6 }, -
trunk/Source/JavaScriptCore/bytecode/BytecodeUseDef.h
r231316 r231719 183 183 case op_try_get_by_id: 184 184 case op_get_by_id: 185 case op_get_by_id_proto_load: 186 case op_get_by_id_unset: 185 187 case op_get_by_id_direct: 186 188 case op_get_array_length: … … 433 435 case op_try_get_by_id: 434 436 case op_get_by_id: 437 case op_get_by_id_proto_load: 438 case op_get_by_id_unset: 435 439 case op_get_by_id_direct: 436 440 case op_get_by_id_with_this: -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.cpp
r231695 r231719 66 66 #include "LLIntData.h" 67 67 #include "LLIntEntrypoint.h" 68 #include "LLIntPrototypeLoadAdaptiveStructureWatchpoint.h" 68 69 #include "LowLevelInterpreter.h" 69 70 #include "ModuleProgramCodeBlock.h" … … 1251 1252 Instruction* curInstruction = &instructions()[propertyAccessInstructions[i]]; 1252 1253 switch (Interpreter::getOpcodeID(curInstruction[0])) { 1253 case op_get_by_id: { 1254 case op_get_by_id: 1255 case op_get_by_id_proto_load: 1256 case op_get_by_id_unset: { 1254 1257 StructureID oldStructureID = curInstruction[4].u.structureID; 1255 1258 if (!oldStructureID || Heap::isMarked(vm.heap.structureIDTable().get(oldStructureID))) … … 1344 1347 } 1345 1348 } 1349 1350 // We can't just remove all the sets when we clear the caches since we might have created a watchpoint set 1351 // then cleared the cache without GCing in between. 1352 m_llintGetByIdWatchpointMap.removeIf([](const StructureWatchpointMap::KeyValuePairType& pair) -> bool { 1353 return !Heap::isMarked(pair.key); 1354 }); 1346 1355 1347 1356 for (unsigned i = 0; i < m_llintCallLinkInfos.size(); ++i) { -
trunk/Source/JavaScriptCore/bytecode/CodeBlock.h
r231695 r231719 55 55 #include "JumpTable.h" 56 56 #include "LLIntCallLinkInfo.h" 57 #include "LLIntPrototypeLoadAdaptiveStructureWatchpoint.h" 57 58 #include "LazyOperandValueProfile.h" 58 59 #include "ModuleProgramExecutable.h" … … 628 629 } 629 630 631 typedef HashMap<Structure*, Bag<LLIntPrototypeLoadAdaptiveStructureWatchpoint>> StructureWatchpointMap; 632 StructureWatchpointMap& llintGetByIdWatchpointMap() { return m_llintGetByIdWatchpointMap; } 633 630 634 // Functions for controlling when tiered compilation kicks in. This 631 635 // controls both when the optimizing compiler is invoked and when OSR … … 972 976 RefCountedArray<LLIntCallLinkInfo> m_llintCallLinkInfos; 973 977 SentinelLinkedList<LLIntCallLinkInfo, BasicRawSentinelNode<LLIntCallLinkInfo>> m_incomingLLIntCalls; 978 StructureWatchpointMap m_llintGetByIdWatchpointMap; 974 979 PoisonedRefPtr<CodeBlockPoison, JITCode> m_jitCode; 975 980 #if ENABLE(JIT) -
trunk/Source/JavaScriptCore/bytecode/GetByIdStatus.cpp
r231316 r231719 105 105 106 106 case op_get_array_length: 107 case op_try_get_by_id: { 107 case op_try_get_by_id: 108 case op_get_by_id_proto_load: 109 case op_get_by_id_unset: { 110 // FIXME: We should not just bail if we see a try_get_by_id or a get_by_id_proto_load. 111 // https://bugs.webkit.org/show_bug.cgi?id=158039 108 112 return GetByIdStatus(NoInformation, false); 109 113 } -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r231695 r231719 2704 2704 instructions().append(0); 2705 2705 instructions().append(0); 2706 instructions().append(Options::prototypeHitCountForLLIntCaching()); 2706 2707 instructions().append(profile); 2707 2708 return dst; -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r231472 r231719 5154 5154 case op_try_get_by_id: 5155 5155 case op_get_by_id: 5156 case op_get_by_id_proto_load: 5157 case op_get_by_id_unset: 5156 5158 case op_get_array_length: { 5157 5159 SpeculatedType prediction = getPrediction(); -
trunk/Source/JavaScriptCore/dfg/DFGCapabilities.cpp
r231316 r231719 165 165 case op_try_get_by_id: 166 166 case op_get_by_id: 167 case op_get_by_id_proto_load: 168 case op_get_by_id_unset: 167 169 case op_get_by_id_with_this: 168 170 case op_get_by_id_direct: -
trunk/Source/JavaScriptCore/jit/JIT.cpp
r231514 r231719 343 343 DEFINE_OP(op_try_get_by_id) 344 344 case op_get_array_length: 345 case op_get_by_id_proto_load: 346 case op_get_by_id_unset: 345 347 DEFINE_OP(op_get_by_id) 346 348 DEFINE_OP(op_get_by_id_with_this) … … 520 522 DEFINE_SLOWCASE_OP(op_try_get_by_id) 521 523 case op_get_array_length: 524 case op_get_by_id_proto_load: 525 case op_get_by_id_unset: 522 526 DEFINE_SLOWCASE_OP(op_get_by_id) 523 527 DEFINE_SLOWCASE_OP(op_get_by_id_with_this) -
trunk/Source/JavaScriptCore/llint/LLIntSlowPaths.cpp
r231316 r231719 642 642 } 643 643 644 645 static void setupGetByIdPrototypeCache(ExecState* exec, VM& vm, Instruction* pc, JSCell* baseCell, PropertySlot& slot, const Identifier& ident) 646 { 647 CodeBlock* codeBlock = exec->codeBlock(); 648 Structure* structure = baseCell->structure(); 649 650 if (structure->typeInfo().prohibitsPropertyCaching()) 651 return; 652 653 if (structure->needImpurePropertyWatchpoint()) 654 return; 655 656 if (structure->isDictionary()) { 657 if (structure->hasBeenFlattenedBefore()) 658 return; 659 structure->flattenDictionaryStructure(vm, jsCast<JSObject*>(baseCell)); 660 } 661 662 ObjectPropertyConditionSet conditions; 663 if (slot.isUnset()) 664 conditions = generateConditionsForPropertyMiss(vm, codeBlock, exec, structure, ident.impl()); 665 else 666 conditions = generateConditionsForPrototypePropertyHit(vm, codeBlock, exec, structure, slot.slotBase(), ident.impl()); 667 668 if (!conditions.isValid()) 669 return; 670 671 PropertyOffset offset = invalidOffset; 672 CodeBlock::StructureWatchpointMap& watchpointMap = codeBlock->llintGetByIdWatchpointMap(); 673 auto result = watchpointMap.add(structure, Bag<LLIntPrototypeLoadAdaptiveStructureWatchpoint>()); 674 for (ObjectPropertyCondition condition : conditions) { 675 if (!condition.isWatchable()) 676 return; 677 if (condition.condition().kind() == PropertyCondition::Presence) 678 offset = condition.condition().offset(); 679 result.iterator->value.add(condition, pc)->install(); 680 } 681 ASSERT((offset == invalidOffset) == slot.isUnset()); 682 683 ConcurrentJSLocker locker(codeBlock->m_lock); 684 685 if (slot.isUnset()) { 686 pc[0].u.opcode = LLInt::getOpcode(op_get_by_id_unset); 687 pc[4].u.structureID = structure->id(); 688 return; 689 } 690 ASSERT(slot.isValue()); 691 692 pc[0].u.opcode = LLInt::getOpcode(op_get_by_id_proto_load); 693 pc[4].u.structureID = structure->id(); 694 pc[5].u.operand = offset; 695 // We know that this pointer will remain valid because it will be cleared by either a watchpoint fire or 696 // during GC when we clear the LLInt caches. 697 pc[6].u.pointer = slot.slotBase(); 698 } 699 700 644 701 LLINT_SLOW_PATH_DECL(slow_path_get_by_id) 645 702 { … … 662 719 if (oldStructureID) { 663 720 auto opcode = Interpreter::getOpcodeID(pc[0]); 664 if (opcode == op_get_by_id) { 721 if (opcode == op_get_by_id 722 || opcode == op_get_by_id_unset 723 || opcode == op_get_by_id_proto_load) { 665 724 Structure* a = vm.heap.structureIDTable().get(oldStructureID); 666 725 Structure* b = baseValue.asCell()->structure(vm); … … 681 740 pc[4].u.pointer = nullptr; // old structure 682 741 pc[5].u.pointer = nullptr; // offset 742 743 // Prevent the prototype cache from ever happening. 744 pc[7].u.operand = 0; 683 745 684 746 if (structure->propertyAccessesAreCacheable() … … 691 753 pc[5].u.operand = slot.cachedOffset(); 692 754 } 755 } else if (UNLIKELY(pc[7].u.operand && (slot.isValue() || slot.isUnset()))) { 756 ASSERT(slot.slotBase() != baseValue); 757 758 if (!(--pc[7].u.operand)) 759 setupGetByIdPrototypeCache(exec, vm, pc, baseCell, slot, ident); 693 760 } 694 761 } else if (!LLINT_ALWAYS_ACCESS_SLOW … … 699 766 arrayProfile->observeStructure(baseValue.asCell()->structure()); 700 767 pc[4].u.arrayProfile = arrayProfile; 768 769 // Prevent the prototype cache from ever happening. 770 pc[7].u.operand = 0; 701 771 } 702 772 -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
r231332 r231719 1421 1421 storei t0, TagOffset[cfr, t2, 8] 1422 1422 storei t1, PayloadOffset[cfr, t2, 8] 1423 valueProfile(t0, t1, 28, t2)1423 valueProfile(t0, t1, 32, t2) 1424 1424 dispatch(constexpr op_get_by_id_length) 1425 1425 … … 1427 1427 callSlowPath(_llint_slow_path_get_by_id) 1428 1428 dispatch(constexpr op_get_by_id_length) 1429 1430 1431 _llint_op_get_by_id_proto_load: 1432 traceExecution() 1433 loadi 8[PC], t0 1434 loadi 16[PC], t1 1435 loadConstantOrVariablePayload(t0, CellTag, t3, .opGetByIdProtoSlow) 1436 loadi 20[PC], t2 1437 bineq JSCell::m_structureID[t3], t1, .opGetByIdProtoSlow 1438 loadpFromInstruction(6, t3) 1439 loadPropertyAtVariableOffset(t2, t3, t0, t1) 1440 loadi 4[PC], t2 1441 storei t0, TagOffset[cfr, t2, 8] 1442 storei t1, PayloadOffset[cfr, t2, 8] 1443 valueProfile(t0, t1, 32, t2) 1444 dispatch(constexpr op_get_by_id_proto_load_length) 1445 1446 .opGetByIdProtoSlow: 1447 callSlowPath(_llint_slow_path_get_by_id) 1448 dispatch(constexpr op_get_by_id_proto_load_length) 1449 1450 1451 _llint_op_get_by_id_unset: 1452 traceExecution() 1453 loadi 8[PC], t0 1454 loadi 16[PC], t1 1455 loadConstantOrVariablePayload(t0, CellTag, t3, .opGetByIdUnsetSlow) 1456 bineq JSCell::m_structureID[t3], t1, .opGetByIdUnsetSlow 1457 loadi 4[PC], t2 1458 storei UndefinedTag, TagOffset[cfr, t2, 8] 1459 storei 0, PayloadOffset[cfr, t2, 8] 1460 valueProfile(UndefinedTag, 0, 32, t2) 1461 dispatch(constexpr op_get_by_id_unset_length) 1462 1463 .opGetByIdUnsetSlow: 1464 callSlowPath(_llint_slow_path_get_by_id) 1465 dispatch(constexpr op_get_by_id_unset_length) 1429 1466 1430 1467 … … 1442 1479 loadi -sizeof IndexingHeader + IndexingHeader::u.lengths.publicLength[t0], t0 1443 1480 bilt t0, 0, .opGetArrayLengthSlow 1444 valueProfile(Int32Tag, t0, 28, t2)1481 valueProfile(Int32Tag, t0, 32, t2) 1445 1482 storep t0, PayloadOffset[cfr, t1, 8] 1446 1483 storep Int32Tag, TagOffset[cfr, t1, 8] -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
r231316 r231719 1343 1343 loadPropertyAtVariableOffset(t1, t3, t0) 1344 1344 storeq t0, [cfr, t2, 8] 1345 valueProfile(t0, constexpr (op_get_by_id_length - 1), t1)1345 valueProfile(t0, 8, t1) 1346 1346 dispatch(constexpr op_get_by_id_length) 1347 1347 … … 1349 1349 callSlowPath(_llint_slow_path_get_by_id) 1350 1350 dispatch(constexpr op_get_by_id_length) 1351 1352 1353 _llint_op_get_by_id_proto_load: 1354 traceExecution() 1355 loadisFromInstruction(2, t0) 1356 loadConstantOrVariableCell(t0, t3, .opGetByIdProtoSlow) 1357 loadi JSCell::m_structureID[t3], t1 1358 loadisFromInstruction(4, t2) 1359 bineq t2, t1, .opGetByIdProtoSlow 1360 loadisFromInstruction(5, t1) 1361 loadpFromInstruction(6, t3) 1362 loadisFromInstruction(1, t2) 1363 loadPropertyAtVariableOffset(t1, t3, t0) 1364 storeq t0, [cfr, t2, 8] 1365 valueProfile(t0, 8, t1) 1366 dispatch(constexpr op_get_by_id_proto_load_length) 1367 1368 .opGetByIdProtoSlow: 1369 callSlowPath(_llint_slow_path_get_by_id) 1370 dispatch(constexpr op_get_by_id_proto_load_length) 1371 1372 1373 _llint_op_get_by_id_unset: 1374 traceExecution() 1375 loadisFromInstruction(2, t0) 1376 loadConstantOrVariableCell(t0, t3, .opGetByIdUnsetSlow) 1377 loadi JSCell::m_structureID[t3], t1 1378 loadisFromInstruction(4, t2) 1379 bineq t2, t1, .opGetByIdUnsetSlow 1380 loadisFromInstruction(1, t2) 1381 storeq ValueUndefined, [cfr, t2, 8] 1382 valueProfile(ValueUndefined, 8, t1) 1383 dispatch(constexpr op_get_by_id_unset_length) 1384 1385 .opGetByIdUnsetSlow: 1386 callSlowPath(_llint_slow_path_get_by_id) 1387 dispatch(constexpr op_get_by_id_unset_length) 1351 1388 1352 1389 … … 1365 1402 bilt t0, 0, .opGetArrayLengthSlow 1366 1403 orq tagTypeNumber, t0 1367 valueProfile(t0, constexpr (op_get_array_length_length - 1), t2)1404 valueProfile(t0, 8, t2) 1368 1405 storeq t0, [cfr, t1, 8] 1369 1406 dispatch(constexpr op_get_array_length_length) -
trunk/Source/JavaScriptCore/runtime/Options.h
r231338 r231719 458 458 v(bool, useICStats, false, Normal, nullptr) \ 459 459 \ 460 v(unsigned, prototypeHitCountForLLIntCaching, 2, Normal, "Number of prototype property hits before caching a prototype in the LLInt. A count of 0 means never cache.") \ 461 \ 460 462 v(bool, dumpCompiledRegExpPatterns, false, Normal, nullptr) \ 461 463 \
Note: See TracChangeset
for help on using the changeset viewer.