Index: llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp =================================================================== --- llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp +++ llvm/lib/Analysis/TypeBasedAliasAnalysis.cpp @@ -410,12 +410,11 @@ if (!EnableTBAA) return AAResultBase::getModRefBehavior(Call, AAQI); - // If this is an "immutable" type, we can assume the call doesn't write - // to memory. + // If this is an "immutable" type, the access is not observable. if (const MDNode *M = Call->getMetadata(LLVMContext::MD_tbaa)) if ((!isStructPathTBAA(M) && TBAANode(M).isTypeImmutable()) || (isStructPathTBAA(M) && TBAAStructTagNode(M).isTypeImmutable())) - return FunctionModRefBehavior::readOnly(); + return FunctionModRefBehavior::none(); return AAResultBase::getModRefBehavior(Call, AAQI); } Index: llvm/test/Analysis/TypeBasedAliasAnalysis/functionattrs.ll =================================================================== --- llvm/test/Analysis/TypeBasedAliasAnalysis/functionattrs.ll +++ llvm/test/Analysis/TypeBasedAliasAnalysis/functionattrs.ll @@ -21,8 +21,8 @@ ret void } -; Add the readonly attribute, since there's just a call to a function which -; TBAA says doesn't modify any memory. +; Add the readnone attribute, since there's just a call to a function which +; TBAA says only accesses constant memory. ; CHECK: define void @test1_yes(i32* nocapture %p) #2 { define void @test1_yes(i32* %p) nounwind { @@ -74,7 +74,7 @@ ; CHECK: attributes #0 = { mustprogress nofree norecurse nosync nounwind readnone willreturn } ; CHECK: attributes #1 = { argmemonly mustprogress nofree norecurse nosync nounwind willreturn writeonly } -; CHECK: attributes #2 = { nofree nounwind readonly } +; CHECK: attributes #2 = { nofree nosync nounwind readnone } ; CHECK: attributes #3 = { nounwind } ; CHECK: attributes #4 = { mustprogress nofree nosync nounwind readnone willreturn } ; CHECK: attributes #5 = { argmemonly mustprogress nofree nosync nounwind willreturn }