From 299b0f5b396a0574819e8d48b3b3f232786e07b8 Mon Sep 17 00:00:00 2001 From: Arnab De Date: Tue, 22 Jun 2021 15:55:30 -0700 Subject: [PATCH] More builtin optimizations for lazy classes Summary: Optimize `type_structure` and `is_a` for lazy classes. Reviewed By: paulbiss Differential Revision: D27976309 fbshipit-source-id: ebb02625dca5ce7ad25deb7fa35b2e4277ce0256 --- hphp/runtime/vm/jit/irgen-builtin.cpp | 19 +++++++++++++++---- hphp/runtime/vm/jit/simplify.cpp | 8 +++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/hphp/runtime/vm/jit/irgen-builtin.cpp b/hphp/runtime/vm/jit/irgen-builtin.cpp index 350dbc9473f..8bd14011399 100644 --- a/hphp/runtime/vm/jit/irgen-builtin.cpp +++ b/hphp/runtime/vm/jit/irgen-builtin.cpp @@ -125,13 +125,22 @@ SSATmp* is_a_impl(IRGS& env, const ParamPrep& params, bool subclassOnly) { auto const allowClass = nparams == 3 ? params[2].value : cns(env, false); if (!obj->type().subtypeOfAny(TCls, TObj) || - !cls->type().subtypeOfAny(TCls, TStr) || + !cls->type().subtypeOfAny(TCls, TLazyCls, TStr) || !allowClass->isA(TBool)) { return nullptr; } auto const lhs = obj->isA(TObj) ? gen(env, LdObjClass, obj) : obj; - auto const rhs = cls->isA(TStr) ? gen(env, LookupClsRDS, cls) : cls; + auto const rhs = [&] { + if (cls->isA(TStr)) { + return gen(env, LookupClsRDS, cls); + } + if (cls->isA(TLazyCls)) { + auto const cname = gen(env, LdLazyClsName, cls); + return gen(env, LookupClsRDS, cname); + } + return cls; + }(); return cond( env, @@ -526,12 +535,14 @@ SSATmp* impl_opt_type_structure(IRGS& env, const ParamPrep& params, auto const clsNameTmp = params[0].value; auto const cnsNameTmp = params[1].value; - if (!clsNameTmp->isA(TStr)) return nullptr; + if (!clsNameTmp->isA(TStr|TCls|TLazyCls)) return nullptr; if (!cnsNameTmp->hasConstVal(TStaticStr)) return nullptr; auto const cnsName = cnsNameTmp->strVal(); auto const clsTmp = [&] () -> SSATmp* { - if (clsNameTmp->inst()->is(LdClsName)) { + if (clsNameTmp->isA(TCls)) return clsNameTmp; + if (clsNameTmp->inst()->is(LdClsName) || + clsNameTmp->inst()->is(LdLazyCls)) { return clsNameTmp->inst()->src(0); } return ldCls(env, clsNameTmp, make_opt_catch(env, params)); diff --git a/hphp/runtime/vm/jit/simplify.cpp b/hphp/runtime/vm/jit/simplify.cpp index f931403271a..068968ff8d3 100644 --- a/hphp/runtime/vm/jit/simplify.cpp +++ b/hphp/runtime/vm/jit/simplify.cpp @@ -412,9 +412,15 @@ SSATmp* simplifyLookupClsCtxCns(State& env, const IRInstruction* inst) { SSATmp* simplifyLdCls(State& env, const IRInstruction* inst) { auto const str = inst->src(0); auto const cls = inst->src(1); - if (str->inst()->is(LdClsName, LdLazyCls)) { + if (str->inst()->is(LdClsName)) { return str->inst()->src(0); } + if (str->inst()->is(LdLazyClsName)) { + auto const lcls = str->inst()->src(0); + if (lcls->inst()->is(LdLazyCls)) { + return lcls->inst()->src(0); + } + } if (str->hasConstVal() && (cls->hasConstVal(TCls) || cls->isA(TNullptr))) { auto const sval = str->strVal(); auto const cval = cls->hasConstVal(TCls) ? cls->clsVal() : nullptr; -- 2.11.4.GIT