mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 11:02:59 +02:00
[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 llvm-svn: 277533
This commit is contained in:
parent
fa1f2ddd00
commit
0e6700a0ef
@ -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 *> &,
|
||||
@ -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,
|
||||
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user