[llvm] [InstCombine] Canoncalize complex boolean expressions into ~((y | z) ^ x) (PR #149530)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 18 08:17:38 PDT 2025
github-actions[bot] wrote:
<!--LLVM CODE FORMAT COMMENT: {clang-format}-->
:warning: C/C++ code formatter, clang-format found issues in your code. :warning:
<details>
<summary>
You can test this locally with the following command:
</summary>
``````````bash
git-clang-format --diff HEAD~1 HEAD --extensions cpp -- llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
``````````
</details>
<details>
<summary>
View the diff from clang-format here.
</summary>
``````````diff
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 5d9bee7b3..4dc7e8893 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -2139,15 +2139,16 @@ static Instruction *foldComplexAndOrPatterns(BinaryOperator &I,
X);
}
- // ((~Z) & ((X & Y) | (~X & ~Y))) ^ (Z & ((X & Y) | (X & ~Y))) -> ~((Y | Z) ^ X)
+ // ((~Z) & ((X & Y) | (~X & ~Y))) ^ (Z & ((X & Y) | (X & ~Y))) -> ~((Y | Z) ^
+ // X)
{
{
Value *X, *Y, *Z;
Value *SomethingOrZ, *ZAndX;
-
+
if (match(&I, m_c_Xor(m_Value(SomethingOrZ), m_Value(ZAndX))) &&
match(ZAndX, m_And(m_Value(Z), m_Value(X))) &&
- match(SomethingOrZ, m_Or(m_Value(), m_Specific(Z)))) {
+ match(SomethingOrZ, m_Or(m_Value(), m_Specific(Z)))) {
Value *Something;
if (match(SomethingOrZ, m_Or(m_Value(Something), m_Specific(Z))) &&
match(Something, m_Xor(m_Specific(X), m_Value(Y)))) {
@@ -2157,17 +2158,18 @@ static Instruction *foldComplexAndOrPatterns(BinaryOperator &I,
}
}
}
-
- // ((X & Y) | (~X & ~Y)) ^ (Z & (((X & Y) | (~X & ~Y)) ^ ((X & Y) | (X & ~Y)))) -> ~((Y | Z) ^ X)
- if (match(Op1, m_AllOnes())) {
+
+ // ((X & Y) | (~X & ~Y)) ^ (Z & (((X & Y) | (~X & ~Y)) ^ ((X & Y) | (X &
+ // ~Y)))) -> ~((Y | Z) ^ X)
+ if (match(Op1, m_AllOnes())) {
Value *X, *Y, *Z;
Value *XorWithY;
- if (match(Op0, m_Xor(m_Value(XorWithY), m_Value(Y)))) {
+ if (match(Op0, m_Xor(m_Value(XorWithY), m_Value(Y)))) {
Value *ZAndNotY;
- if (match(XorWithY, m_Xor(m_Value(X), m_Value(ZAndNotY)))) {
+ if (match(XorWithY, m_Xor(m_Value(X), m_Value(ZAndNotY)))) {
Value *NotY;
if (match(ZAndNotY, m_And(m_Value(Z), m_Value(NotY))) &&
- match(NotY, m_Not(m_Specific(Y)))) {
+ match(NotY, m_Not(m_Specific(Y)))) {
Value *YOrZ = Builder.CreateOr(Y, Z);
Value *YOrZXorX = Builder.CreateXor(YOrZ, X);
return BinaryOperator::CreateNot(YOrZXorX);
@@ -3818,12 +3820,14 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &I) {
return replaceInstUsesWith(I, V);
Value *Op0 = I.getOperand(0), *Op1 = I.getOperand(1);
-
- // ((X & Y & ~Z) | (X & ~Y & Z) | (~X & ~Y &~Z) | (X & Y &Z)) -> ~((Y | Z) ^ X)
+
+ // ((X & Y & ~Z) | (X & ~Y & Z) | (~X & ~Y &~Z) | (X & Y &Z)) -> ~((Y | Z) ^
+ // X)
{
Value *X, *Y, *Z;
Value *Term1, *Term2, *XAndYAndZ;
- if (match(&I, m_Or(m_Or(m_Value(Term1), m_Value(Term2)), m_Value(XAndYAndZ))) &&
+ if (match(&I,
+ m_Or(m_Or(m_Value(Term1), m_Value(Term2)), m_Value(XAndYAndZ))) &&
match(XAndYAndZ, m_And(m_And(m_Value(X), m_Value(Y)), m_Value(Z)))) {
Value *YOrZ = Builder.CreateOr(Y, Z);
Value *YOrZXorX = Builder.CreateXor(YOrZ, X);
``````````
</details>
https://github.com/llvm/llvm-project/pull/149530
More information about the llvm-commits
mailing list