In the affected test D68108 causes stubs of getter and setter methods for property 'x' appear in both ObjCInterfaceDecl and ObjCImplementationDecl for our toy ClassWithProperties. Previously they were only present in ObjCInterfaceDecl. I guess that's the intended behavior.
ObjCInterfaceDecl::lookupPrivateMethod() preferes looking up the method in the implementation. CallEvent::getRuntimeDefinition() trusts it and starts using the implementation stub instead of the interface stub. This explains the disappearance of "executed line" 10: implementation stubs, unlike interface stubs, have invalid source locations.
On the other hand, bodyFarm's createObjCPropertyGetter() function queries ObjCPropertyDecl when it is looking for the declaration of variable 'self' within the method. This is no longer valid, because the accessor declaration for ObjCPropertyDecl is the interface stub, while the newly farmed body is going to be attached to the implementation stub. This explains the change in dead symbol elimination: basically, the 'self' variable is from a different Decl, so liveness analysis becomes confused. If we are to keep inlining and farming the implementation stub, we should use the 'self' from the implementation stub, not the 'self' from the interface stub.
In this patch i basically change CallEvent back to use the interface stub. Generally, i believe that CallEvent::getRuntimeDefinition() should always return either the declaration that has a body (if the body is at all present), or the canonical declaration (in all other cases), but i didn't verify that. In any case, body farms always farm the body for the canonical declaration.
I think i made the opposite choice in my previous patch on the subject, D60899. I guess i'll need to make up my mind. I'll think a bit more about this.
Another useful assertion to add would be to always check that the farmed body only refers to ParmVarDecls (or ImplicitParamDecls) that belong to the correct function/method decl.