Changeset 249523 in webkit
- Timestamp:
- Sep 4, 2019 10:51:56 PM (5 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 16 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r249520 r249523 1 2019-09-04 Yusuke Suzuki <ysuzuki@apple.com> 2 3 Unreviewed, partial roll out r249372 due to JetStream2/Basic ~10% regression 4 https://bugs.webkit.org/show_bug.cgi?id=201373 5 6 * bytecode/BytecodeList.rb: 7 * bytecode/BytecodeUseDef.h: 8 (JSC::computeUsesForBytecodeOffset): 9 (JSC::computeDefsForBytecodeOffset): 10 * bytecompiler/BytecodeGenerator.cpp: 11 (JSC::BytecodeGenerator::BytecodeGenerator): 12 (JSC::BytecodeGenerator::emitLoopHint): 13 (JSC::BytecodeGenerator::emitCheckTraps): 14 * bytecompiler/BytecodeGenerator.h: 15 * dfg/DFGByteCodeParser.cpp: 16 (JSC::DFG::ByteCodeParser::handleRecursiveTailCall): 17 (JSC::DFG::ByteCodeParser::parseBlock): 18 * dfg/DFGCapabilities.cpp: 19 (JSC::DFG::capabilityLevel): 20 * jit/JIT.cpp: 21 (JSC::JIT::emitEnterOptimizationCheck): 22 (JSC::JIT::privateCompileMainPass): 23 (JSC::JIT::privateCompileSlowCases): 24 * jit/JIT.h: 25 * jit/JITOpcodes.cpp: 26 (JSC::JIT::emit_op_enter): 27 (JSC::JIT::emit_op_loop_hint): 28 (JSC::JIT::emitSlow_op_loop_hint): 29 (JSC::JIT::emit_op_check_traps): 30 (JSC::JIT::emitSlow_op_check_traps): 31 (JSC::JIT::emitSlow_op_enter): Deleted. 32 * jit/JITOpcodes32_64.cpp: 33 (JSC::JIT::emit_op_enter): 34 * llint/LowLevelInterpreter.asm: 35 * llint/LowLevelInterpreter32_64.asm: 36 * llint/LowLevelInterpreter64.asm: 37 * runtime/CommonSlowPaths.cpp: 38 (JSC::SLOW_PATH_DECL): 39 * runtime/CommonSlowPaths.h: 40 1 41 2019-09-04 Yusuke Suzuki <ysuzuki@apple.com> 2 42 -
trunk/Source/JavaScriptCore/bytecode/BytecodeList.rb
r249509 r249523 1109 1109 argument: VirtualRegister, 1110 1110 } 1111 1112 op :check_traps 1111 1113 1112 1114 op :log_shadow_chicken_prologue, -
trunk/Source/JavaScriptCore/bytecode/BytecodeUseDef.h
r249509 r249523 88 88 case op_create_cloned_arguments: 89 89 case op_get_rest_length: 90 case op_check_traps: 90 91 case op_get_argument: 91 92 case op_nop: … … 352 353 case op_put_to_arguments: 353 354 case op_set_function_name: 355 case op_check_traps: 354 356 case op_log_shadow_chicken_prologue: 355 357 case op_log_shadow_chicken_tail: -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r249509 r249523 362 362 allocateAndEmitScope(); 363 363 364 emitCheckTraps(); 365 364 366 const FunctionStack& functionStack = programNode->functionStack(); 365 367 … … 483 485 allocateAndEmitScope(); 484 486 487 emitCheckTraps(); 488 485 489 if (functionNameIsInScope(functionNode->ident(), functionNode->functionMode())) { 486 490 ASSERT(parseMode != SourceParseMode::GeneratorBodyMode); … … 894 898 allocateAndEmitScope(); 895 899 900 emitCheckTraps(); 901 896 902 for (FunctionMetadataNode* function : evalNode->functionStack()) { 897 903 m_codeBlock->addFunctionDecl(makeFunction(function)); … … 978 984 allocateAndEmitScope(); 979 985 986 emitCheckTraps(); 987 980 988 m_calleeRegister.setIndex(CallFrameSlot::callee); 981 989 … … 1405 1413 { 1406 1414 OpLoopHint::emit(this); 1415 emitCheckTraps(); 1407 1416 } 1408 1417 … … 1410 1419 { 1411 1420 OpJmp::emit(this, target.bind(this)); 1421 } 1422 1423 void BytecodeGenerator::emitCheckTraps() 1424 { 1425 OpCheckTraps::emit(this); 1412 1426 } 1413 1427 -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r249509 r249523 853 853 854 854 void emitEnter(); 855 void emitCheckTraps(); 855 856 856 857 RegisterID* emitHasIndexedProperty(RegisterID* dst, RegisterID* base, RegisterID* propertyName); -
trunk/Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
r249509 r249523 1445 1445 setDirect(stackEntry->remapOperand(virtualRegisterForLocal(i)), undefined, NormalSet); 1446 1446 1447 // We want to emit the SetLocals with an exit origin that points to the place we are jumping to. 1447 1448 unsigned oldIndex = m_currentIndex; 1448 1449 auto oldStackTop = m_inlineStackTop; 1449 1450 // First, we emit check-traps operation pointing to bc#0 as exit.1451 1450 m_inlineStackTop = stackEntry; 1452 m_currentIndex = 0;1453 m_exitOK = true;1454 addToGraph(Options::usePollingTraps() ? CheckTraps : InvalidationPoint);1455 1456 // Then, we want to emit the SetLocals with an exit origin that points to the place we are jumping to.1457 1451 m_currentIndex = opcodeLengths[op_enter]; 1458 1452 m_exitOK = true; … … 4789 4783 4790 4784 case op_enter: { 4791 addToGraph(Options::usePollingTraps() ? CheckTraps : InvalidationPoint);4792 4785 Node* undefined = addToGraph(JSConstant, OpInfo(m_constantUndefined)); 4793 4786 // Initialize all locals to undefined. 4794 4787 for (int i = 0; i < m_inlineStackTop->m_codeBlock->numVars(); ++i) 4795 4788 set(virtualRegisterForLocal(i), undefined, ImmediateNakedSet); 4789 4796 4790 NEXT_OPCODE(op_enter); 4797 4791 } … … 6728 6722 6729 6723 addToGraph(LoopHint); 6724 NEXT_OPCODE(op_loop_hint); 6725 } 6726 6727 case op_check_traps: { 6730 6728 addToGraph(Options::usePollingTraps() ? CheckTraps : InvalidationPoint); 6731 NEXT_OPCODE(op_ loop_hint);6732 } 6733 6729 NEXT_OPCODE(op_check_traps); 6730 } 6731 6734 6732 case op_nop: { 6735 6733 addToGraph(Check); // We add a nop here so that basic block linking doesn't break. -
trunk/Source/JavaScriptCore/dfg/DFGCapabilities.cpp
r249509 r249523 207 207 case op_jbeloweq: 208 208 case op_loop_hint: 209 case op_check_traps: 209 210 case op_nop: 210 211 case op_ret: -
trunk/Source/JavaScriptCore/jit/JIT.cpp
r249509 r249523 91 91 { 92 92 } 93 94 #if ENABLE(DFG_JIT) 95 void JIT::emitEnterOptimizationCheck() 96 { 97 if (!canBeOptimized()) 98 return; 99 100 JumpList skipOptimize; 101 102 skipOptimize.append(branchAdd32(Signed, TrustedImm32(Options::executionCounterIncrementForEntry()), AbsoluteAddress(m_codeBlock->addressOfJITExecuteCounter()))); 103 ASSERT(!m_bytecodeOffset); 104 105 copyCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(vm().topEntryFrame); 106 107 callOperation(operationOptimize, m_bytecodeOffset); 108 skipOptimize.append(branchTestPtr(Zero, returnValueGPR)); 109 farJump(returnValueGPR, GPRInfo::callFrameRegister); 110 skipOptimize.link(this); 111 } 112 #endif 93 113 94 114 void JIT::emitNotifyWrite(WatchpointSet* set) … … 366 386 DEFINE_OP(op_jtrue) 367 387 DEFINE_OP(op_loop_hint) 388 DEFINE_OP(op_check_traps) 368 389 DEFINE_OP(op_nop) 369 390 DEFINE_OP(op_super_sampler_begin) … … 533 554 DEFINE_SLOWCASE_OP(op_jnstricteq) 534 555 DEFINE_SLOWCASE_OP(op_loop_hint) 535 DEFINE_SLOWCASE_OP(op_ enter)556 DEFINE_SLOWCASE_OP(op_check_traps) 536 557 DEFINE_SLOWCASE_OP(op_mod) 537 558 DEFINE_SLOWCASE_OP(op_mul) -
trunk/Source/JavaScriptCore/jit/JIT.h
r249509 r249523 576 576 void emit_op_jtrue(const Instruction*); 577 577 void emit_op_loop_hint(const Instruction*); 578 void emit_op_check_traps(const Instruction*); 578 579 void emit_op_nop(const Instruction*); 579 580 void emit_op_super_sampler_begin(const Instruction*); … … 675 676 void emitSlow_op_jtrue(const Instruction*, Vector<SlowCaseEntry>::iterator&); 676 677 void emitSlow_op_loop_hint(const Instruction*, Vector<SlowCaseEntry>::iterator&); 677 void emitSlow_op_ enter(const Instruction*, Vector<SlowCaseEntry>::iterator&);678 void emitSlow_op_check_traps(const Instruction*, Vector<SlowCaseEntry>::iterator&); 678 679 void emitSlow_op_mod(const Instruction*, Vector<SlowCaseEntry>::iterator&); 679 680 void emitSlow_op_mul(const Instruction*, Vector<SlowCaseEntry>::iterator&); … … 870 871 int jumpTarget(const Instruction*, int target); 871 872 873 #if ENABLE(DFG_JIT) 874 void emitEnterOptimizationCheck(); 875 #else 876 void emitEnterOptimizationCheck() { } 877 #endif 878 872 879 #ifndef NDEBUG 873 880 void printBytecodeOperandTypes(int src1, int src2); -
trunk/Source/JavaScriptCore/jit/JITOpcodes.cpp
r249372 r249523 876 876 } 877 877 878 void JIT::emit_op_enter(const Instruction*) 879 { 880 // Even though CTI doesn't use them, we initialize our constant 881 // registers to zap stale pointers, to avoid unnecessarily prolonging 882 // object lifetime and increasing GC pressure. 883 size_t count = m_codeBlock->numVars(); 884 for (size_t j = CodeBlock::llintBaselineCalleeSaveSpaceAsVirtualRegisters(); j < count; ++j) 885 emitInitRegister(virtualRegisterForLocal(j).offset()); 886 887 emitWriteBarrier(m_codeBlock); 888 889 emitEnterOptimizationCheck(); 890 } 891 878 892 void JIT::emit_op_get_scope(const Instruction* currentInstruction) 879 893 { … … 1007 1021 void JIT::emit_op_loop_hint(const Instruction*) 1008 1022 { 1009 // Check traps. 1010 addSlowCase(branchTest8(NonZero, AbsoluteAddress(m_vm->needTrapHandlingAddress()))); 1011 #if ENABLE(DFG_JIT) 1012 // Emit the JIT optimization check: 1023 // Emit the JIT optimization check: 1013 1024 if (canBeOptimized()) { 1014 1025 addSlowCase(branchAdd32(PositiveOrZero, TrustedImm32(Options::executionCounterIncrementForLoop()), 1015 1026 AbsoluteAddress(m_codeBlock->addressOfJITExecuteCounter()))); 1016 1027 } 1017 #endif1018 1028 } 1019 1029 1020 1030 void JIT::emitSlow_op_loop_hint(const Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) 1021 1031 { 1022 linkSlowCase(iter);1023 callOperation(operationHandleTraps);1024 1032 #if ENABLE(DFG_JIT) 1025 1033 // Emit the slow path for the JIT optimization check: 1026 1034 if (canBeOptimized()) { 1027 emitJumpSlowToHot(branchAdd32(Signed, TrustedImm32(Options::executionCounterIncrementForLoop()), AbsoluteAddress(m_codeBlock->addressOfJITExecuteCounter())), currentInstruction->size()); 1028 linkSlowCase(iter); 1035 linkAllSlowCases(iter); 1029 1036 1030 1037 copyCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(vm().topEntryFrame); 1031 1038 1032 1039 callOperation(operationOptimize, m_bytecodeOffset); 1033 emitJumpSlowToHot(branchTestPtr(Zero, returnValueGPR), currentInstruction->size());1040 Jump noOptimizedEntry = branchTestPtr(Zero, returnValueGPR); 1034 1041 if (!ASSERT_DISABLED) { 1035 1042 Jump ok = branchPtr(MacroAssembler::Above, returnValueGPR, TrustedImmPtr(bitwise_cast<void*>(static_cast<intptr_t>(1000)))); … … 1038 1045 } 1039 1046 farJump(returnValueGPR, GPRInfo::callFrameRegister); 1047 noOptimizedEntry.link(this); 1048 1049 emitJumpSlowToHot(jump(), currentInstruction->size()); 1040 1050 } 1041 1051 #else 1042 1052 UNUSED_PARAM(currentInstruction); 1053 UNUSED_PARAM(iter); 1043 1054 #endif 1044 1055 } 1045 1056 1057 void JIT::emit_op_check_traps(const Instruction*) 1058 { 1059 addSlowCase(branchTest8(NonZero, AbsoluteAddress(m_vm->needTrapHandlingAddress()))); 1060 } 1061 1046 1062 void JIT::emit_op_nop(const Instruction*) 1047 1063 { … … 1058 1074 } 1059 1075 1060 void JIT::emit_op_enter(const Instruction*) 1061 { 1062 // Even though JIT doesn't use them, we initialize our constant 1063 // registers to zap stale pointers, to avoid unnecessarily prolonging 1064 // object lifetime and increasing GC pressure. 1065 size_t count = m_codeBlock->numVars(); 1066 for (size_t i = CodeBlock::llintBaselineCalleeSaveSpaceAsVirtualRegisters(); i < count; ++i) 1067 emitInitRegister(virtualRegisterForLocal(i).offset()); 1068 1069 emitWriteBarrier(m_codeBlock); 1070 1071 // Check traps. 1072 addSlowCase(branchTest8(NonZero, AbsoluteAddress(m_vm->needTrapHandlingAddress()))); 1073 1074 #if ENABLE(DFG_JIT) 1075 if (canBeOptimized()) 1076 addSlowCase(branchAdd32(PositiveOrZero, TrustedImm32(Options::executionCounterIncrementForEntry()), AbsoluteAddress(m_codeBlock->addressOfJITExecuteCounter()))); 1077 #endif 1078 } 1079 1080 void JIT::emitSlow_op_enter(const Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) 1081 { 1082 linkSlowCase(iter); 1076 void JIT::emitSlow_op_check_traps(const Instruction*, Vector<SlowCaseEntry>::iterator& iter) 1077 { 1078 linkAllSlowCases(iter); 1079 1083 1080 callOperation(operationHandleTraps); 1084 #if ENABLE(DFG_JIT)1085 if (canBeOptimized()) {1086 emitJumpSlowToHot(branchAdd32(Signed, TrustedImm32(Options::executionCounterIncrementForEntry()), AbsoluteAddress(m_codeBlock->addressOfJITExecuteCounter())), currentInstruction->size());1087 linkSlowCase(iter);1088 1089 ASSERT(!m_bytecodeOffset);1090 1091 copyCalleeSavesFromFrameOrRegisterToEntryFrameCalleeSavesBuffer(vm().topEntryFrame);1092 1093 callOperation(operationOptimize, m_bytecodeOffset);1094 emitJumpSlowToHot(branchTestPtr(Zero, returnValueGPR), currentInstruction->size());1095 farJump(returnValueGPR, GPRInfo::callFrameRegister);1096 }1097 #else1098 UNUSED_PARAM(currentInstruction);1099 #endif1100 1081 } 1101 1082 -
trunk/Source/JavaScriptCore/jit/JITOpcodes32_64.cpp
r249372 r249523 1003 1003 } 1004 1004 1005 1006 void JIT::emit_op_enter(const Instruction* currentInstruction) 1007 { 1008 emitEnterOptimizationCheck(); 1009 1010 // Even though JIT code doesn't use them, we initialize our constant 1011 // registers to zap stale pointers, to avoid unnecessarily prolonging 1012 // object lifetime and increasing GC pressure. 1013 for (int i = CodeBlock::llintBaselineCalleeSaveSpaceAsVirtualRegisters(); i < m_codeBlock->numVars(); ++i) 1014 emitStore(virtualRegisterForLocal(i).offset(), jsUndefined()); 1015 1016 JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_enter); 1017 slowPathCall.call(); 1018 } 1019 1005 1020 void JIT::emit_op_get_scope(const Instruction* currentInstruction) 1006 1021 { -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
r249509 r249523 1674 1674 1675 1675 llintOp(op_loop_hint, OpLoopHint, macro (unused, unused, dispatch) 1676 # CheckTraps. 1676 checkSwitchToJITForLoop() 1677 dispatch() 1678 end) 1679 1680 1681 llintOp(op_check_traps, OpCheckTraps, macro (unused, unused, dispatch) 1677 1682 loadp CodeBlock[cfr], t1 1678 1683 loadp CodeBlock::m_vm[t1], t1 1679 btbnz VM::m_traps + VMTraps::m_needTrapHandling[t1], .handleTraps 1684 loadb VM::m_traps+VMTraps::m_needTrapHandling[t1], t0 1685 btpnz t0, .handleTraps 1680 1686 .afterHandlingTraps: 1681 checkSwitchToJITForLoop()1682 1687 dispatch() 1683 1688 .handleTraps: 1684 callTrapHandler( _llint_throw_from_slow_path_trampoline)1689 callTrapHandler(.throwHandler) 1685 1690 jmp .afterHandlingTraps 1691 .throwHandler: 1692 jmp _llint_throw_from_slow_path_trampoline 1686 1693 end) 1687 1694 -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter32_64.asm
r249509 r249523 702 702 traceExecution() 703 703 checkStackPointerAlignment(t2, 0xdead00e1) 704 loadp CodeBlock[cfr], t 1 // t1<CodeBlock> = cfr.CodeBlock705 loadi CodeBlock::m_numVars[t 1], t2 // t2<size_t> = t1<CodeBlock>.m_numVars704 loadp CodeBlock[cfr], t2 // t2<CodeBlock> = cfr.CodeBlock 705 loadi CodeBlock::m_numVars[t2], t2 // t2<size_t> = t2<CodeBlock>.m_numVars 706 706 subi CalleeSaveSpaceAsVirtualRegisters, t2 707 707 move cfr, t3 … … 709 709 btiz t2, .opEnterDone 710 710 move UndefinedTag, t0 711 move 0, t1 711 712 negi t2 712 713 .opEnterLoop: 713 714 storei t0, TagOffset[t3, t2, 8] 714 storei 0, PayloadOffset[t3, t2, 8]715 storei t1, PayloadOffset[t3, t2, 8] 715 716 addi 1, t2 716 717 btinz t2, .opEnterLoop 717 718 .opEnterDone: 718 writeBarrierOnCellWithReload(t1, macro () 719 loadp CodeBlock[cfr], t1 # Reload CodeBlock 720 end) 721 # Checking traps. 722 loadp CodeBlock::m_vm[t1], t1 723 btpnz VM::m_traps + VMTraps::m_needTrapHandling[t1], .handleTraps 724 .afterHandlingTraps: 719 callSlowPath(_slow_path_enter) 725 720 dispatchOp(narrow, op_enter) 726 .handleTraps: 727 callTrapHandler(_llint_throw_from_slow_path_trampoline) 728 jmp .afterHandlingTraps 721 729 722 730 723 llintOpWithProfile(op_get_argument, OpGetArgument, macro (size, get, dispatch, return) -
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter64.asm
r249509 r249523 690 690 traceExecution() 691 691 checkStackPointerAlignment(t2, 0xdead00e1) 692 loadp CodeBlock[cfr], t 3 // t3<CodeBlock> = cfr.CodeBlock693 loadi CodeBlock::m_numVars[t 3], t2 // t2<size_t> = t3<CodeBlock>.m_numVars692 loadp CodeBlock[cfr], t2 // t2<CodeBlock> = cfr.CodeBlock 693 loadi CodeBlock::m_numVars[t2], t2 // t2<size_t> = t2<CodeBlock>.m_numVars 694 694 subq CalleeSaveSpaceAsVirtualRegisters, t2 695 695 move cfr, t1 … … 704 704 btqnz t2, .opEnterLoop 705 705 .opEnterDone: 706 writeBarrierOnCellWithReload(t3, macro () 707 loadp CodeBlock[cfr], t3 # Reload CodeBlock 708 end) 709 loadp CodeBlock::m_vm[t3], t1 710 btbnz VM::m_traps + VMTraps::m_needTrapHandling[t1], .handleTraps 711 .afterHandlingTraps: 706 callSlowPath(_slow_path_enter) 712 707 dispatchOp(narrow, op_enter) 713 .handleTraps: 714 callTrapHandler(_llint_throw_from_slow_path_trampoline) 715 jmp .afterHandlingTraps 708 716 709 717 710 llintOpWithProfile(op_get_argument, OpGetArgument, macro (size, get, dispatch, return) -
trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.cpp
r249509 r249523 933 933 } 934 934 935 SLOW_PATH_DECL(slow_path_enter) 936 { 937 BEGIN(); 938 CodeBlock* codeBlock = exec->codeBlock(); 939 Heap::heap(codeBlock)->writeBarrier(codeBlock); 940 END(); 941 } 942 935 943 SLOW_PATH_DECL(slow_path_get_enumerable_length) 936 944 { -
trunk/Source/JavaScriptCore/runtime/CommonSlowPaths.h
r249509 r249523 324 324 SLOW_PATH_HIDDEN_DECL(slow_path_create_cloned_arguments); 325 325 SLOW_PATH_HIDDEN_DECL(slow_path_create_this); 326 SLOW_PATH_HIDDEN_DECL(slow_path_enter); 326 327 SLOW_PATH_HIDDEN_DECL(slow_path_get_callee); 327 328 SLOW_PATH_HIDDEN_DECL(slow_path_to_this);
Note: See TracChangeset
for help on using the changeset viewer.