5662a67f12
Broke LdClsPropAddr into 2 instructions by introducing a ldClsPropAddrCached. LdClsPropAddrCached loads the static property via the target cache so requires the class and property name to be compile-time constants. LdClsPropAddr does not use the target cache and works even if the property and class names are not constant. Similarly broke LdCls into 2 by introducing LdClsCached. LdClsCached uses the target cache to handle the case where the class name is a compile time constant. Added code to detect cases where the class name can be folded to a Class* constant. Moved the code that decides between LdCls (LdClsPropAddr) and LdClsCached (LdClsPropAddrCached) to the simplifier, allowing us to optimize these instructions as optimization passes discover more constants. Changed HhbcTranslator code generation for AGet* and getClsPropAddr to handle more cases using the above new instructions. Also improved HhbcTranslator's translations for self and parent bytecodes. Added a label to LdClsPropAddr to allow control flow when property is not accessible. This enables implementation of IssetS (which was incorrect before this diff) and EmptyS. Implemented BindS, VGetS, EmptyS, and LateBoundCls. Opportunitistically introduces calls to SSATmp::isA(...) to replace explicit comparisons against Type::Tag values. Moved AddElem punt from code generator to hhbctranslator so that we can interpone.