r175386 - [CodeGen] tighten objc ivar invariant.load attribution
Douglas Gregor
dgregor at apple.com
Mon Feb 18 08:00:15 PST 2013
On Feb 16, 2013, at 8:03 PM, Saleem Abdulrasool <compnerd at compnerd.org> wrote:
> Author: compnerd
> Date: Sat Feb 16 22:03:34 2013
> New Revision: 175386
>
> URL: http://llvm.org/viewvc/llvm-project?rev=175386&view=rev
> Log:
> [CodeGen] tighten objc ivar invariant.load attribution
>
> An ivar ofset cannot be marked as invariant load in all cases. The ivar offset
> is a lazily initialised constant, which is dependent on an objc_msgSend
> invocation to perform a fixup of the offset. If the load is being performed on
> a method implemented by the class then this load can safely be marked as an
> inviarant because a message must have been passed to the class at some point,
> forcing the ivar offset to be resolved.
>
> An additional heuristic that can be used to identify an invariant load would be
> if the ivar offset base is a parameter to an objc method. However, without the
> parameters available at hand, this is currently not possible.
>
> Reviewed-by: John McCall <rjmccall at apple.com>
> Signed-off-by: Saleem Abdulrasool <compnerd at compnerd.org>
>
> Added:
> cfe/trunk/test/CodeGenObjC/ivar-invariant.m
> Modified:
> cfe/trunk/lib/CodeGen/CGObjCMac.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGObjCMac.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGObjCMac.cpp?rev=175386&r1=175385&r2=175386&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGObjCMac.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGObjCMac.cpp Sat Feb 16 22:03:34 2013
> @@ -1432,6 +1432,25 @@ private:
> /// class implementation is "non-lazy".
> bool ImplementationIsNonLazy(const ObjCImplDecl *OD) const;
>
> + bool IsIvarOffsetKnownIdempotent(const CodeGen::CodeGenFunction &CGF,
> + const ObjCInterfaceDecl *ID,
> + const ObjCIvarDecl *IV) {
> + // Annotate the load as an invariant load iff the object type is the type,
> + // or a derived type, of the class containing the ivar within an ObjC
> + // method. This check is needed because the ivar offset is a lazily
> + // initialised value that may depend on objc_msgSend to perform a fixup on
> + // the first message dispatch.
> + //
> + // An additional opportunity to mark the load as invariant arises when the
> + // base of the ivar access is a parameter to an Objective C method.
> + // However, because the parameters are not available in the current
> + // interface, we cannot perform this check.
> + if (dyn_cast<ObjCMethodDecl>(CGF.CurFuncDecl))
This needs to do a NULL check on CurFuncDecl, since we might not have a declaration. Example:
@interface A
{
@public
id foo;
}
@end
id (^block)(A*) = ^(A* a) {
return a->foo;
};
I've fixed it in r175448.
- Doug
More information about the cfe-commits
mailing list