aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Transforms/IPO/Attributor.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/IPO/Attributor.cpp b/llvm/lib/Transforms/IPO/Attributor.cpp
index 416f554..c3cb22d 100644
--- a/llvm/lib/Transforms/IPO/Attributor.cpp
+++ b/llvm/lib/Transforms/IPO/Attributor.cpp
@@ -1361,6 +1361,10 @@ bool Attributor::isAssumedDead(const Instruction &I,
FnLivenessAA = &getOrCreateAAFor<AAIsDead>(IRPosition::function(F, CBCtx),
QueryingAA, DepClassTy::NONE);
+ // Don't use recursive reasoning.
+ if (QueryingAA == FnLivenessAA)
+ return false;
+
// If we have a context instruction and a liveness AA we use it.
if (CheckBBLivenessOnly ? FnLivenessAA->isAssumedDead(I.getParent())
: FnLivenessAA->isAssumedDead(&I)) {
@@ -1377,7 +1381,8 @@ bool Attributor::isAssumedDead(const Instruction &I,
const IRPosition IRP = IRPosition::inst(I, CBCtx);
const AAIsDead &IsDeadAA =
getOrCreateAAFor<AAIsDead>(IRP, QueryingAA, DepClassTy::NONE);
- // Don't check liveness for AAIsDead.
+
+ // Don't use recursive reasoning.
if (QueryingAA == &IsDeadAA)
return false;
@@ -1422,7 +1427,8 @@ bool Attributor::isAssumedDead(const IRPosition &IRP,
QueryingAA, DepClassTy::NONE);
else
IsDeadAA = &getOrCreateAAFor<AAIsDead>(IRP, QueryingAA, DepClassTy::NONE);
- // Don't check liveness for AAIsDead.
+
+ // Don't use recursive reasoning.
if (QueryingAA == IsDeadAA)
return false;
@@ -1446,6 +1452,10 @@ bool Attributor::isAssumedDead(const BasicBlock &BB,
FnLivenessAA = &getOrCreateAAFor<AAIsDead>(IRPosition::function(F),
QueryingAA, DepClassTy::NONE);
+ // Don't use recursive reasoning.
+ if (QueryingAA == FnLivenessAA)
+ return false;
+
if (FnLivenessAA->isAssumedDead(&BB)) {
if (QueryingAA)
recordDependence(*FnLivenessAA, *QueryingAA, DepClass);