From 4968ef3366430871ad874a2f5e73a62c853608c9 Mon Sep 17 00:00:00 2001 From: George Burgess IV Date: Tue, 2 Aug 2016 22:17:25 +0000 Subject: [PATCH] [CFLAA] Be more conservative with values we haven't seen. There were issues with simply reporting AttrUnknown on previously-unknown values in CFLAnders. So, we now act *entirely* conservatively for values we haven't seen before. As in the prior patch (r277362), writing a lit test for this isn't exactly trivial. If someone wants a test badly, I'm willing to try to write one. Patch by Jia Chen. Differential Revision: https://reviews.llvm.org/D23077 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@277533 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/CFLAndersAliasAnalysis.cpp | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/lib/Analysis/CFLAndersAliasAnalysis.cpp b/lib/Analysis/CFLAndersAliasAnalysis.cpp index 19cc515c537..354035e63d3 100644 --- a/lib/Analysis/CFLAndersAliasAnalysis.cpp +++ b/lib/Analysis/CFLAndersAliasAnalysis.cpp @@ -305,7 +305,7 @@ class CFLAndersAAResult::FunctionInfo { /// 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 @@ CFLAndersAAResult::FunctionInfo::FunctionInfo( 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 @@ bool CFLAndersAAResult::FunctionInfo::mayAlias(const Value *LHS, 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)) -- 2.11.0