Source/JavaScriptCore/ChangeLog

 12017-08-11 Keith Miller <keith_miller@apple.com>
 2
 3 Add testing tool to lie to the DFG about profiles
 4 https://bugs.webkit.org/show_bug.cgi?id=175487
 5
 6 Reviewed by NOBODY (OOPS!).
 7
 8 This patch adds a new bytecode identity_with_profile that lets
 9 us lie to the DFG about what profiles it has seen as the input to
 10 another bytecode. Previously, there was no reliable way to force
 11 a given profile when we tired up.
 12
 13 * bytecode/BytecodeDumper.cpp:
 14 (JSC::BytecodeDumper<Block>::dumpBytecode):
 15 * bytecode/BytecodeIntrinsicRegistry.h:
 16 * bytecode/BytecodeList.json:
 17 * bytecode/BytecodeUseDef.h:
 18 (JSC::computeUsesForBytecodeOffset):
 19 (JSC::computeDefsForBytecodeOffset):
 20 * bytecode/SpeculatedType.cpp:
 21 (JSC::speculationFromString):
 22 * bytecode/SpeculatedType.h:
 23 * bytecompiler/BytecodeGenerator.cpp:
 24 (JSC::BytecodeGenerator::emitIdWithProfile):
 25 * bytecompiler/BytecodeGenerator.h:
 26 * bytecompiler/NodesCodegen.cpp:
 27 (JSC::BytecodeIntrinsicNode::emit_intrinsic_idWithProfile):
 28 * dfg/DFGAbstractInterpreterInlines.h:
 29 (JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
 30 * dfg/DFGByteCodeParser.cpp:
 31 (JSC::DFG::ByteCodeParser::parseBlock):
 32 * dfg/DFGCapabilities.cpp:
 33 (JSC::DFG::capabilityLevel):
 34 * dfg/DFGClobberize.h:
 35 (JSC::DFG::clobberize):
 36 * dfg/DFGDoesGC.cpp:
 37 (JSC::DFG::doesGC):
 38 * dfg/DFGFixupPhase.cpp:
 39 (JSC::DFG::FixupPhase::fixupNode):
 40 * dfg/DFGMayExit.cpp:
 41 * dfg/DFGNode.h:
 42 (JSC::DFG::Node::getForcedPrediction):
 43 * dfg/DFGNodeType.h:
 44 * dfg/DFGPredictionPropagationPhase.cpp:
 45 * dfg/DFGSafeToExecute.h:
 46 (JSC::DFG::safeToExecute):
 47 * dfg/DFGSpeculativeJIT64.cpp:
 48 (JSC::DFG::SpeculativeJIT::compile):
 49 * dfg/DFGValidate.cpp:
 50 * jit/JIT.cpp:
 51 (JSC::JIT::privateCompileMainPass):
 52 * jit/JIT.h:
 53 * jit/JITOpcodes.cpp:
 54 (JSC::JIT::emit_op_identity_with_profile):
 55 * jit/JITOpcodes32_64.cpp:
 56 (JSC::JIT::emit_identity_with_profile):
 57 * llint/LowLevelInterpreter.asm:
 58
1592017-08-11 Filip Pizlo <fpizlo@apple.com>
260
361 Unreviewed, add a FIXME.

Source/JavaScriptCore/bytecode/BytecodeDumper.cpp

@@void BytecodeDumper<Block>::dumpBytecode(PrintStream& out, const typename Block:
15691569 out.printf("%s, %d", registerName(condition).data(), line);
15701570 break;
15711571 }
 1572 case op_identity_with_profile: {
 1573 int r0 = (++it)->u.operand;
 1574 ++it; // Profile top half
 1575 ++it; // Profile bottom half
 1576 printLocationAndOp(out, location, it, "identity_with_profile");
 1577 out.printf("%s", registerName(r0).data());
 1578 break;
 1579 }
15721580 case op_unreachable: {
15731581 printLocationAndOp(out, location, it, "unreachable");
15741582 break;

Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h

@@class Identifier;
4141 macro(argument) \
4242 macro(argumentCount) \
4343 macro(assert) \
 44 macro(idWithProfile) \
4445 macro(isObject) \
4546 macro(isJSArray) \
4647 macro(isProxyObject) \

Source/JavaScriptCore/bytecode/BytecodeList.json

5151 { "name" : "op_bitxor", "length" : 5 },
5252 { "name" : "op_bitor", "length" : 5 },
5353 { "name" : "op_overrides_has_instance", "length" : 4 },
 54 { "name" : "op_identity_with_profile", "length" : 4 },
5455 { "name" : "op_instanceof", "length" : 4 },
5556 { "name" : "op_instanceof_custom", "length" : 5 },
5657 { "name" : "op_typeof", "length" : 3 },

Source/JavaScriptCore/bytecode/BytecodeUseDef.h

@@void computeUsesForBytecodeOffset(Block* codeBlock, OpcodeID opcodeID, Instructi
6060 case op_get_scope:
6161 case op_to_this:
6262 case op_check_tdz:
 63 case op_identity_with_profile:
6364 case op_profile_type:
6465 case op_throw:
6566 case op_end:

@@void computeDefsForBytecodeOffset(Block* codeBlock, OpcodeID opcodeID, Instructi
423424 case op_instanceof_custom:
424425 case op_get_by_val:
425426 case op_typeof:
 427 case op_identity_with_profile:
426428 case op_is_empty:
427429 case op_is_undefined:
428430 case op_is_boolean:

Source/JavaScriptCore/bytecode/SpeculatedType.cpp

@@SpeculatedType typeOfDoubleUnaryOp(SpeculatedType value)
659659 return polluteDouble(value);
660660}
661661
 662SpeculatedType speculationFromString(const char* speculation)
 663{
 664 if (!strncmp(speculation, "SpecNone", strlen("SpecNone")))
 665 return SpecNone;
 666 if (!strncmp(speculation, "SpecFinalObject", strlen("SpecFinalObject")))
 667 return SpecFinalObject;
 668 if (!strncmp(speculation, "SpecArray", strlen("SpecArray")))
 669 return SpecArray;
 670 if (!strncmp(speculation, "SpecFunction", strlen("SpecFunction")))
 671 return SpecFunction;
 672 if (!strncmp(speculation, "SpecInt8Array", strlen("SpecInt8Array")))
 673 return SpecInt8Array;
 674 if (!strncmp(speculation, "SpecInt16Array", strlen("SpecInt16Array")))
 675 return SpecInt16Array;
 676 if (!strncmp(speculation, "SpecInt32Array", strlen("SpecInt32Array")))
 677 return SpecInt32Array;
 678 if (!strncmp(speculation, "SpecUint8Array", strlen("SpecUint8Array")))
 679 return SpecUint8Array;
 680 if (!strncmp(speculation, "SpecUint8ClampedArray", strlen("SpecUint8ClampedArray")))
 681 return SpecUint8ClampedArray;
 682 if (!strncmp(speculation, "SpecUint16Array", strlen("SpecUint16Array")))
 683 return SpecUint16Array;
 684 if (!strncmp(speculation, "SpecUint32Array", strlen("SpecUint32Array")))
 685 return SpecUint32Array;
 686 if (!strncmp(speculation, "SpecFloat32Array", strlen("SpecFloat32Array")))
 687 return SpecFloat32Array;
 688 if (!strncmp(speculation, "SpecFloat64Array", strlen("SpecFloat64Array")))
 689 return SpecFloat64Array;
 690 if (!strncmp(speculation, "SpecTypedArrayView", strlen("SpecTypedArrayView")))
 691 return SpecTypedArrayView;
 692 if (!strncmp(speculation, "SpecDirectArguments", strlen("SpecDirectArguments")))
 693 return SpecDirectArguments;
 694 if (!strncmp(speculation, "SpecScopedArguments", strlen("SpecScopedArguments")))
 695 return SpecScopedArguments;
 696 if (!strncmp(speculation, "SpecStringObject", strlen("SpecStringObject")))
 697 return SpecStringObject;
 698 if (!strncmp(speculation, "SpecRegExpObject", strlen("SpecRegExpObject")))
 699 return SpecRegExpObject;
 700 if (!strncmp(speculation, "SpecMapObject", strlen("SpecMapObject")))
 701 return SpecMapObject;
 702 if (!strncmp(speculation, "SpecSetObject", strlen("SpecSetObject")))
 703 return SpecSetObject;
 704 if (!strncmp(speculation, "SpecProxyObject", strlen("SpecProxyObject")))
 705 return SpecProxyObject;
 706 if (!strncmp(speculation, "SpecDerivedArray", strlen("SpecDerivedArray")))
 707 return SpecDerivedArray;
 708 if (!strncmp(speculation, "SpecObjectOther", strlen("SpecObjectOther")))
 709 return SpecObjectOther;
 710 if (!strncmp(speculation, "SpecObject", strlen("SpecObject")))
 711 return SpecObject;
 712 if (!strncmp(speculation, "SpecStringIdent", strlen("SpecStringIdent")))
 713 return SpecStringIdent;
 714 if (!strncmp(speculation, "SpecStringVar", strlen("SpecStringVar")))
 715 return SpecStringVar;
 716 if (!strncmp(speculation, "SpecString", strlen("SpecString")))
 717 return SpecString;
 718 if (!strncmp(speculation, "SpecSymbol", strlen("SpecSymbol")))
 719 return SpecSymbol;
 720 if (!strncmp(speculation, "SpecCellOther", strlen("SpecCellOther")))
 721 return SpecCellOther;
 722 if (!strncmp(speculation, "SpecCell", strlen("SpecCell")))
 723 return SpecCell;
 724 if (!strncmp(speculation, "SpecBoolInt32", strlen("SpecBoolInt32")))
 725 return SpecBoolInt32;
 726 if (!strncmp(speculation, "SpecNonBoolInt32", strlen("SpecNonBoolInt32")))
 727 return SpecNonBoolInt32;
 728 if (!strncmp(speculation, "SpecInt32Only", strlen("SpecInt32Only")))
 729 return SpecInt32Only;
 730 if (!strncmp(speculation, "SpecInt52Only", strlen("SpecInt52Only")))
 731 return SpecInt52Only;
 732 if (!strncmp(speculation, "SpecAnyInt", strlen("SpecAnyInt")))
 733 return SpecAnyInt;
 734 if (!strncmp(speculation, "SpecAnyIntAsDouble", strlen("SpecAnyIntAsDouble")))
 735 return SpecAnyIntAsDouble;
 736 if (!strncmp(speculation, "SpecNonIntAsDouble", strlen("SpecNonIntAsDouble")))
 737 return SpecNonIntAsDouble;
 738 if (!strncmp(speculation, "SpecDoubleReal", strlen("SpecDoubleReal")))
 739 return SpecDoubleReal;
 740 if (!strncmp(speculation, "SpecDoublePureNaN", strlen("SpecDoublePureNaN")))
 741 return SpecDoublePureNaN;
 742 if (!strncmp(speculation, "SpecDoubleImpureNaN", strlen("SpecDoubleImpureNaN")))
 743 return SpecDoubleImpureNaN;
 744 if (!strncmp(speculation, "SpecDoubleNaN", strlen("SpecDoubleNaN")))
 745 return SpecDoubleNaN;
 746 if (!strncmp(speculation, "SpecBytecodeDouble", strlen("SpecBytecodeDouble")))
 747 return SpecBytecodeDouble;
 748 if (!strncmp(speculation, "SpecFullDouble", strlen("SpecFullDouble")))
 749 return SpecFullDouble;
 750 if (!strncmp(speculation, "SpecBytecodeRealNumber", strlen("SpecBytecodeRealNumber")))
 751 return SpecBytecodeRealNumber;
 752 if (!strncmp(speculation, "SpecFullRealNumber", strlen("SpecFullRealNumber")))
 753 return SpecFullRealNumber;
 754 if (!strncmp(speculation, "SpecBytecodeNumber", strlen("SpecBytecodeNumber")))
 755 return SpecBytecodeNumber;
 756 if (!strncmp(speculation, "SpecFullNumber", strlen("SpecFullNumber")))
 757 return SpecFullNumber;
 758 if (!strncmp(speculation, "SpecBoolean", strlen("SpecBoolean")))
 759 return SpecBoolean;
 760 if (!strncmp(speculation, "SpecOther", strlen("SpecOther")))
 761 return SpecOther;
 762 if (!strncmp(speculation, "SpecMisc", strlen("SpecMisc")))
 763 return SpecMisc;
 764 if (!strncmp(speculation, "SpecHeapTop", strlen("SpecHeapTop")))
 765 return SpecHeapTop;
 766 if (!strncmp(speculation, "SpecPrimitive", strlen("SpecPrimitive")))
 767 return SpecPrimitive;
 768 if (!strncmp(speculation, "SpecEmpty", strlen("SpecEmpty")))
 769 return SpecEmpty;
 770 if (!strncmp(speculation, "SpecBytecodeTop", strlen("SpecBytecodeTop")))
 771 return SpecBytecodeTop;
 772 if (!strncmp(speculation, "SpecFullTop", strlen("SpecFullTop")))
 773 return SpecFullTop;
 774 if (!strncmp(speculation, "SpecCellCheck", strlen("SpecCellCheck")))
 775 return SpecCellCheck;
 776 RELEASE_ASSERT_NOT_REACHED();
 777}
 778
662779} // namespace JSC
663780

Source/JavaScriptCore/bytecode/SpeculatedType.h

@@SpeculatedType typeOfDoublePow(SpeculatedType, SpeculatedType);
498498SpeculatedType typeOfDoubleBinaryOp(SpeculatedType, SpeculatedType);
499499SpeculatedType typeOfDoubleUnaryOp(SpeculatedType);
500500
 501// This is mostly for debugging so we can fill profiles from strings.
 502SpeculatedType speculationFromString(const char*);
 503
501504} // namespace JSC

Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp

@@RegisterID* BytecodeGenerator::emitAssert(RegisterID* condition, int line)
29742974 return condition;
29752975}
29762976
 2977RegisterID* BytecodeGenerator::emitIdWithProfile(RegisterID* src, SpeculatedType profile)
 2978{
 2979 emitOpcode(op_identity_with_profile);
 2980 instructions().append(src->index());
 2981 instructions().append(static_cast<uint32_t>(profile >> 32));
 2982 instructions().append(static_cast<uint32_t>(profile));
 2983 return src;
 2984}
 2985
