[llvm] [InstCombine] Loosen one-use restriction if common operand is constant (PR #79767)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 28 12:39:12 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: AtariDreams (AtariDreams)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/79767.diff
2 Files Affected:
- (modified) llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp (+7-11)
- (modified) llvm/test/Transforms/InstCombine/xor-and-or.ll (+15)
``````````diff
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index 5fd944a859ef098..c72f3dfd4c6139e 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -4756,21 +4756,17 @@ Instruction *InstCombinerImpl::visitXor(BinaryOperator &I) {
return BinaryOperator::CreateNot(Builder.CreateAnd(Op0, B));
// (A | B) ^ (A | C) --> (B ^ C) & ~A -- There are 4 commuted variants.
- // TODO: Loosen one-use restriction if common operand is a constant.
- Value *D;
- if (match(Op0, m_OneUse(m_Or(m_Value(A), m_Value(B)))) &&
- match(Op1, m_OneUse(m_Or(m_Value(C), m_Value(D))))) {
- if (B == C || B == D)
- std::swap(A, B);
- if (A == C)
- std::swap(C, D);
- if (A == D) {
- Value *NotA = Builder.CreateNot(A);
- return BinaryOperator::CreateAnd(Builder.CreateXor(B, C), NotA);
+ if (match(Op0, m_c_Or(m_Value(A), m_Value(B))) &&
+ match(Op1, m_c_Or(m_Specific(A), m_Value(C)))) {
+ // Allow the tranformation to happen if A is one use or a constant.
+ if (A->hasOneUse() || match(A, m_ImmConstant())) {
+ return BinaryOperator::CreateAnd(Builder.CreateXor(B, C),
+ Builder.CreateNot(A));
}
}
// (A & B) ^ (A | C) --> A ? ~B : C -- There are 4 commuted variants.
+ Value *D;
if (I.getType()->isIntOrIntVectorTy(1) &&
match(Op0, m_OneUse(m_LogicalAnd(m_Value(A), m_Value(B)))) &&
match(Op1, m_OneUse(m_LogicalOr(m_Value(C), m_Value(D))))) {
diff --git a/llvm/test/Transforms/InstCombine/xor-and-or.ll b/llvm/test/Transforms/InstCombine/xor-and-or.ll
index feba47912b1dac5..d2f7ec2b4b924e2 100644
--- a/llvm/test/Transforms/InstCombine/xor-and-or.ll
+++ b/llvm/test/Transforms/InstCombine/xor-and-or.ll
@@ -241,4 +241,19 @@ define i1 @xor_and_or_negative_oneuse(i1 %c, i1 %x, i1 %y) {
ret i1 %r
}
+define i32 @xor_and_or_constant(i32 %X, i32 %Y, i32 %Z) {
+; CHECK-LABEL: @xor_and_or_constant(
+; CHECK-NEXT: [[TMP1:%.*]] = or i32 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT: [[TMP2:%.*]] = or i32 [[X]], [[Z:%.*]]
+; CHECK-NEXT: [[TMP3:%.*]] = xor i32 [[TMP1]], [[TMP2]]
+; CHECK-NEXT: ret i32 [[TMP3]]
+;
+ %1 = or i32 %X, %Y
+ %2 = or i32 %X, %Z
+ %3 = xor i32 %1, %2
+ %4 = xor i32 %X, -1
+ %5 = and i32 %3, %4
+ ret i32 %5
+}
+
declare void @use(i1)
``````````
</details>
https://github.com/llvm/llvm-project/pull/79767
More information about the llvm-commits
mailing list