Skip to content

Commit

Permalink
[CFLAA] Be more conservative with values we haven't seen.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
gburgessiv committed Aug 2, 2016
1 parent 35142a9 commit 4968ef3
Showing 1 changed file with 16 additions and 11 deletions.
27 changes: 16 additions & 11 deletions lib/Analysis/CFLAndersAliasAnalysis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ class CFLAndersAAResult::FunctionInfo {
/// Summary of externally visible effects.
AliasSummary Summary;

AliasAttrs getAttrs(const Value *) const;
Optional<AliasAttrs> getAttrs(const Value *) const;

public:
FunctionInfo(const Function &, const SmallVectorImpl<Value *> &,
Expand Down Expand Up @@ -479,17 +479,14 @@ CFLAndersAAResult::FunctionInfo::FunctionInfo(
populateExternalRelations(Summary.RetParamRelations, Fn, RetVals, ReachSet);
}

AliasAttrs CFLAndersAAResult::FunctionInfo::getAttrs(const Value *V) const {
Optional<AliasAttrs>
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,
Expand All @@ -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))
Expand Down

0 comments on commit 4968ef3

Please sign in to comment.