[llvm] [ValueTracking] Improve ananlysis of PHI nodes. (PR #71224)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 7 00:16:24 PST 2023
================
@@ -3020,32 +3020,41 @@ static bool isNonEqualShl(const Value *V1, const Value *V2, unsigned Depth,
return false;
}
-static bool isNonEqualPHIs(const PHINode *PN1, const PHINode *PN2,
- unsigned Depth, const SimplifyQuery &Q) {
- // Check two PHIs are in same block.
- if (PN1->getParent() != PN2->getParent())
- return false;
-
+static bool isNonEqualPhisSameBB(const PHINode *PN1, const PHINode *PN2,
+ unsigned Depth, const SimplifyQuery &Q) {
SmallPtrSet<const BasicBlock *, 8> VisitedBBs;
- bool UsedFullRecursion = false;
for (const BasicBlock *IncomBB : PN1->blocks()) {
if (!VisitedBBs.insert(IncomBB).second)
continue; // Don't reprocess blocks that we have dealt with already.
const Value *IV1 = PN1->getIncomingValueForBlock(IncomBB);
const Value *IV2 = PN2->getIncomingValueForBlock(IncomBB);
- const APInt *C1, *C2;
- if (match(IV1, m_APInt(C1)) && match(IV2, m_APInt(C2)) && *C1 != *C2)
- continue;
- // Only one pair of phi operands is allowed for full recursion.
- if (UsedFullRecursion)
+ SimplifyQuery RecQ = Q;
+ RecQ.CxtI = IncomBB->getTerminator();
+ if (!isKnownNonEqual(IV1, IV2, Depth + 1, RecQ))
return false;
+ }
+ return true;
+}
+
+static bool isNonEqualPhi(const Value *V1, const Value *V2, unsigned Depth,
+ const SimplifyQuery &Q) {
+ const PHINode *PN1 = dyn_cast<PHINode>(V1);
+ if (!PN1)
+ return false;
+ if (const PHINode *PN2 = dyn_cast<PHINode>(V2)) {
+ if (PN1->getParent() == PN2->getParent())
+ return isNonEqualPhisSameBB(PN1, PN2, Depth, Q);
+ }
+ for (const BasicBlock *IncomBB : PN1->blocks()) {
+ Value *V = PN1->getIncomingValueForBlock(IncomBB);
+ if (V == PN1)
+ continue;
SimplifyQuery RecQ = Q;
RecQ.CxtI = IncomBB->getTerminator();
- if (!isKnownNonEqual(IV1, IV2, Depth + 1, RecQ))
+ if (!isKnownNonEqual(V, V2, Depth + 1, RecQ))
----------------
nikic wrote:
This is incorrect. V and V2 here can be values from different cycle iterations.
https://github.com/llvm/llvm-project/pull/71224
More information about the llvm-commits
mailing list