[llvm] [InstCombine] fold `(a == c && b != c) || (a != c && b == c))` to `(a == c) == (b != c)` (PR #94915)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 20 23:50:36 PDT 2024
================
@@ -3421,6 +3421,32 @@ Value *InstCombinerImpl::foldAndOrOfICmps(ICmpInst *LHS, ICmpInst *RHS,
return foldAndOrOfICmpsUsingRanges(LHS, RHS, IsAnd);
}
+static Value *foldAorBConst(BinaryOperator &I,
+ InstCombiner::BuilderTy &Builder) {
+ assert(I.getOpcode() == Instruction::Or &&
+ "Simplification only supports or at the moment.");
+
+ Value *Op0 = I.getOperand(0);
+ Value *Op1 = I.getOperand(1);
+
+ Value *Cmp1, *Cmp2, *Cmp3, *Cmp4;
+ if (!match(Op0, m_And(m_Value(Cmp1), m_Value(Cmp2))) ||
+ !match(Op1, m_And(m_Value(Cmp3), m_Value(Cmp4))))
+ return nullptr;
+
+ // check if any two pairs of the and operations are invertions of each other.
+ Value *Cmp2Inv = nullptr;
+ if (isKnownInversion(Cmp1, Cmp3) && isKnownInversion(Cmp2, Cmp4))
+ Cmp2Inv = Cmp4;
+ if (isKnownInversion(Cmp1, Cmp4) && isKnownInversion(Cmp2, Cmp3))
+ Cmp2Inv = Cmp3;
+
+ if (!Cmp2Inv)
+ return nullptr;
+
+ return Builder.CreateXor(Cmp1, Cmp2Inv);
----------------
nikic wrote:
```suggestion
if (isKnownInversion(Cmp1, Cmp3) && isKnownInversion(Cmp2, Cmp4))
return Builder.CreateXor(Cmp1, Cmp4);
if (isKnownInversion(Cmp1, Cmp4) && isKnownInversion(Cmp2, Cmp3))
return Builder.CreateXor(Cmp1, Cmp3);
return nullptr;
```
Would be simpler like this I think...
https://github.com/llvm/llvm-project/pull/94915
More information about the llvm-commits
mailing list