[llvm] [InstCombine] Remove unnecessary one-use-check (PR #66419)

via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 14 12:11:13 PDT 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms
            
<details>
<summary>Changes</summary>
This removes a oneUse check, that is actually unecessary (see Alive2 link).

Alive2: https://alive2.llvm.org/ce/z/qEkUEf
Original patch: https://reviews.llvm.org/D159380
--
Full diff: https://github.com/llvm/llvm-project/pull/66419.diff

2 Files Affected:

- (modified) llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp (+2-4) 
- (modified) llvm/test/Transforms/InstCombine/or-xor-xor.ll (-53) 


<pre>
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
index d8c2827d25831d3..858df7bb6b12f2c 100644
--- a/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
+++ b/llvm/lib/Transforms/InstCombine/InstCombineAndOrXor.cpp
@@ -3646,10 +3646,8 @@ Instruction *InstCombinerImpl::visitOr(BinaryOperator &amp;I) {
     // ((A &amp; B) ^ B) | ((A &amp; B) ^ A) -&gt; A ^ B
     // (B ^ (A &amp; B)) | (A ^ (A &amp; B)) -&gt; A ^ B
     const auto TryXorOpt = [&amp;](Value *Lhs, Value *Rhs) -&gt; Instruction * {
-      if (match(Lhs, m_OneUse(m_c_Xor(m_And(m_Value(A), m_Value(B)),
-                                      m_Deferred(A)))) &amp;&amp;
-          match(Rhs, m_OneUse(m_c_Xor(m_And(m_Specific(A), m_Specific(B)),
-                                      m_Deferred(B))))) {
+      if (match(Lhs, m_c_Xor(m_And(m_Value(A), m_Value(B)), m_Deferred(A))) &amp;&amp;
+          match(Rhs, m_c_Xor(m_And(m_Specific(A), m_Specific(B)), m_Deferred(B)))) {
         return BinaryOperator::CreateXor(A, B);
       }
       return nullptr;
diff --git a/llvm/test/Transforms/InstCombine/or-xor-xor.ll b/llvm/test/Transforms/InstCombine/or-xor-xor.ll
index 3f0066d7f00b1dc..9bcaeaaafd1ce39 100644
--- a/llvm/test/Transforms/InstCombine/or-xor-xor.ll
+++ b/llvm/test/Transforms/InstCombine/or-xor-xor.ll
@@ -1,10 +1,6 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
 ; RUN: opt &lt; %s -passes=instcombine -S | FileCheck %s
 
-declare void @use.i3(i1)
-declare void @use.i5(i5)
-declare void @use.i32(i5)
-
 define i1 @or_xor_xor_normal_variant1(i1 %a, i1 %b) {
 ; CHECK-LABEL: @or_xor_xor_normal_variant1(
 ; CHECK-NEXT:    [[OR:%.*]] = xor i1 [[A:%.*]], [[B:%.*]]
@@ -79,52 +75,3 @@ define &lt;3 x i1&gt; @or_xor_xor_normal_vector(&lt;3 x i1&gt; %a, &lt;3 x i1&gt; %b) {
   %or = or &lt;3 x i1&gt; %xor1, %xor2
   ret &lt;3 x i1&gt; %or
 }
-
-define i3 @or_xor_xor_normal_multiple_uses_and(i3 %a, i3 %b) {
-; CHECK-LABEL: @or_xor_xor_normal_multiple_uses_and(
-; CHECK-NEXT:    [[AND:%.*]] = and i3 [[A:%.*]], [[B:%.*]]
-; CHECK-NEXT:    call void @use.i3(i3 [[AND]])
-; CHECK-NEXT:    [[OR:%.*]] = xor i3 [[A]], [[B]]
-; CHECK-NEXT:    ret i3 [[OR]]
-;
-  %and = and i3 %a, %b
-  call void @use.i3(i3 %and)
-  %xor1 = xor i3 %b, %and
-  %xor2 = xor i3 %a, %and
-  %or = or i3 %xor1, %xor2
-  ret i3 %or
-}
-
-define i32 @or_xor_xor_negative_multiple_uses_xor1(i32 %a, i32 %b) {
-; CHECK-LABEL: @or_xor_xor_negative_multiple_uses_xor1(
-; CHECK-NEXT:    [[AND:%.*]] = and i32 [[A:%.*]], [[B:%.*]]
-; CHECK-NEXT:    [[XOR1:%.*]] = xor i32 [[AND]], [[B]]
-; CHECK-NEXT:    call void @use.i32(i32 [[XOR1]])
-; CHECK-NEXT:    [[XOR2:%.*]] = xor i32 [[AND]], [[A]]
-; CHECK-NEXT:    [[OR:%.*]] = or i32 [[XOR1]], [[XOR2]]
-; CHECK-NEXT:    ret i32 [[OR]]
-;
-  %and = and i32 %a, %b
-  %xor1 = xor i32 %and, %b
-  call void @use.i32(i32 %xor1)
-  %xor2 = xor i32 %and, %a
-  %or = or i32 %xor1, %xor2
-  ret i32 %or
-}
-
-define i5 @or_xor_xor_negative_multiple_uses_xor2(i5 %a, i5 %b) {
-; CHECK-LABEL: @or_xor_xor_negative_multiple_uses_xor2(
-; CHECK-NEXT:    [[AND:%.*]] = and i5 [[A:%.*]], [[B:%.*]]
-; CHECK-NEXT:    [[XOR1:%.*]] = xor i5 [[AND]], [[B]]
-; CHECK-NEXT:    [[XOR2:%.*]] = xor i5 [[AND]], [[A]]
-; CHECK-NEXT:    call void @use.i5(i5 [[XOR2]])
-; CHECK-NEXT:    [[OR:%.*]] = or i5 [[XOR1]], [[XOR2]]
-; CHECK-NEXT:    ret i5 [[OR]]
-;
-  %and = and i5 %a, %b
-  %xor1 = xor i5 %and, %b
-  %xor2 = xor i5 %and, %a
-  call void @use.i5(i5 %xor2)
-  %or = or i5 %xor1, %xor2
-  ret i5 %or
-}
</pre>
</details>


https://github.com/llvm/llvm-project/pull/66419


More information about the llvm-commits mailing list