diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2024-01-24 19:17:23 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2024-04-06 20:13:49 +0000 |
commit | 7a6dacaca14b62ca4b74406814becb87a3fefac0 (patch) | |
tree | 273a870ac27484bb1f5ee55e7ef0dc0d061f63e7 /contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp | |
parent | 46c59ea9b61755455ff6bf9f3e7b834e1af634ea (diff) | |
parent | 4df029cc74e5ec124f14a5682e44999ce4f086df (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp | 25 |
1 files changed, 11 insertions, 14 deletions
diff --git a/contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp index a4a0846df7af..3178e2d27816 100644 --- a/contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -215,7 +215,7 @@ bool EarliestEscapeInfo::isNotCapturedBefore(const Value *Object, auto Iter = EarliestEscapes.insert({Object, nullptr}); if (Iter.second) { Instruction *EarliestCapture = FindEarliestCapture( - Object, *const_cast<Function *>(I->getFunction()), + Object, *const_cast<Function *>(DT.getRoot()->getParent()), /*ReturnCaptures=*/false, /*StoreCaptures=*/true, DT); if (EarliestCapture) { auto Ins = Inst2Obj.insert({EarliestCapture, {}}); @@ -228,6 +228,10 @@ bool EarliestEscapeInfo::isNotCapturedBefore(const Value *Object, if (!Iter.first->second) return true; + // No context instruction means any use is capturing. + if (!I) + return false; + if (I == Iter.first->second) { if (OrAt) return false; @@ -393,10 +397,8 @@ static LinearExpression GetLinearExpression( // further. return Val; case Instruction::Or: - // X|C == X+C if all the bits in C are unset in X. Otherwise we can't - // analyze it. - if (!MaskedValueIsZero(BOp->getOperand(0), RHSC->getValue(), - SimplifyQuery(DL, DT, AC, BOp))) + // X|C == X+C if it is disjoint. Otherwise we can't analyze it. + if (!cast<PossiblyDisjointInst>(BOp)->isDisjoint()) return Val; [[fallthrough]]; @@ -1504,11 +1506,6 @@ AliasResult BasicAAResult::aliasCheck(const Value *V1, LocationSize V1Size, if (isIdentifiedObject(O1) && isIdentifiedObject(O2)) return AliasResult::NoAlias; - // Constant pointers can't alias with non-const isIdentifiedObject objects. - if ((isa<Constant>(O1) && isIdentifiedObject(O2) && !isa<Constant>(O2)) || - (isa<Constant>(O2) && isIdentifiedObject(O1) && !isa<Constant>(O1))) - return AliasResult::NoAlias; - // Function arguments can't alias with things that are known to be // unambigously identified at the function level. if ((isa<Argument>(O1) && isIdentifiedFunctionLocal(O2)) || @@ -1524,11 +1521,11 @@ AliasResult BasicAAResult::aliasCheck(const Value *V1, LocationSize V1Size, // temporary store the nocapture argument's value in a temporary memory // location if that memory location doesn't escape. Or it may pass a // nocapture value to other functions as long as they don't capture it. - if (isEscapeSource(O1) && - AAQI.CI->isNotCapturedBefore(O2, cast<Instruction>(O1), /*OrAt*/ true)) + if (isEscapeSource(O1) && AAQI.CI->isNotCapturedBefore( + O2, dyn_cast<Instruction>(O1), /*OrAt*/ true)) return AliasResult::NoAlias; - if (isEscapeSource(O2) && - AAQI.CI->isNotCapturedBefore(O1, cast<Instruction>(O2), /*OrAt*/ true)) + if (isEscapeSource(O2) && AAQI.CI->isNotCapturedBefore( + O1, dyn_cast<Instruction>(O2), /*OrAt*/ true)) return AliasResult::NoAlias; } |