From f45e2c18c924d15f9124ca2e7dcc496cdfc18b9b Mon Sep 17 00:00:00 2001 From: Michael Colavita Date: Fri, 23 Oct 2020 13:08:10 -0700 Subject: [PATCH] Kill a bunch of unnecessary makeCatchSet blocks Summary: We only need to use a `makeCatchSet` block if the helper we're calling can throw InvalidSetMException. This only occurs when the base of the SetM op is a scalar, a string, or null. Therefore, if we have enough knowledge of the type to conclude it is impossible to throw InvalidSetMException, don't create a custom catch block. Differential Revision: D24504732 fbshipit-source-id: b868f6ba3cb23524b2a4dcccf889aa37d8b5af60 --- hphp/runtime/vm/jit/irgen-minstr.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/hphp/runtime/vm/jit/irgen-minstr.cpp b/hphp/runtime/vm/jit/irgen-minstr.cpp index b6c632a2c58..e55b02448c3 100644 --- a/hphp/runtime/vm/jit/irgen-minstr.cpp +++ b/hphp/runtime/vm/jit/irgen-minstr.cpp @@ -1335,7 +1335,10 @@ SSATmp* emitArrayLikeSet(IRGS& env, SSATmp* key, SSATmp* value) { } auto const baseLoc = ldMBase(env); - if (!canUpdateCanonicalBase(baseLoc)) return nullptr; + if (!canUpdateCanonicalBase(baseLoc)) { + gen(env, SetElem, baseLoc, key, value); + return value; + } auto const op = isVec ? VecSet : DictSet; auto const newArr = gen(env, op, base, key, value); @@ -1370,7 +1373,7 @@ void setNewElemVecImpl(IRGS& env, uint32_t nDiscard, SSATmp* basePtr, gen(env, StMem, elemPtr, value); }, [&] { - gen(env, SetNewElemVec, makeCatchSet(env, nDiscard), basePtr, value); + gen(env, SetNewElemVec, basePtr, value); } ); @@ -1389,7 +1392,7 @@ SSATmp* setNewElemImpl(IRGS& env, uint32_t nDiscard) { setNewElemVecImpl(env, nDiscard, basePtr, baseType, value); } else if (baseType.subtypeOfAny(TDArr, TDict)) { constrainBase(env); - gen(env, SetNewElemDict, makeCatchSet(env, nDiscard), basePtr, value); + gen(env, SetNewElemDict, basePtr, value); } else if (baseType <= TKeyset) { constrainBase(env); if (!value->type().isKnownDataType()) { @@ -1400,7 +1403,7 @@ SSATmp* setNewElemImpl(IRGS& env, uint32_t nDiscard) { auto const base = extractBase(env); gen(env, ThrowInvalidArrayKey, base, value); } else { - gen(env, SetNewElemKeyset, makeCatchSet(env, nDiscard), basePtr, value); + gen(env, SetNewElemKeyset, basePtr, value); } } else { gen(env, SetNewElem, makeCatchSet(env, nDiscard), basePtr, value); @@ -1436,10 +1439,7 @@ SSATmp* setElemImpl(IRGS& env, uint32_t nDiscard, SSATmp* key) { case SimpleOp::Vec: case SimpleOp::Dict: case SimpleOp::Keyset: - if (auto result = emitArrayLikeSet(env, key, value)) { - return result; - } - // If we couldn't emit a specialized op, fall through to the generic path. + return emitArrayLikeSet(env, key, value); case SimpleOp::Pair: case SimpleOp::None: -- 2.11.4.GIT