On Feb 16, 2013, at 8:03 PM, Saleem Abdulrasool <[email protected]> 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 <[email protected]>
> Signed-off-by: Saleem Abdulrasool <[email protected]>
> 
> 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



_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to