Index: include/llvm/Analysis/AliasSetTracker.h =================================================================== --- include/llvm/Analysis/AliasSetTracker.h +++ include/llvm/Analysis/AliasSetTracker.h @@ -64,8 +64,7 @@ // We don't have a AAInfo yet. Set it to NewAAInfo. AAInfo = NewAAInfo; else if (AAInfo != NewAAInfo) - // NewAAInfo conflicts with AAInfo. - AAInfo = DenseMapInfo::getTombstoneKey(); + AAInfo.merge(NewAAInfo); } uint64_t getSize() const { return Size; } Index: include/llvm/IR/Metadata.h =================================================================== --- include/llvm/IR/Metadata.h +++ include/llvm/IR/Metadata.h @@ -546,6 +546,8 @@ explicit operator bool() const { return TBAA || Scope || NoAlias; } + void merge(const AAMDNodes &N); + /// \brief The tag for type-based alias analysis. MDNode *TBAA; Index: lib/Analysis/TypeBasedAliasAnalysis.cpp =================================================================== --- lib/Analysis/TypeBasedAliasAnalysis.cpp +++ lib/Analysis/TypeBasedAliasAnalysis.cpp @@ -623,23 +623,22 @@ return MDNode::get(A->getContext(), Ops); } +void AAMDNodes::merge(const AAMDNodes &N) { + TBAA = MDNode::getMostGenericTBAA(TBAA, N.TBAA); + Scope = MDNode::getMostGenericAliasScope(Scope, N.Scope); + NoAlias = MDNode::intersect(NoAlias, N.NoAlias); +} + void Instruction::getAAMetadata(AAMDNodes &N, bool Merge) const { - if (Merge) - N.TBAA = - MDNode::getMostGenericTBAA(N.TBAA, getMetadata(LLVMContext::MD_tbaa)); - else - N.TBAA = getMetadata(LLVMContext::MD_tbaa); - - if (Merge) - N.Scope = MDNode::getMostGenericAliasScope( - N.Scope, getMetadata(LLVMContext::MD_alias_scope)); - else - N.Scope = getMetadata(LLVMContext::MD_alias_scope); - - if (Merge) - N.NoAlias = - MDNode::intersect(N.NoAlias, getMetadata(LLVMContext::MD_noalias)); - else - N.NoAlias = getMetadata(LLVMContext::MD_noalias); + if (Merge) { + AAMDNodes M; + getAAMetadata(M); + N.merge(M); + return; + } + + N.TBAA = getMetadata(LLVMContext::MD_tbaa); + N.Scope = getMetadata(LLVMContext::MD_alias_scope); + N.NoAlias = getMetadata(LLVMContext::MD_noalias); }