[llvm] [InstCombine] fold (Binop phi(a, b) phi(b, a)) -> (Binop a, b) while Binop is commutative. (PR #75765)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Dec 21 03:42:20 PST 2023
================
@@ -1096,6 +1096,53 @@ Value *InstCombinerImpl::foldUsingDistributiveLaws(BinaryOperator &I) {
return SimplifySelectsFeedingBinaryOp(I, LHS, RHS);
}
+std::optional<std::pair<Value *, Value *>>
+InstCombinerImpl::matchSymmetricPhiNodesPair(PHINode *LHS, PHINode *RHS) {
+
+ if (LHS->getParent() != RHS->getParent())
+ return std::nullopt;
+
+ if (LHS->getNumIncomingValues() < 2)
+ return std::nullopt;
+
+ BasicBlock *B0 = LHS->getIncomingBlock(0);
+ Value *N1 = LHS->getIncomingValueForBlock(B0);
+ Value *N2 = RHS->getIncomingValueForBlock(B0);
+
+ for (unsigned I = 1, E = LHS->getNumIncomingValues(); I != E; ++I) {
+ BasicBlock *B1 = LHS->getIncomingBlock(I);
+ Value *N3 = LHS->getIncomingValueForBlock(B1);
+ Value *N4 = RHS->getIncomingValueForBlock(B1);
+ if ((N1 == N3 && N2 == N4) || (N1 == N4 && N2 == N3))
+ continue;
----------------
nikic wrote:
```suggestion
Value *L1 = LHS->getIncomingValueForBlock(B1);
Value *R1 = RHS->getIncomingValueForBlock(B1);
if ((L0 == L1 && R0 == R1) || (L0 == R1 && R0 == L1))
continue;
```
https://github.com/llvm/llvm-project/pull/75765
More information about the llvm-commits
mailing list