Index: clang/test/CodeGenObjC/arc.m =================================================================== --- clang/test/CodeGenObjC/arc.m +++ clang/test/CodeGenObjC/arc.m @@ -1556,14 +1556,14 @@ // CHECK: %[[B_ADDR:.*]] = alloca i8*, align 8 // CHECK: %[[T:.*]] = alloca [2 x i8*], align 16 // CHECK: %[[V0:.*]] = call i8* @llvm.objc.retain(i8* %[[A]]) -// CHECK: %[[V1:.*]] = call i8* @llvm.objc.retain(i8* %[[B]]) #2 +// CHECK: %[[V1:.*]] = call i8* @llvm.objc.retain(i8* %[[B]]) #3 // CHECK: %[[ARRAYINIT_BEGIN:.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* %[[T]], i64 0, i64 0 // CHECK: %[[V3:.*]] = load i8*, i8** %[[A_ADDR]], align 8, !tbaa !7 -// CHECK: %[[V4:.*]] = call i8* @llvm.objc.retain(i8* %[[V3]]) #2 +// CHECK: %[[V4:.*]] = call i8* @llvm.objc.retain(i8* %[[V3]]) #3 // CHECK: store i8* %[[V4]], i8** %[[ARRAYINIT_BEGIN]], align 8, !tbaa !7 // CHECK: %[[ARRAYINIT_ELEMENT:.*]] = getelementptr inbounds i8*, i8** %[[ARRAYINIT_BEGIN]], i64 1 // CHECK: %[[V5:.*]] = load i8*, i8** %[[B_ADDR]], align 8, !tbaa !7 -// CHECK: %[[V6:.*]] = call i8* @llvm.objc.retain(i8* %[[V5]]) #2 +// CHECK: %[[V6:.*]] = call i8* @llvm.objc.retain(i8* %[[V5]]) #3 // CHECK: store i8* %[[V6]], i8** %[[ARRAYINIT_ELEMENT]], align 8, !tbaa !7 // CHECK: %[[ARRAY_BEGIN:.*]] = getelementptr inbounds [2 x i8*], [2 x i8*]* %[[T]], i32 0, i32 0 // CHECK: %[[V7:.*]] = getelementptr inbounds i8*, i8** %[[ARRAY_BEGIN]], i64 2 @@ -1573,14 +1573,14 @@ // CHECK: %[[ARRAYDESTROY_ELEMENTPAST:.*]] = phi i8** [ %[[V7]], %{{.*}} ], [ %[[ARRAYDESTROY_ELEMENT:.*]], %{{.*}} ] // CHECK: %[[ARRAYDESTROY_ELEMENT]] = getelementptr inbounds i8*, i8** %[[ARRAYDESTROY_ELEMENTPAST]], i64 -1 // CHECK: %[[V8:.*]] = load i8*, i8** %[[ARRAYDESTROY_ELEMENT]], align 8 -// CHECK: call void @llvm.objc.release(i8* %[[V8]]) #2, !clang.imprecise_release !10 +// CHECK: call void @llvm.objc.release(i8* %[[V8]]) #3, !clang.imprecise_release !10 // CHECK-NOT: call void @llvm.objc.release // CHECK: %[[V10:.*]] = load i8*, i8** %[[B_ADDR]], align 8 -// CHECK: call void @llvm.objc.release(i8* %[[V10]]) #2, !clang.imprecise_release !10 +// CHECK: call void @llvm.objc.release(i8* %[[V10]]) #3, !clang.imprecise_release !10 // CHECK: %[[V11:.*]] = load i8*, i8** %[[A_ADDR]], align 8 -// CHECK: call void @llvm.objc.release(i8* %[[V11]]) #2, !clang.imprecise_release !10 +// CHECK: call void @llvm.objc.release(i8* %[[V11]]) #3, !clang.imprecise_release !10 void test72(id a, id b) { __strong id t[] = (__strong id[]){a, b}; Index: llvm/include/llvm/Analysis/ObjCARCAliasAnalysis.h =================================================================== --- llvm/include/llvm/Analysis/ObjCARCAliasAnalysis.h +++ llvm/include/llvm/Analysis/ObjCARCAliasAnalysis.h @@ -54,13 +54,6 @@ AAQueryInfo &AAQI); bool pointsToConstantMemory(const MemoryLocation &Loc, AAQueryInfo &AAQI, bool OrLocal); - - using AAResultBase::getMemoryEffects; - MemoryEffects getMemoryEffects(const Function *F); - - using AAResultBase::getModRefInfo; - ModRefInfo getModRefInfo(const CallBase *Call, const MemoryLocation &Loc, - AAQueryInfo &AAQI); }; /// Analysis pass providing a never-invalidated alias analysis result. Index: llvm/include/llvm/IR/Intrinsics.td =================================================================== --- llvm/include/llvm/IR/Intrinsics.td +++ llvm/include/llvm/IR/Intrinsics.td @@ -429,12 +429,13 @@ // Note these are to support the Objective-C ARC optimizer which wants to // eliminate retain and releases where possible. -def int_objc_autorelease : Intrinsic<[llvm_ptr_ty], - [llvm_ptr_ty]>; +def int_objc_autorelease : + Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrInaccessibleMemOnly]>; def int_objc_autoreleasePoolPop : Intrinsic<[], [llvm_ptr_ty]>; -def int_objc_autoreleasePoolPush : Intrinsic<[llvm_ptr_ty], []>; -def int_objc_autoreleaseReturnValue : Intrinsic<[llvm_ptr_ty], - [llvm_ptr_ty]>; +def int_objc_autoreleasePoolPush : + Intrinsic<[llvm_ptr_ty], [], [IntrInaccessibleMemOnly]>; +def int_objc_autoreleaseReturnValue : + Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrInaccessibleMemOnly]>; def int_objc_copyWeak : Intrinsic<[], [llvm_ptrptr_ty, llvm_ptrptr_ty]>; @@ -450,14 +451,14 @@ [llvm_ptrptr_ty, llvm_ptrptr_ty]>; def int_objc_release : Intrinsic<[], [llvm_ptr_ty]>; -def int_objc_retain : Intrinsic<[llvm_ptr_ty], - [llvm_ptr_ty]>; -def int_objc_retainAutorelease : Intrinsic<[llvm_ptr_ty], - [llvm_ptr_ty]>; -def int_objc_retainAutoreleaseReturnValue : Intrinsic<[llvm_ptr_ty], - [llvm_ptr_ty]>; -def int_objc_retainAutoreleasedReturnValue : Intrinsic<[llvm_ptr_ty], - [llvm_ptr_ty]>; +def int_objc_retain : + Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrInaccessibleMemOnly]>; +def int_objc_retainAutorelease : + Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrInaccessibleMemOnly]>; +def int_objc_retainAutoreleaseReturnValue : + Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrInaccessibleMemOnly]>; +def int_objc_retainAutoreleasedReturnValue : + Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrInaccessibleMemOnly]>; def int_objc_retainBlock : Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty]>; def int_objc_storeStrong : Intrinsic<[], @@ -473,14 +474,14 @@ [IntrInaccessibleMemOnly]>; def int_objc_unsafeClaimAutoreleasedReturnValue : Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty]>; -def int_objc_retainedObject : Intrinsic<[llvm_ptr_ty], - [llvm_ptr_ty]>; -def int_objc_unretainedObject : Intrinsic<[llvm_ptr_ty], - [llvm_ptr_ty]>; -def int_objc_unretainedPointer : Intrinsic<[llvm_ptr_ty], - [llvm_ptr_ty]>; -def int_objc_retain_autorelease : Intrinsic<[llvm_ptr_ty], - [llvm_ptr_ty]>; +def int_objc_retainedObject : + Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrNoMem]>; +def int_objc_unretainedObject : + Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrNoMem]>; +def int_objc_unretainedPointer : + Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrNoMem]>; +def int_objc_retain_autorelease : + Intrinsic<[llvm_ptr_ty], [llvm_ptr_ty], [IntrInaccessibleMemOnly]>; def int_objc_sync_enter : Intrinsic<[llvm_i32_ty], [llvm_ptr_ty]>; def int_objc_sync_exit : Intrinsic<[llvm_i32_ty], Index: llvm/lib/Analysis/ObjCARCAliasAnalysis.cpp =================================================================== --- llvm/lib/Analysis/ObjCARCAliasAnalysis.cpp +++ llvm/lib/Analysis/ObjCARCAliasAnalysis.cpp @@ -92,46 +92,6 @@ return false; } -MemoryEffects ObjCARCAAResult::getMemoryEffects(const Function *F) { - if (!EnableARCOpts) - return AAResultBase::getMemoryEffects(F); - - switch (GetFunctionClass(F)) { - case ARCInstKind::NoopCast: - return MemoryEffects::none(); - default: - break; - } - - return AAResultBase::getMemoryEffects(F); -} - -ModRefInfo ObjCARCAAResult::getModRefInfo(const CallBase *Call, - const MemoryLocation &Loc, - AAQueryInfo &AAQI) { - if (!EnableARCOpts) - return AAResultBase::getModRefInfo(Call, Loc, AAQI); - - switch (GetBasicARCInstKind(Call)) { - case ARCInstKind::Retain: - case ARCInstKind::RetainRV: - case ARCInstKind::Autorelease: - case ARCInstKind::AutoreleaseRV: - case ARCInstKind::NoopCast: - case ARCInstKind::AutoreleasepoolPush: - case ARCInstKind::FusedRetainAutorelease: - case ARCInstKind::FusedRetainAutoreleaseRV: - // These functions don't access any memory visible to the compiler. - // Note that this doesn't include objc_retainBlock, because it updates - // pointers when it copies block data. - return ModRefInfo::NoModRef; - default: - break; - } - - return AAResultBase::getModRefInfo(Call, Loc, AAQI); -} - AnalysisKey ObjCARCAA::Key; ObjCARCAAResult ObjCARCAA::run(Function &F, FunctionAnalysisManager &AM) { Index: llvm/test/Transforms/ObjCARC/basic.ll =================================================================== --- llvm/test/Transforms/ObjCARC/basic.ll +++ llvm/test/Transforms/ObjCARC/basic.ll @@ -3073,5 +3073,5 @@ !5 = !{i32 2, !"Debug Info Version", i32 3} ; CHECK: attributes [[NUW]] = { nounwind } -; CHECK: attributes #1 = { nocallback nofree nosync nounwind readnone speculatable willreturn } +; CHECK: attributes #3 = { nocallback nofree nosync nounwind readnone speculatable willreturn } ; CHECK: ![[RELEASE]] = !{} Index: llvm/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll =================================================================== --- llvm/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll +++ llvm/test/Transforms/ObjCARC/ensure-that-exception-unwind-path-is-visited.ll @@ -107,8 +107,8 @@ ; CHECK: attributes #0 = { ssp uwtable } ; CHECK: attributes #1 = { nocallback nofree nosync nounwind readnone speculatable willreturn } ; CHECK: attributes #2 = { nonlazybind } -; CHECK: attributes [[NUW]] = { nounwind } ; CHECK: attributes #4 = { noinline ssp uwtable } +; CHECK: attributes [[NUW]] = { nounwind } !llvm.dbg.cu = !{!0} !llvm.module.flags = !{!33, !34, !35, !36, !61} Index: llvm/test/Transforms/ObjCARC/nested.ll =================================================================== --- llvm/test/Transforms/ObjCARC/nested.ll +++ llvm/test/Transforms/ObjCARC/nested.ll @@ -820,6 +820,6 @@ } -; CHECK: attributes [[NUW]] = { nounwind } ; CHECK: attributes #1 = { argmemonly nocallback nofree nounwind willreturn writeonly } ; CHECK: attributes #2 = { nonlazybind } +; CHECK: attributes [[NUW]] = { nounwind } Index: llvm/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll =================================================================== --- llvm/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll +++ llvm/test/Transforms/PreISelIntrinsicLowering/objc-arc.ll @@ -341,5 +341,6 @@ ; CHECK: declare i32 @objc_sync_enter(i8*) ; CHECK: declare i32 @objc_sync_exit(i8*) -; CHECK: attributes #0 = { nounwind } +; CHECK: attributes #0 = { inaccessiblememonly nounwind } +; CHECK: attributes #1 = { nounwind } ; CHECK: attributes [[NLB]] = { nonlazybind }