Backed out changeset 7db6a99ec546 (bug 887016)
authorTooru Fujisawa <arai_a@mac.com>
Mon, 28 Mar 2016 06:49:53 +0900
changeset 290647 d44ccce05064d63cd96efd511694bc1a28d94646
parent 290646 9cb8165a2a66701fc5550b19ba29b3fa3ffd4714
child 290648 5676c7b622c71064d62f8e3a57c7d35d1043f9bc
push id19656
push usergwagner@mozilla.com
push dateMon, 04 Apr 2016 13:43:23 +0000
treeherderb2g-inbound@e99061fde28a [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs887016
milestone48.0a1
backs out7db6a99ec5462372a107b3e346aa8c1ecffaa4ae
Backed out changeset 7db6a99ec546 (bug 887016)
js/src/builtin/RegExp.cpp
js/src/builtin/RegExp.h
js/src/jit/CodeGenerator.cpp
js/src/jit/CodeGenerator.h
js/src/jit/InlinableNatives.h
js/src/jit/Ion.cpp
js/src/jit/IonAnalysis.cpp
js/src/jit/IonBuilder.h
js/src/jit/JitCompartment.h
js/src/jit/Lowering.cpp
js/src/jit/Lowering.h
js/src/jit/MCallOptimize.cpp
js/src/jit/MIR.h
js/src/jit/MOpcodes.h
js/src/jit/Recover.cpp
js/src/jit/Recover.h
js/src/jit/shared/LIR-shared.h
js/src/jit/shared/LOpcodes-shared.h
js/src/vm/SelfHosting.cpp
--- a/js/src/builtin/RegExp.cpp
+++ b/js/src/builtin/RegExp.cpp
@@ -96,27 +96,16 @@ js::CreateRegExpMatchResult(JSContext* c
     MOZ_ASSERT(test == arr->getSlot(1));
 #endif
 
     /* Step 29. */
     rval.setObject(*arr);
     return true;
 }
 
-static int32_t
-CreateRegExpSearchResult(JSContext* cx, const MatchPairs& matches)
-{
-    /* Fit the start and limit of match into a int32_t. */
-    uint32_t position = matches[0].start;
-    uint32_t lastIndex = matches[0].limit;
-    MOZ_ASSERT(position < 0x8000);
-    MOZ_ASSERT(lastIndex < 0x8000);
-    return position | (lastIndex << 15);
-}
-
 /* ES6 21.2.5.2.2 steps 3, 14-17, except 15.a.i-ii, 15.c.i.1-2. */
 static RegExpRunStatus
 ExecuteRegExpImpl(JSContext* cx, RegExpStatics* res, RegExpShared& re, HandleLinearString input,
                   size_t searchIndex, bool sticky, MatchPairs* matches, size_t* endIndex)
 {
     RegExpRunStatus status = re.execute(cx, input, searchIndex, sticky, matches, endIndex);
 
     /* Out of spec: Update RegExpStatics. */
@@ -924,115 +913,33 @@ js::RegExpMatcher(JSContext* cx, unsigne
     if (!ToInt32(cx, lastIndexVal, &lastIndex))
         return false;
 
     /* Steps 3, 11-29, except 15.a.i-ii, 15.c.i.1-2, 18. */
     return RegExpMatcherImpl(cx, regexp, string, lastIndex, sticky,
                              UpdateRegExpStatics, args.rval());
 }
 
-/*
- * Separate interface for use by IonMonkey.
- * This code cannot re-enter Ion code.
- */
+/* Separate interface for use by IonMonkey.
+ * This code cannot re-enter Ion code. */
 bool
 js::RegExpMatcherRaw(JSContext* cx, HandleObject regexp, HandleString input,
                      uint32_t lastIndex, bool sticky,
                      MatchPairs* maybeMatches, MutableHandleValue output)
 {
     MOZ_ASSERT(lastIndex <= INT32_MAX);
 
     // The MatchPairs will always be passed in, but RegExp execution was
     // successful only if the pairs have actually been filled in.
     if (maybeMatches && maybeMatches->pairsRaw()[0] >= 0)
         return CreateRegExpMatchResult(cx, input, *maybeMatches, output);
     return RegExpMatcherImpl(cx, regexp, input, lastIndex, sticky,
                              UpdateRegExpStatics, output);
 }
 
-/*
- * ES6 21.2.5.2.2 steps 3, 11-29, except 15.a.i-ii, 15.c.i.1-2, 18.
- * This code is inlined in CodeGenerator.cpp generateRegExpSearcherStub,
- * changes to this code need to get reflected in there too.
- */
-static bool
-RegExpSearcherImpl(JSContext* cx, HandleObject regexp, HandleString string,
-                  int32_t lastIndex, bool sticky,
-                  RegExpStaticsUpdate staticsUpdate, int32_t* result)
-{
-    /* Execute regular expression and gather matches. */
-    ScopedMatchPairs matches(&cx->tempLifoAlloc());
-
-    /* Steps 3, 11-17, except 15.a.i-ii, 15.c.i.1-2. */
-    RegExpRunStatus status = ExecuteRegExp(cx, regexp, string, lastIndex, sticky,
-                                           &matches, nullptr, staticsUpdate);
-    if (status == RegExpRunStatus_Error)
-        return false;
-
-    /* Steps 15.a, 15.c. */
-    if (status == RegExpRunStatus_Success_NotFound) {
-        *result = -1;
-        return true;
-    }
-
-    /* Steps 19-29 */
-    *result = CreateRegExpSearchResult(cx, matches);
-    return true;
-}
-
-/* ES6 21.2.5.2.2 steps 3, 11-29, except 15.a.i-ii, 15.c.i.1-2, 18. */
-bool
-js::RegExpSearcher(JSContext* cx, unsigned argc, Value* vp)
-{
-    CallArgs args = CallArgsFromVp(argc, vp);
-    MOZ_ASSERT(args.length() == 4);
-    MOZ_ASSERT(IsRegExpObject(args[0]));
-    MOZ_ASSERT(args[1].isString());
-    MOZ_ASSERT(args[2].isNumber());
-    MOZ_ASSERT(args[3].isBoolean());
-
-    RootedObject regexp(cx, &args[0].toObject());
-    RootedString string(cx, args[1].toString());
-    RootedValue lastIndexVal(cx, args[2]);
-    bool sticky = ToBoolean(args[3]);
-
-    int32_t lastIndex = 0;
-    if (!ToInt32(cx, lastIndexVal, &lastIndex))
-        return false;
-
-    /* Steps 3, 11-29, except 15.a.i-ii, 15.c.i.1-2, 18. */
-    int32_t result = 0;
-    if (!RegExpSearcherImpl(cx, regexp, string, lastIndex, sticky, UpdateRegExpStatics, &result))
-        return false;
-
-    args.rval().setInt32(result);
-    return true;
-}
-
-/*
- * Separate interface for use by IonMonkey.
- * This code cannot re-enter Ion code.
- */
-bool
-js::RegExpSearcherRaw(JSContext* cx, HandleObject regexp, HandleString input,
-                      int32_t lastIndex, bool sticky,
-                      MatchPairs* maybeMatches, int32_t* result)
-{
-    MOZ_ASSERT(lastIndex <= INT32_MAX);
-
-    // The MatchPairs will always be passed in, but RegExp execution was
-    // successful only if the pairs have actually been filled in.
-    if (maybeMatches && maybeMatches->pairsRaw()[0] >= 0) {
-        *result = CreateRegExpSearchResult(cx, *maybeMatches);
-        return true;
-    }
-    return RegExpSearcherImpl(cx, regexp, input, lastIndex, sticky,
-                              UpdateRegExpStatics, result);
-}
-
 bool
 js::regexp_exec_no_statics(JSContext* cx, unsigned argc, Value* vp)
 {
     CallArgs args = CallArgsFromVp(argc, vp);
     MOZ_ASSERT(args.length() == 2);
     MOZ_ASSERT(IsRegExpObject(args[0]));
     MOZ_ASSERT(args[1].isString());
 
@@ -1076,20 +983,18 @@ js::RegExpTester(JSContext* cx, unsigned
         MOZ_ASSERT(endIndex <= INT32_MAX);
         args.rval().setInt32(int32_t(endIndex));
     } else {
         args.rval().setInt32(-1);
     }
     return true;
 }
 
-/*
- * Separate interface for use by IonMonkey.
- * This code cannot re-enter Ion code.
- */
+/* Separate interface for use by IonMonkey.
+ * This code cannot re-enter Ion code. */
 bool
 js::RegExpTesterRaw(JSContext* cx, HandleObject regexp, HandleString input,
                     uint32_t lastIndex, bool sticky, int32_t* endIndex)
 {
     MOZ_ASSERT(lastIndex <= INT32_MAX);
 
     size_t endIndexTmp = 0;
     RegExpRunStatus status = ExecuteRegExp(cx, regexp, input, lastIndex, sticky,
--- a/js/src/builtin/RegExp.h
+++ b/js/src/builtin/RegExp.h
@@ -44,24 +44,16 @@ extern bool
 RegExpMatcher(JSContext* cx, unsigned argc, Value* vp);
 
 extern bool
 RegExpMatcherRaw(JSContext* cx, HandleObject regexp, HandleString input,
                  uint32_t lastIndex, bool sticky,
                  MatchPairs* maybeMatches, MutableHandleValue output);
 
 extern bool
-RegExpSearcher(JSContext* cx, unsigned argc, Value* vp);
-
-extern bool
-RegExpSearcherRaw(JSContext* cx, HandleObject regexp, HandleString input,
-                  int32_t lastIndex, bool sticky,
-                  MatchPairs* maybeMatches, int32_t* result);
-
-extern bool
 RegExpTester(JSContext* cx, unsigned argc, Value* vp);
 
 extern bool
 RegExpTesterRaw(JSContext* cx, HandleObject regexp, HandleString input,
                 uint32_t lastIndex, bool sticky, int32_t* endIndex);
 
 /*
  * The following functions are for use by self-hosted code.
--- a/js/src/jit/CodeGenerator.cpp
+++ b/js/src/jit/CodeGenerator.cpp
@@ -1462,18 +1462,17 @@ static void*
 CreateMatchResultFallbackFunc(JSContext* cx, gc::AllocKind kind, size_t nDynamicSlots)
 {
     return js::Allocate<JSObject, NoGC>(cx, kind, nDynamicSlots, gc::DefaultHeap,
                                         &ArrayObject::class_);
 }
 
 static void
 CreateMatchResultFallback(MacroAssembler& masm, LiveRegisterSet regsToSave,
-                          Register object, Register temp2, Register temp5,
-                          ArrayObject* templateObj, Label* fail)
+                          Register object, Register temp2, Register temp5, ArrayObject* templateObj, Label* fail)
 {
     MOZ_ASSERT(templateObj->group()->clasp() == &ArrayObject::class_);
 
     regsToSave.take(object);
     regsToSave.take(temp2);
     regsToSave.take(temp5);
     masm.PushRegsInMask(regsToSave);
 
@@ -1823,170 +1822,16 @@ CodeGenerator::visitRegExpMatcher(LRegEx
     JitCode* regExpMatcherStub = gen->compartment->jitCompartment()->regExpMatcherStubNoBarrier();
     masm.call(regExpMatcherStub);
     masm.branchTestUndefined(Assembler::Equal, JSReturnOperand, ool->entry());
     masm.bind(ool->rejoin());
 
     masm.freeStack(RegExpReservedStack);
 }
 
-static const int32_t RegExpSearcherResultNotFound = -1;
-static const int32_t RegExpSearcherResultFailed = -2;
-
-JitCode*
-JitCompartment::generateRegExpSearcherStub(JSContext* cx)
-{
-    Register regexp = RegExpTesterRegExpReg;
-    Register input = RegExpTesterStringReg;
-    Register lastIndex = RegExpTesterLastIndexReg;
-    Register sticky = RegExpTesterStickyReg;
-    Register result = ReturnReg;
-
-    // We are free to clobber all registers, as LRegExpSearcher is a call instruction.
-    AllocatableGeneralRegisterSet regs(GeneralRegisterSet::All());
-    regs.take(input);
-    regs.take(regexp);
-    regs.take(lastIndex);
-    regs.take(sticky);
-
-    Register temp1 = regs.takeAny();
-    Register temp2 = regs.takeAny();
-    Register temp3 = regs.takeAny();
-
-    MacroAssembler masm(cx);
-
-    // The InputOutputData is placed above the return address on the stack.
-    size_t inputOutputDataStartOffset = sizeof(void*);
-
-    Label notFound, oolEntry;
-    if (!PrepareAndExecuteRegExp(cx, masm, regexp, input, lastIndex, sticky,
-                                 temp1, temp2, temp3, inputOutputDataStartOffset,
-                                 RegExpShared::Normal, &notFound, &oolEntry))
-    {
-        return nullptr;
-    }
-
-    size_t pairsVectorStartOffset = RegExpPairsVectorStartOffset(inputOutputDataStartOffset);
-    Address stringIndexAddress(masm.getStackPointer(),
-                               pairsVectorStartOffset + offsetof(MatchPair, start));
-    Address stringLimitAddress(masm.getStackPointer(),
-                               pairsVectorStartOffset + offsetof(MatchPair, limit));
-
-    masm.load32(stringIndexAddress, result);
-    masm.load32(stringLimitAddress, input);
-    masm.lshiftPtr(Imm32(15), input);
-    masm.or32(input, result);
-    masm.ret();
-
-    masm.bind(&notFound);
-    masm.move32(Imm32(RegExpSearcherResultNotFound), result);
-    masm.ret();
-
-    masm.bind(&oolEntry);
-    masm.move32(Imm32(RegExpSearcherResultFailed), result);
-    masm.ret();
-
-    Linker linker(masm);
-    AutoFlushICache afc("RegExpSearcherStub");
-    JitCode* code = linker.newCode<CanGC>(cx, OTHER_CODE);
-    if (!code)
-        return nullptr;
-
-#ifdef JS_ION_PERF
-    writePerfSpewerJitCodeProfile(code, "RegExpSearcherStub");
-#endif
-
-    if (cx->zone()->needsIncrementalBarrier())
-        code->togglePreBarriers(true, DontReprotect);
-
-    return code;
-}
-
-class OutOfLineRegExpSearcher : public OutOfLineCodeBase<CodeGenerator>
-{
-    LRegExpSearcher* lir_;
-
-  public:
-    explicit OutOfLineRegExpSearcher(LRegExpSearcher* lir)
-      : lir_(lir)
-    { }
-
-    void accept(CodeGenerator* codegen) {
-        codegen->visitOutOfLineRegExpSearcher(this);
-    }
-
-    LRegExpSearcher* lir() const {
-        return lir_;
-    }
-};
-
-typedef bool (*RegExpSearcherRawFn)(JSContext* cx, HandleObject regexp, HandleString input,
-                                    int32_t lastIndex, bool sticky,
-                                    MatchPairs* pairs, int32_t* result);
-static const VMFunction RegExpSearcherRawInfo = FunctionInfo<RegExpSearcherRawFn>(RegExpSearcherRaw);
-
-void
-CodeGenerator::visitOutOfLineRegExpSearcher(OutOfLineRegExpSearcher* ool)
-{
-    LRegExpSearcher* lir = ool->lir();
-    Register sticky = ToRegister(lir->sticky());
-    Register lastIndex = ToRegister(lir->lastIndex());
-    Register input = ToRegister(lir->string());
-    Register regexp = ToRegister(lir->regexp());
-
-    AllocatableGeneralRegisterSet regs(GeneralRegisterSet::All());
-    regs.take(sticky);
-    regs.take(lastIndex);
-    regs.take(input);
-    regs.take(regexp);
-    Register temp = regs.takeAny();
-
-    masm.computeEffectiveAddress(Address(masm.getStackPointer(),
-        sizeof(irregexp::InputOutputData)), temp);
-
-    pushArg(temp);
-    pushArg(sticky);
-    pushArg(lastIndex);
-    pushArg(input);
-    pushArg(regexp);
-
-    // We are not using oolCallVM because we are in a Call, and that live
-    // registers are already saved by the the register allocator.
-    callVM(RegExpSearcherRawInfo, lir);
-
-    masm.jump(ool->rejoin());
-}
-
-void
-CodeGenerator::visitRegExpSearcher(LRegExpSearcher* lir)
-{
-    MOZ_ASSERT(ToRegister(lir->regexp()) == RegExpTesterRegExpReg);
-    MOZ_ASSERT(ToRegister(lir->string()) == RegExpTesterStringReg);
-    MOZ_ASSERT(ToRegister(lir->lastIndex()) == RegExpTesterLastIndexReg);
-    MOZ_ASSERT(ToRegister(lir->sticky()) == RegExpTesterStickyReg);
-    MOZ_ASSERT(ToRegister(lir->output()) == ReturnReg);
-
-    MOZ_ASSERT(RegExpTesterRegExpReg != ReturnReg);
-    MOZ_ASSERT(RegExpTesterStringReg != ReturnReg);
-    MOZ_ASSERT(RegExpTesterLastIndexReg != ReturnReg);
-    MOZ_ASSERT(RegExpTesterStickyReg != ReturnReg);
-
-    masm.reserveStack(RegExpReservedStack);
-
-    OutOfLineRegExpSearcher* ool = new(alloc()) OutOfLineRegExpSearcher(lir);
-    addOutOfLineCode(ool, lir->mir());
-
-    JitCode* regExpSearcherStub = gen->compartment->jitCompartment()->regExpSearcherStubNoBarrier();
-    masm.call(regExpSearcherStub);
-    masm.branch32(Assembler::Equal, ReturnReg, Imm32(RegExpSearcherResultFailed), ool->entry());
-    masm.bind(ool->rejoin());
-
-    masm.freeStack(RegExpReservedStack);
-}
-
 static const int32_t RegExpTesterResultNotFound = -1;
 static const int32_t RegExpTesterResultFailed = -2;
 
 JitCode*
 JitCompartment::generateRegExpTesterStub(JSContext* cx)
 {
     Register regexp = RegExpTesterRegExpReg;
     Register input = RegExpTesterStringReg;
--- a/js/src/jit/CodeGenerator.h
+++ b/js/src/jit/CodeGenerator.h
@@ -42,17 +42,16 @@ class OutOfLineUnboxFloatingPoint;
 class OutOfLineStoreElementHole;
 class OutOfLineTypeOfV;
 class OutOfLineUpdateCache;
 class OutOfLineCallPostWriteBarrier;
 class OutOfLineCallPostWriteElementBarrier;
 class OutOfLineIsCallable;
 class OutOfLineIsConstructor;
 class OutOfLineRegExpMatcher;
-class OutOfLineRegExpSearcher;
 class OutOfLineRegExpTester;
 class OutOfLineRegExpPrototypeOptimizable;
 class OutOfLineRegExpInstanceOptimizable;
 class OutOfLineLambdaArrow;
 
 class CodeGenerator : public CodeGeneratorSpecific
 {
     void generateArgumentsChecks(bool bailout = true);
@@ -109,18 +108,16 @@ class CodeGenerator : public CodeGenerat
     void visitDoubleToString(LDoubleToString* lir);
     void visitValueToString(LValueToString* lir);
     void visitValueToObjectOrNull(LValueToObjectOrNull* lir);
     void visitInteger(LInteger* lir);
     void visitInteger64(LInteger64* lir);
     void visitRegExp(LRegExp* lir);
     void visitRegExpMatcher(LRegExpMatcher* lir);
     void visitOutOfLineRegExpMatcher(OutOfLineRegExpMatcher* ool);
-    void visitRegExpSearcher(LRegExpSearcher* lir);
-    void visitOutOfLineRegExpSearcher(OutOfLineRegExpSearcher* ool);
     void visitRegExpTester(LRegExpTester* lir);
     void visitOutOfLineRegExpTester(OutOfLineRegExpTester* ool);
     void visitRegExpPrototypeOptimizable(LRegExpPrototypeOptimizable* lir);
     void visitOutOfLineRegExpPrototypeOptimizable(OutOfLineRegExpPrototypeOptimizable* ool);
     void visitRegExpInstanceOptimizable(LRegExpInstanceOptimizable* lir);
     void visitOutOfLineRegExpInstanceOptimizable(OutOfLineRegExpInstanceOptimizable* ool);
     void visitStringReplace(LStringReplace* lir);
     void emitSharedStub(ICStub::Kind kind, LInstruction* lir);
--- a/js/src/jit/InlinableNatives.h
+++ b/js/src/jit/InlinableNatives.h
@@ -61,17 +61,16 @@
     _(MathASinH)                    \
     _(MathATanH)                    \
     _(MathACosH)                    \
     _(MathSign)                     \
     _(MathTrunc)                    \
     _(MathCbrt)                     \
                                     \
     _(RegExpMatcher)                \
-    _(RegExpSearcher)               \
     _(RegExpTester)                 \
     _(IsRegExpObject)               \
     _(RegExpPrototypeOptimizable)   \
     _(RegExpInstanceOptimizable)    \
                                     \
     _(String)                       \
     _(StringCharCodeAt)             \
     _(StringFromCharCode)           \
--- a/js/src/jit/Ion.cpp
+++ b/js/src/jit/Ion.cpp
@@ -397,17 +397,16 @@ JitRuntime::patchIonBackedges(JSRuntime*
 
 JitCompartment::JitCompartment()
   : stubCodes_(nullptr),
     cacheIRStubCodes_(nullptr),
     baselineGetPropReturnAddr_(nullptr),
     baselineSetPropReturnAddr_(nullptr),
     stringConcatStub_(nullptr),
     regExpMatcherStub_(nullptr),
-    regExpSearcherStub_(nullptr),
     regExpTesterStub_(nullptr)
 {
     baselineCallReturnAddrs_[0] = baselineCallReturnAddrs_[1] = nullptr;
 }
 
 JitCompartment::~JitCompartment()
 {
     js_delete(stubCodes_);
@@ -659,36 +658,31 @@ JitCompartment::sweep(FreeOp* fop, JSCom
         baselineSetPropReturnAddr_ = nullptr;
 
     if (stringConcatStub_ && !IsMarkedUnbarriered(&stringConcatStub_))
         stringConcatStub_ = nullptr;
 
     if (regExpMatcherStub_ && !IsMarkedUnbarriered(&regExpMatcherStub_))
         regExpMatcherStub_ = nullptr;
 
-    if (regExpSearcherStub_ && !IsMarkedUnbarriered(&regExpSearcherStub_))
-        regExpSearcherStub_ = nullptr;
-
     if (regExpTesterStub_ && !IsMarkedUnbarriered(&regExpTesterStub_))
         regExpTesterStub_ = nullptr;
 
     for (ReadBarrieredObject& obj : simdTemplateObjects_) {
         if (obj && IsAboutToBeFinalized(&obj))
             obj.set(nullptr);
     }
 }
 
 void
 JitCompartment::toggleBarriers(bool enabled)
 {
     // Toggle barriers in compartment wide stubs that have patchable pre barriers.
     if (regExpMatcherStub_)
         regExpMatcherStub_->togglePreBarriers(enabled, Reprotect);
-    if (regExpSearcherStub_)
-        regExpSearcherStub_->togglePreBarriers(enabled, Reprotect);
     if (regExpTesterStub_)
         regExpTesterStub_->togglePreBarriers(enabled, Reprotect);
 
     // Toggle barriers in baseline IC stubs.
     for (ICStubCodeMap::Enum e(*stubCodes_); !e.empty(); e.popFront()) {
         JitCode* code = *e.front().value().unsafeGet();
         code->togglePreBarriers(enabled, Reprotect);
     }
--- a/js/src/jit/IonAnalysis.cpp
+++ b/js/src/jit/IonAnalysis.cpp
@@ -1843,17 +1843,17 @@ jit::MakeMRegExpHoistable(MIRGraph& grap
                 // No DCE or GVN or something has happened.
                 if (i->consumer()->isResumePoint())
                     continue;
 
                 MOZ_ASSERT(i->consumer()->isDefinition());
 
                 // All MRegExp* MIR's don't adjust the regexp.
                 MDefinition* use = i->consumer()->toDefinition();
-                if (use->isRegExpMatcher() || use->isRegExpTester() || use->isRegExpSearcher())
+                if (use->isRegExpMatcher() || use->isRegExpTester())
                     continue;
 
                 hoistable = false;
                 break;
             }
 
             if (!hoistable)
                 continue;
--- a/js/src/jit/IonBuilder.h
+++ b/js/src/jit/IonBuilder.h
@@ -818,17 +818,16 @@ class IonBuilder
 
     // String intrinsics.
     InliningStatus inlineStringReplaceString(CallInfo& callInfo);
     InliningStatus inlineConstantStringSplitString(CallInfo& callInfo);
     InliningStatus inlineStringSplitString(CallInfo& callInfo);
 
     // RegExp intrinsics.
     InliningStatus inlineRegExpMatcher(CallInfo& callInfo);
-    InliningStatus inlineRegExpSearcher(CallInfo& callInfo);
     InliningStatus inlineRegExpTester(CallInfo& callInfo);
     InliningStatus inlineIsRegExpObject(CallInfo& callInfo);
     InliningStatus inlineRegExpPrototypeOptimizable(CallInfo& callInfo);
     InliningStatus inlineRegExpInstanceOptimizable(CallInfo& callInfo);
 
     // Object natives and intrinsics.
     InliningStatus inlineObjectCreate(CallInfo& callInfo);
     InliningStatus inlineDefineDataProperty(CallInfo& callInfo);
--- a/js/src/jit/JitCompartment.h
+++ b/js/src/jit/JitCompartment.h
@@ -441,24 +441,22 @@ class JitCompartment
     // Stubs to concatenate two strings inline, or perform RegExp calls inline.
     // These bake in zone and compartment specific pointers and can't be stored
     // in JitRuntime. These are weak pointers, but are not declared as
     // ReadBarriered since they are only read from during Ion compilation,
     // which may occur off thread and whose barriers are captured during
     // CodeGenerator::link.
     JitCode* stringConcatStub_;
     JitCode* regExpMatcherStub_;
-    JitCode* regExpSearcherStub_;
     JitCode* regExpTesterStub_;
 
     mozilla::EnumeratedArray<SimdType, SimdType::Count, ReadBarrieredObject> simdTemplateObjects_;
 
     JitCode* generateStringConcatStub(JSContext* cx);
     JitCode* generateRegExpMatcherStub(JSContext* cx);
-    JitCode* generateRegExpSearcherStub(JSContext* cx);
     JitCode* generateRegExpTesterStub(JSContext* cx);
 
   public:
     JSObject* getSimdTemplateObjectFor(JSContext* cx, Handle<SimdTypeDescr*> descr) {
         ReadBarrieredObject& tpl = simdTemplateObjects_[descr->type()];
         if (!tpl)
             tpl.set(TypedObject::createZeroed(cx, descr, 0, gc::TenuredHeap));
         return tpl.get();
@@ -560,27 +558,16 @@ class JitCompartment
 
     bool ensureRegExpMatcherStubExists(JSContext* cx) {
         if (regExpMatcherStub_)
             return true;
         regExpMatcherStub_ = generateRegExpMatcherStub(cx);
         return regExpMatcherStub_ != nullptr;
     }
 
-    JitCode* regExpSearcherStubNoBarrier() const {
-        return regExpSearcherStub_;
-    }
-
-    bool ensureRegExpSearcherStubExists(JSContext* cx) {
-        if (regExpSearcherStub_)
-            return true;
-        regExpSearcherStub_ = generateRegExpSearcherStub(cx);
-        return regExpSearcherStub_ != nullptr;
-    }
-
     JitCode* regExpTesterStubNoBarrier() const {
         return regExpTesterStub_;
     }
 
     bool ensureRegExpTesterStubExists(JSContext* cx) {
         if (regExpTesterStub_)
             return true;
         regExpTesterStub_ = generateRegExpTesterStub(cx);
--- a/js/src/jit/Lowering.cpp
+++ b/js/src/jit/Lowering.cpp
@@ -2208,23 +2208,16 @@ MustCloneRegExp(MRegExp* regexp)
         MDefinition* def = node->toDefinition();
         if (def->isRegExpMatcher()) {
             MRegExpMatcher* test = def->toRegExpMatcher();
             if (test->indexOf(*iter) == 1) {
                 // Optimized RegExp.prototype.exec.
                 MOZ_ASSERT(test->regexp() == regexp);
                 continue;
             }
-        } else if (def->isRegExpSearcher()) {
-            MRegExpSearcher* test = def->toRegExpSearcher();
-            if (test->indexOf(*iter) == 1) {
-                // Optimized RegExp.prototype.exec.
-                MOZ_ASSERT(test->regexp() == regexp);
-                continue;
-            }
         } else if (def->isRegExpTester()) {
             MRegExpTester* test = def->toRegExpTester();
             if (test->indexOf(*iter) == 1) {
                 // Optimized RegExp.prototype.test.
                 MOZ_ASSERT(test->regexp() == regexp);
                 continue;
             }
         } else if (def->isCall()) {
@@ -2263,32 +2256,16 @@ LIRGenerator::visitRegExpMatcher(MRegExp
                                                       useFixedAtStart(ins->string(), RegExpMatcherStringReg),
                                                       useFixedAtStart(ins->lastIndex(), RegExpMatcherLastIndexReg),
                                                       useFixedAtStart(ins->sticky(), RegExpMatcherStickyReg));
     defineReturn(lir, ins);
     assignSafepoint(lir, ins);
 }
 
 void
-LIRGenerator::visitRegExpSearcher(MRegExpSearcher* ins)
-{
-    MOZ_ASSERT(ins->regexp()->type() == MIRType_Object);
-    MOZ_ASSERT(ins->string()->type() == MIRType_String);
-    MOZ_ASSERT(ins->lastIndex()->type() == MIRType_Int32);
-    MOZ_ASSERT(ins->sticky()->type() == MIRType_Boolean);
-
-    LRegExpSearcher* lir = new(alloc()) LRegExpSearcher(useFixedAtStart(ins->regexp(), RegExpTesterRegExpReg),
-                                                        useFixedAtStart(ins->string(), RegExpTesterStringReg),
-                                                        useFixedAtStart(ins->lastIndex(), RegExpTesterLastIndexReg),
-                                                        useFixedAtStart(ins->sticky(), RegExpTesterStickyReg));
-    defineReturn(lir, ins);
-    assignSafepoint(lir, ins);
-}
-
-void
 LIRGenerator::visitRegExpTester(MRegExpTester* ins)
 {
     MOZ_ASSERT(ins->regexp()->type() == MIRType_Object);
     MOZ_ASSERT(ins->string()->type() == MIRType_String);
     MOZ_ASSERT(ins->lastIndex()->type() == MIRType_Int32);
     MOZ_ASSERT(ins->sticky()->type() == MIRType_Boolean);
 
     LRegExpTester* lir = new(alloc()) LRegExpTester(useFixedAtStart(ins->regexp(), RegExpTesterRegExpReg),
--- a/js/src/jit/Lowering.h
+++ b/js/src/jit/Lowering.h
@@ -159,17 +159,16 @@ class LIRGenerator : public LIRGenerator
     void visitToInt32(MToInt32* convert);
     void visitTruncateToInt32(MTruncateToInt32* truncate);
     void visitWrapInt64ToInt32(MWrapInt64ToInt32* ins);
     void visitExtendInt32ToInt64(MExtendInt32ToInt64* ins);
     void visitToString(MToString* convert);
     void visitToObjectOrNull(MToObjectOrNull* convert);
     void visitRegExp(MRegExp* ins);
     void visitRegExpMatcher(MRegExpMatcher* ins);
-    void visitRegExpSearcher(MRegExpSearcher* ins);
     void visitRegExpTester(MRegExpTester* ins);
     void visitRegExpPrototypeOptimizable(MRegExpPrototypeOptimizable* ins);
     void visitRegExpInstanceOptimizable(MRegExpInstanceOptimizable* ins);
     void visitStringReplace(MStringReplace* ins);
     void visitBinarySharedStub(MBinarySharedStub* ins);
     void visitUnarySharedStub(MUnarySharedStub* ins);
     void visitLambda(MLambda* ins);
     void visitLambdaArrow(MLambdaArrow* ins);
--- a/js/src/jit/MCallOptimize.cpp
+++ b/js/src/jit/MCallOptimize.cpp
@@ -175,18 +175,16 @@ IonBuilder::inlineNativeCall(CallInfo& c
       case InlinableNative::MathTrunc:
         return inlineMathFunction(callInfo, MMathFunction::Trunc);
       case InlinableNative::MathCbrt:
         return inlineMathFunction(callInfo, MMathFunction::Cbrt);
 
       // RegExp natives.
       case InlinableNative::RegExpMatcher:
         return inlineRegExpMatcher(callInfo);
-      case InlinableNative::RegExpSearcher:
-        return inlineRegExpSearcher(callInfo);
       case InlinableNative::RegExpTester:
         return inlineRegExpTester(callInfo);
       case InlinableNative::IsRegExpObject:
         return inlineIsRegExpObject(callInfo);
       case InlinableNative::RegExpPrototypeOptimizable:
         return inlineRegExpPrototypeOptimizable(callInfo);
       case InlinableNative::RegExpInstanceOptimizable:
         return inlineRegExpInstanceOptimizable(callInfo);
@@ -1817,155 +1815,101 @@ IonBuilder::inlineRegExpMatcher(CallInfo
     // This is called from Self-hosted JS, after testing each argument,
     // most of following tests should be passed.
 
     if (callInfo.argc() != 4 || callInfo.constructing()) {
         trackOptimizationOutcome(TrackedOutcome::CantInlineNativeBadForm);
         return InliningStatus_NotInlined;
     }
 
-    MDefinition* rxArg = callInfo.getArg(0);
-    MDefinition* strArg = callInfo.getArg(1);
-    MDefinition* lastIndexArg = callInfo.getArg(2);
-    MDefinition* stickyArg = callInfo.getArg(3);
-
-    if (rxArg->type() != MIRType_Object)
-        return InliningStatus_NotInlined;
-
-    TemporaryTypeSet* rxTypes = rxArg->resultTypeSet();
-    const Class* clasp = rxTypes ? rxTypes->getKnownClass(constraints()) : nullptr;
+    // regexp
+    if (callInfo.getArg(0)->type() != MIRType_Object)
+        return InliningStatus_NotInlined;
+
+    TemporaryTypeSet* arg0Types = callInfo.getArg(0)->resultTypeSet();
+    const Class* clasp = arg0Types ? arg0Types->getKnownClass(constraints()) : nullptr;
     if (clasp != &RegExpObject::class_)
         return InliningStatus_NotInlined;
 
-    if (strArg->mightBeType(MIRType_Object))
-        return InliningStatus_NotInlined;
-
-    if (lastIndexArg->type() != MIRType_Int32)
-        return InliningStatus_NotInlined;
-
-    if (stickyArg->type() != MIRType_Boolean)
+    // string
+    if (callInfo.getArg(1)->mightBeType(MIRType_Object))
+        return InliningStatus_NotInlined;
+
+    // lastIndex: Only inline if it's Int32.
+    if (callInfo.getArg(2)->type() != MIRType_Int32)
+        return InliningStatus_NotInlined;
+
+    // sticky
+    if (callInfo.getArg(3)->type() != MIRType_Boolean)
         return InliningStatus_NotInlined;
 
     JSContext* cx = GetJitContext()->cx;
     if (!cx->compartment()->jitCompartment()->ensureRegExpMatcherStubExists(cx)) {
         cx->clearPendingException(); // OOM or overrecursion.
         return InliningStatus_NotInlined;
     }
 
     callInfo.setImplicitlyUsedUnchecked();
 
-    MInstruction* matcher = MRegExpMatcher::New(alloc(), rxArg, strArg, lastIndexArg, stickyArg);
+    MInstruction* matcher = MRegExpMatcher::New(alloc(), callInfo.getArg(0), callInfo.getArg(1),
+                                                callInfo.getArg(2), callInfo.getArg(3));
     current->add(matcher);
     current->push(matcher);
 
     if (!resumeAfter(matcher))
         return InliningStatus_Error;
 
     if (!pushTypeBarrier(matcher, getInlineReturnTypeSet(), BarrierKind::TypeSet))
         return InliningStatus_Error;
 
     return InliningStatus_Inlined;
 }
 
 IonBuilder::InliningStatus
-IonBuilder::inlineRegExpSearcher(CallInfo& callInfo)
-{
-    // This is called from Self-hosted JS, after testing each argument,
-    // most of following tests should be passed.
-
-    if (callInfo.argc() != 4 || callInfo.constructing()) {
-        trackOptimizationOutcome(TrackedOutcome::CantInlineNativeBadForm);
-        return InliningStatus_NotInlined;
-    }
-
-    MDefinition* rxArg = callInfo.getArg(0);
-    MDefinition* strArg = callInfo.getArg(1);
-    MDefinition* lastIndexArg = callInfo.getArg(2);
-    MDefinition* stickyArg = callInfo.getArg(3);
-
-    if (rxArg->type() != MIRType_Object)
-        return InliningStatus_NotInlined;
-
-    TemporaryTypeSet* regexpTypes = rxArg->resultTypeSet();
-    const Class* clasp = regexpTypes ? regexpTypes->getKnownClass(constraints()) : nullptr;
-    if (clasp != &RegExpObject::class_)
-        return InliningStatus_NotInlined;
-
-    if (strArg->mightBeType(MIRType_Object))
-        return InliningStatus_NotInlined;
-
-    if (lastIndexArg->type() != MIRType_Int32)
-        return InliningStatus_NotInlined;
-
-    if (stickyArg->type() != MIRType_Boolean)
-        return InliningStatus_NotInlined;
-
-    JSContext* cx = GetJitContext()->cx;
-    if (!cx->compartment()->jitCompartment()->ensureRegExpSearcherStubExists(cx)) {
-        cx->clearPendingException(); // OOM or overrecursion.
-        return InliningStatus_Error;
-    }
-
-    callInfo.setImplicitlyUsedUnchecked();
-
-    MInstruction* searcher = MRegExpSearcher::New(alloc(), rxArg, strArg, lastIndexArg, stickyArg);
-    current->add(searcher);
-    current->push(searcher);
-
-    if (!resumeAfter(searcher))
-        return InliningStatus_Error;
-
-    if (!pushTypeBarrier(searcher, getInlineReturnTypeSet(), BarrierKind::TypeSet))
-        return InliningStatus_Error;
-
-    return InliningStatus_Inlined;
-}
-
-IonBuilder::InliningStatus
 IonBuilder::inlineRegExpTester(CallInfo& callInfo)
 {
     // This is called from Self-hosted JS, after testing each argument,
     // most of following tests should be passed.
 
     if (callInfo.argc() != 4 || callInfo.constructing()) {
         trackOptimizationOutcome(TrackedOutcome::CantInlineNativeBadForm);
         return InliningStatus_NotInlined;
     }
 
-    MDefinition* rxArg = callInfo.getArg(0);
-    MDefinition* strArg = callInfo.getArg(1);
-    MDefinition* lastIndexArg = callInfo.getArg(2);
-    MDefinition* stickyArg = callInfo.getArg(3);
-
-    if (rxArg->type() != MIRType_Object)
-        return InliningStatus_NotInlined;
-
-    TemporaryTypeSet* rxTypes = rxArg->resultTypeSet();
-    const Class* clasp = rxTypes ? rxTypes->getKnownClass(constraints()) : nullptr;
+    // regexp
+    if (callInfo.getArg(0)->type() != MIRType_Object)
+        return InliningStatus_NotInlined;
+
+    TemporaryTypeSet* arg0Types = callInfo.getArg(0)->resultTypeSet();
+    const Class* clasp = arg0Types ? arg0Types->getKnownClass(constraints()) : nullptr;
     if (clasp != &RegExpObject::class_)
         return InliningStatus_NotInlined;
 
-    if (strArg->mightBeType(MIRType_Object))
-        return InliningStatus_NotInlined;
-
-    if (lastIndexArg->type() != MIRType_Int32)
-        return InliningStatus_NotInlined;
-
-    if (stickyArg->type() != MIRType_Boolean)
+    // string
+    if (callInfo.getArg(1)->mightBeType(MIRType_Object))
+        return InliningStatus_NotInlined;
+
+    // lastIndex: Only inline if it's Int32.
+    if (callInfo.getArg(2)->type() != MIRType_Int32)
+        return InliningStatus_NotInlined;
+
+    // sticky
+    if (callInfo.getArg(3)->type() != MIRType_Boolean)
         return InliningStatus_NotInlined;
 
     JSContext* cx = GetJitContext()->cx;
     if (!cx->compartment()->jitCompartment()->ensureRegExpTesterStubExists(cx)) {
         cx->clearPendingException(); // OOM or overrecursion.
         return InliningStatus_NotInlined;
     }
 
     callInfo.setImplicitlyUsedUnchecked();
 
-    MInstruction* tester = MRegExpTester::New(alloc(), rxArg, strArg, lastIndexArg, stickyArg);
+    MInstruction* tester = MRegExpTester::New(alloc(), callInfo.getArg(0), callInfo.getArg(1),
+                                              callInfo.getArg(2), callInfo.getArg(3));
     current->add(tester);
     current->push(tester);
 
     if (!resumeAfter(tester))
         return InliningStatus_Error;
 
     return InliningStatus_Inlined;
 }
--- a/js/src/jit/MIR.h
+++ b/js/src/jit/MIR.h
@@ -7933,71 +7933,16 @@ class MRegExpMatcher
         return true;
     }
 
     bool possiblyCalls() const override {
         return true;
     }
 };
 
-class MRegExpSearcher
-  : public MAryInstruction<4>,
-    public Mix4Policy<ObjectPolicy<0>,
-                      StringPolicy<1>,
-                      IntPolicy<2>,
-                      BooleanPolicy<3> >::Data
-{
-  private:
-
-    MRegExpSearcher(MDefinition* regexp, MDefinition* string, MDefinition* lastIndex,
-                    MDefinition* sticky)
-      : MAryInstruction<4>()
-    {
-        initOperand(0, regexp);
-        initOperand(1, string);
-        initOperand(2, lastIndex);
-        initOperand(3, sticky);
-
-        setMovable();
-        setResultType(MIRType_Int32);
-    }
-
-  public:
-    INSTRUCTION_HEADER(RegExpSearcher)
-
-    static MRegExpSearcher* New(TempAllocator& alloc, MDefinition* regexp, MDefinition* string,
-                                MDefinition* lastIndex, MDefinition* sticky)
-    {
-        return new(alloc) MRegExpSearcher(regexp, string, lastIndex, sticky);
-    }
-
-    MDefinition* regexp() const {
-        return getOperand(0);
-    }
-    MDefinition* string() const {
-        return getOperand(1);
-    }
-    MDefinition* lastIndex() const {
-        return getOperand(2);
-    }
-    MDefinition* sticky() const {
-        return getOperand(3);
-    }
-
-    bool writeRecoverData(CompactBufferWriter& writer) const override;
-
-    bool canRecoverOnBailout() const override {
-        return true;
-    }
-
-    bool possiblyCalls() const override {
-        return true;
-    }
-};
-
 class MRegExpTester
   : public MAryInstruction<4>,
     public Mix4Policy<ObjectPolicy<0>,
                       StringPolicy<1>,
                       IntPolicy<2>,
                       BooleanPolicy<3> >::Data
 {
   private:
--- a/js/src/jit/MOpcodes.h
+++ b/js/src/jit/MOpcodes.h
@@ -141,17 +141,16 @@ namespace jit {
     _(InitProp)                                                             \
     _(InitPropGetterSetter)                                                 \
     _(Start)                                                                \
     _(OsrEntry)                                                             \
     _(Nop)                                                                  \
     _(LimitedTruncate)                                                      \
     _(RegExp)                                                               \
     _(RegExpMatcher)                                                        \
-    _(RegExpSearcher)                                                       \
     _(RegExpTester)                                                         \
     _(RegExpPrototypeOptimizable)                                           \
     _(RegExpInstanceOptimizable)                                            \
     _(StringReplace)                                                        \
     _(Lambda)                                                               \
     _(LambdaArrow)                                                          \
     _(KeepAliveObject)                                                      \
     _(Slots)                                                                \
--- a/js/src/jit/Recover.cpp
+++ b/js/src/jit/Recover.cpp
@@ -1019,45 +1019,16 @@ RRegExpMatcher::recover(JSContext* cx, S
     if (!RegExpMatcherRaw(cx, regexp, input, lastIndex, sticky, nullptr, &result))
         return false;
 
     iter.storeInstructionResult(result);
     return true;
 }
 
 bool
-MRegExpSearcher::writeRecoverData(CompactBufferWriter& writer) const
-{
-    MOZ_ASSERT(canRecoverOnBailout());
-    writer.writeUnsigned(uint32_t(RInstruction::Recover_RegExpSearcher));
-    return true;
-}
-
-RRegExpSearcher::RRegExpSearcher(CompactBufferReader& reader)
-{}
-
-bool
-RRegExpSearcher::recover(JSContext* cx, SnapshotIterator& iter) const
-{
-    RootedObject regexp(cx, &iter.read().toObject());
-    RootedString input(cx, iter.read().toString());
-    int32_t lastIndex = iter.read().toInt32();
-    bool sticky = iter.read().toBoolean();
-
-    int32_t result;
-    if (!RegExpSearcherRaw(cx, regexp, input, lastIndex, sticky, nullptr, &result))
-        return false;
-
-    RootedValue resultVal(cx);
-    resultVal.setInt32(result);
-    iter.storeInstructionResult(resultVal);
-    return true;
-}
-
-bool
 MRegExpTester::writeRecoverData(CompactBufferWriter& writer) const
 {
     MOZ_ASSERT(canRecoverOnBailout());
     writer.writeUnsigned(uint32_t(RInstruction::Recover_RegExpTester));
     return true;
 }
 
 RRegExpTester::RRegExpTester(CompactBufferReader& reader)
--- a/js/src/jit/Recover.h
+++ b/js/src/jit/Recover.h
@@ -84,17 +84,16 @@ namespace jit {
     _(MinMax)                                   \
     _(Abs)                                      \
     _(Sqrt)                                     \
     _(Atan2)                                    \
     _(Hypot)                                    \
     _(MathFunction)                             \
     _(StringSplit)                              \
     _(RegExpMatcher)                            \
-    _(RegExpSearcher)                           \
     _(RegExpTester)                             \
     _(StringReplace)                            \
     _(TypeOf)                                   \
     _(ToDouble)                                 \
     _(ToFloat32)                                \
     _(TruncateToInt32)                          \
     _(NewObject)                                \
     _(NewArray)                                 \
@@ -566,28 +565,16 @@ class RRegExpMatcher final : public RIns
 
     virtual uint32_t numOperands() const {
         return 5;
     }
 
     bool recover(JSContext* cx, SnapshotIterator& iter) const;
 };
 
-class RRegExpSearcher final : public RInstruction
-{
-  public:
-    RINSTRUCTION_HEADER_(RegExpSearcher)
-
-    virtual uint32_t numOperands() const {
-        return 5;
-    }
-
-    bool recover(JSContext* cx, SnapshotIterator& iter) const;
-};
-
 class RRegExpTester final : public RInstruction
 {
   public:
     RINSTRUCTION_HEADER_(RegExpTester)
 
     virtual uint32_t numOperands() const {
         return 5;
     }
--- a/js/src/jit/shared/LIR-shared.h
+++ b/js/src/jit/shared/LIR-shared.h
@@ -4296,48 +4296,16 @@ class LRegExpMatcher : public LCallInstr
         return getOperand(3);
     }
 
     const MRegExpMatcher* mir() const {
         return mir_->toRegExpMatcher();
     }
 };
 
-class LRegExpSearcher : public LCallInstructionHelper<1, 4, 0>
-{
-  public:
-    LIR_HEADER(RegExpSearcher)
-
-    LRegExpSearcher(const LAllocation& regexp, const LAllocation& string,
-                    const LAllocation& lastIndex, const LAllocation& sticky)
-    {
-        setOperand(0, regexp);
-        setOperand(1, string);
-        setOperand(2, lastIndex);
-        setOperand(3, sticky);
-    }
-
-    const LAllocation* regexp() {
-        return getOperand(0);
-    }
-    const LAllocation* string() {
-        return getOperand(1);
-    }
-    const LAllocation* lastIndex() {
-        return getOperand(2);
-    }
-    const LAllocation* sticky() {
-        return getOperand(3);
-    }
-
-    const MRegExpSearcher* mir() const {
-        return mir_->toRegExpSearcher();
-    }
-};
-
 class LRegExpTester : public LCallInstructionHelper<1, 4, 0>
 {
   public:
     LIR_HEADER(RegExpTester)
 
     LRegExpTester(const LAllocation& regexp, const LAllocation& string,
                   const LAllocation& lastIndex, const LAllocation& sticky)
     {
--- a/js/src/jit/shared/LOpcodes-shared.h
+++ b/js/src/jit/shared/LOpcodes-shared.h
@@ -202,17 +202,16 @@
     _(Start)                        \
     _(OsrEntry)                     \
     _(OsrValue)                     \
     _(OsrScopeChain)                \
     _(OsrReturnValue)               \
     _(OsrArgumentsObject)           \
     _(RegExp)                       \
     _(RegExpMatcher)                \
-    _(RegExpSearcher)               \
     _(RegExpTester)                 \
     _(RegExpPrototypeOptimizable)   \
     _(RegExpInstanceOptimizable)    \
     _(StringReplace)                \
     _(Substr)                       \
     _(BinarySharedStub)             \
     _(UnarySharedStub)              \
     _(Lambda)                       \
--- a/js/src/vm/SelfHosting.cpp
+++ b/js/src/vm/SelfHosting.cpp
@@ -2526,18 +2526,16 @@ static const JSFunctionSpec intrinsic_fu
 
     JS_INLINABLE_FN("IsRegExpObject",
                     intrinsic_IsInstanceOfBuiltin<RegExpObject>, 1,0,
                     IsRegExpObject),
     JS_FN("CallRegExpMethodIfWrapped",
           CallNonGenericSelfhostedMethod<Is<RegExpObject>>, 2,0),
     JS_INLINABLE_FN("RegExpMatcher", RegExpMatcher, 4,0,
                     RegExpMatcher),
-    JS_INLINABLE_FN("RegExpSearcher", RegExpSearcher, 4,0,
-                    RegExpSearcher),
     JS_INLINABLE_FN("RegExpTester", RegExpTester, 4,0,
                     RegExpTester),
     JS_FN("RegExpCreate", intrinsic_RegExpCreate, 2,0),
     JS_INLINABLE_FN("RegExpPrototypeOptimizable", RegExpPrototypeOptimizable, 1,0,
                     RegExpPrototypeOptimizable),
     JS_INLINABLE_FN("RegExpInstanceOptimizable", RegExpInstanceOptimizable, 1,0,
                     RegExpInstanceOptimizable),
     JS_FN("RegExpGetSubstitution", intrinsic_RegExpGetSubstitution, 6,0),