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