Index: llvm/trunk/lib/Analysis/CFLAndersAliasAnalysis.cpp =================================================================== --- llvm/trunk/lib/Analysis/CFLAndersAliasAnalysis.cpp +++ llvm/trunk/lib/Analysis/CFLAndersAliasAnalysis.cpp @@ -305,7 +305,7 @@ /// Summary of externally visible effects. AliasSummary Summary; - AliasAttrs getAttrs(const Value *) const; + Optional getAttrs(const Value *) const; public: FunctionInfo(const Function &, const SmallVectorImpl &, @@ -479,17 +479,14 @@ populateExternalRelations(Summary.RetParamRelations, Fn, RetVals, ReachSet); } -AliasAttrs CFLAndersAAResult::FunctionInfo::getAttrs(const Value *V) const { +Optional +CFLAndersAAResult::FunctionInfo::getAttrs(const Value *V) const { assert(V != nullptr); - // Return AttrUnknown if V is not found in AttrMap. Sometimes V can be created - // after the analysis gets executed, and we want to be conservative in - // those cases. - AliasAttrs Attr = getAttrUnknown(); auto Itr = AttrMap.find(V); if (Itr != AttrMap.end()) - Attr = Itr->second; - return Attr; + return Itr->second; + return None; } bool CFLAndersAAResult::FunctionInfo::mayAlias(const Value *LHS, @@ -498,9 +495,17 @@ uint64_t RHSSize) const { assert(LHS && RHS); - // Check AliasAttrs first since it's cheaper - auto AttrsA = getAttrs(LHS); - auto AttrsB = getAttrs(RHS); + // Check if we've seen LHS and RHS before. Sometimes LHS or RHS can be created + // after the analysis gets executed, and we want to be conservative in those + // cases. + auto MaybeAttrsA = getAttrs(LHS); + auto MaybeAttrsB = getAttrs(RHS); + if (!MaybeAttrsA || !MaybeAttrsB) + return true; + + // Check AliasAttrs before AliasMap lookup since it's cheaper + auto AttrsA = *MaybeAttrsA; + auto AttrsB = *MaybeAttrsB; if (hasUnknownOrCallerAttr(AttrsA)) return AttrsB.any(); if (hasUnknownOrCallerAttr(AttrsB))