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