29772986void BytecodeGenerator::emitUnreachable()
29782987{
29792988 emitOpcode(op_unreachable);

Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h

@@namespace JSC {
686686 RegisterID* emitPutByIndex(RegisterID* base, unsigned index, RegisterID* value);
687687
688688 RegisterID* emitAssert(RegisterID* condition, int line);
 689 RegisterID* emitIdWithProfile(RegisterID* src, SpeculatedType profile);
689690 void emitUnreachable();
690691
691692 void emitPutGetterById(RegisterID* base, const Identifier& property, unsigned propertyDescriptorOptions, RegisterID* getter);

Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

@@RegisterID* BytecodeIntrinsicNode::emit_intrinsic_toString(BytecodeGenerator& ge
10231023
10241024 return generator.moveToDestinationIfNeeded(dst, generator.emitToString(generator.tempDestination(dst), src.get()));
10251025}
 1026
 1027RegisterID* BytecodeIntrinsicNode::emit_intrinsic_idWithProfile(BytecodeGenerator& generator, RegisterID* dst)
 1028{
 1029
 1030 ArgumentListNode* node = m_args->m_listNode;
 1031 RefPtr<RegisterID> idValue = generator.emitNode(node);
 1032 SpeculatedType speculation = SpecNone;
 1033 while (node->m_next) {
 1034 node = node->m_next;
 1035 ASSERT(node->m_expr->isString());
 1036 const Identifier& ident = static_cast<StringNode*>(node->m_expr)->value();
 1037 speculation |= speculationFromString(ident.utf8().data());
 1038 }
 1039
 1040 return generator.moveToDestinationIfNeeded(dst, generator.emitIdWithProfile(idValue.get(), speculation));
 1041}
10261042
10271043RegisterID* BytecodeIntrinsicNode::emit_intrinsic_isJSArray(JSC::BytecodeGenerator& generator, JSC::RegisterID* dst)
10281044{

Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h

@@bool AbstractInterpreter<AbstractStateType>::executeEffects(unsigned clobberLimi
199199 }
200200 break;
201201 }
202 
 202
 203 case IdentityWithProfile: {
 204 forNode(node) = forNode(node->child1());
 205 if (m_graph.m_planStage < PlanStage::AfterFixup)
 206 break;
 207 FALLTHROUGH;
 208 }
 209
203210 case Identity: {
204211 forNode(node) = forNode(node->child1());
205212 if (forNode(node).value())

Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp

@@bool ByteCodeParser::parseBlock(unsigned limit)
44594459 NEXT_OPCODE(op_overrides_has_instance);
44604460 }
44614461
 4462 case op_identity_with_profile: {
 4463 Node* src = get(VirtualRegister(currentInstruction[1].u.operand));
 4464 SpeculatedType speculation = static_cast<SpeculatedType>(currentInstruction[2].u.operand) << 32 | static_cast<SpeculatedType>(currentInstruction[3].u.operand);
 4465 set(VirtualRegister(currentInstruction[1].u.operand), addToGraph(IdentityWithProfile, OpInfo(speculation), src));
 4466 NEXT_OPCODE(op_identity_with_profile);
 4467 }
 4468
44624469 case op_instanceof: {
44634470 Node* value = get(VirtualRegister(currentInstruction[2].u.operand));
44644471 Node* prototype = get(VirtualRegister(currentInstruction[3].u.operand));

Source/JavaScriptCore/dfg/DFGCapabilities.cpp

@@CapabilityLevel capabilityLevel(OpcodeID opcodeID, CodeBlock* codeBlock, Instruc
135135 case op_profile_control_flow:
136136 case op_mov:
137137 case op_overrides_has_instance:
 138 case op_identity_with_profile:
138139 case op_instanceof:
139140 case op_instanceof_custom:
140141 case op_is_empty:

Source/JavaScriptCore/dfg/DFGClobberize.h

@@void clobberize(Graph& graph, Node* node, const ReadFunctor& read, const WriteFu
137137 return;
138138
139139 case Identity:
 140 case IdentityWithProfile:
140141 case Phantom:
141142 case Check:
142143 case ExtractOSREntryLocal:

Source/JavaScriptCore/dfg/DFGDoesGC.cpp

@@bool doesGC(Graph& graph, Node* node)
4949 case Int52Constant:
5050 case LazyJSConstant:
5151 case Identity:
 52 case IdentityWithProfile:
5253 case GetCallee:
5354 case GetArgumentCountIncludingThis:
5455 case GetRestLength:

Source/JavaScriptCore/dfg/DFGFixupPhase.cpp

@@private:
15731573 // fixup rules for them.
15741574 DFG_CRASH(m_graph, node, "Unexpected node during fixup");
15751575 break;
1576 
 1576
15771577 case PutGlobalVariable: {
15781578 fixEdge<CellUse>(node->child1());
15791579 speculateForBarrier(node->child2());

@@private:
19611961 case NewRegexp:
19621962 case DeleteById:
19631963 case DeleteByVal:
 1964 case IdentityWithProfile:
19641965 case IsTypedArrayView:
19651966 case IsEmpty:
19661967 case IsUndefined:

Source/JavaScriptCore/dfg/DFGMayExit.cpp

@@ExitMode mayExitImpl(Graph& graph, Node* node, StateType& state)
5858 case Phantom:
5959 case Check:
6060 case Identity:
 61 case IdentityWithProfile:
6162 case GetLocal:
6263 case LoopHint:
6364 case Phi:

Source/JavaScriptCore/dfg/DFGNode.h

@@public:
15351535 ASSERT(hasHeapPrediction());
15361536 m_opInfo2 = prediction;
15371537 }
 1538
 1539 SpeculatedType getForcedPrediction()
 1540 {
 1541 ASSERT(op() == IdentityWithProfile);
 1542 return m_opInfo.as<SpeculatedType>();
 1543 }
15381544
15391545 bool hasCellOperand()
15401546 {

Source/JavaScriptCore/dfg/DFGNodeType.h

@@namespace JSC { namespace DFG {
4242 \
4343 /* Lazy JSValue constant. We don't know the JSValue bits of it yet. */\
4444 macro(LazyJSConstant, NodeResultJS) \
45  \
 45\
4646 /* Marker to indicate that an operation was optimized entirely and all that is left */\
4747 /* is to make one node alias another. CSE will later usually eliminate this node, */\
4848 /* though it may choose not to if it would corrupt predictions (very rare). */\
4949 macro(Identity, NodeResultJS) \
 50 /* Used for debugging to force a profile to appear as anything we want. */ \
 51 macro(IdentityWithProfile, NodeResultJS) \
5052 \
5153 /* Nodes for handling functions (both as call and as construct). */\
5254 macro(ToThis, NodeResultJS) \

Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp

@@private:
987987 break;
988988 }
989989
 990 case IdentityWithProfile: {
 991 setPrediction(m_currentNode->getForcedPrediction());
 992 break;
 993 }
 994
990995 case GetLocal:
991996 case SetLocal:
992997 case UInt32ToNumber:

Source/JavaScriptCore/dfg/DFGSafeToExecute.h

@@bool safeToExecute(AbstractStateType& state, Graph& graph, Node* node)
143143 case Int52Constant:
144144 case LazyJSConstant:
145145 case Identity:
 146 case IdentityWithProfile:
146147 case ToThis:
147148 case CreateThis:
148149 case GetCallee:

Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp

@@void SpeculativeJIT::compile(Node* node)
61166116 case PhantomCreateRest:
61176117 case PhantomSpread:
61186118 case PhantomNewArrayWithSpread:
 6119 case IdentityWithProfile:
61196120 DFG_CRASH(m_jit.graph(), node, "Unexpected node");
61206121 break;
61216122 }

Source/JavaScriptCore/dfg/DFGValidate.cpp

@@public:
222222
223223 switch (node->op()) {
224224 case Identity:
 225 case IdentityWithProfile:
225226 VALIDATE((node), canonicalResultRepresentation(node->result()) == canonicalResultRepresentation(node->child1()->result()));
226227 break;
227228 case SetLocal:

Source/JavaScriptCore/jit/JIT.cpp

@@void JIT::privateCompileMainPass()
289289 DEFINE_OP(op_get_rest_length)
290290 DEFINE_OP(op_check_tdz)
291291 DEFINE_OP(op_assert)
 292 DEFINE_OP(op_identity_with_profile)
292293 DEFINE_OP(op_unreachable)
293294 DEFINE_OP(op_debug)
294295 DEFINE_OP(op_del_by_id)

Source/JavaScriptCore/jit/JIT.h

@@namespace JSC {
488488 void emit_op_get_rest_length(Instruction*);
489489 void emit_op_check_tdz(Instruction*);
490490 void emit_op_assert(Instruction*);
 491 void emit_op_identity_with_profile(Instruction*);
491492 void emit_op_unreachable(Instruction*);
492493 void emit_op_debug(Instruction*);
493494 void emit_op_del_by_id(Instruction*);

Source/JavaScriptCore/jit/JITOpcodes.cpp

@@void JIT::emit_op_assert(Instruction* currentInstruction)
559559 slowPathCall.call();
560560}
561561
 562void JIT::emit_op_identity_with_profile(Instruction*)
 563{
 564 // We don't need to do anything here...
 565}
 566
562567void JIT::emit_op_create_lexical_environment(Instruction* currentInstruction)
563568{
564569 JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_create_lexical_environment);

Source/JavaScriptCore/jit/JITOpcodes32_64.cpp

@@void JIT::emit_op_assert(Instruction* currentInstruction)
859859 slowPathCall.call();
860860}
861861
 862void JIT::emit_identity_with_profile(Instruction*)
 863{
 864 // We don't need to do anything here...
 865}
 866
862867void JIT::emit_op_create_lexical_environment(Instruction* currentInstruction)
863868{
864869 JITSlowPathCall slowPathCall(this, currentInstruction, slow_path_create_lexical_environment);

Source/JavaScriptCore/llint/LowLevelInterpreter.asm

@@_llint_op_assert:
17231723 dispatch(constexpr op_assert_length)
17241724
17251725
 1726_llint_op_identity_with_profile:
 1727 traceExecution()
 1728 dispatch(constexpr op_identity_with_profile)
 1729
 1730
17261731_llint_op_unreachable:
17271732 traceExecution()
17281733 callOpcodeSlowPath(_slow_path_unreachable)