aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2024-01-24 19:17:23 +0000
committerDimitry Andric <dim@FreeBSD.org>2024-04-06 20:13:49 +0000
commit7a6dacaca14b62ca4b74406814becb87a3fefac0 (patch)
tree273a870ac27484bb1f5ee55e7ef0dc0d061f63e7 /contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp
parent46c59ea9b61755455ff6bf9f3e7b834e1af634ea (diff)
parent4df029cc74e5ec124f14a5682e44999ce4f086df (diff)
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Analysis/BasicAliasAnalysis.cpp25
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;
}