[PATCH] D88551: [InstCombine] Test cases added for pattern "(~A & B) ^ A -> (A | B)"

Jaydeep Chauhan via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 30 03:28:53 PDT 2020


Jac1494 created this revision.
Jac1494 added reviewers: dexonsmith, spatel, majnemer, nicholas, lebedev.ri, xbolva00.
Jac1494 added a project: LLVM.
Jac1494 requested review of this revision.

Test cases are added for pattern "(~A & B) ^ A -> (A | B)".

And Fix for these pattern is https://reviews.llvm.org/D86395.


https://reviews.llvm.org/D88551

Files:
  llvm/test/Transforms/InstCombine/xor.ll


Index: llvm/test/Transforms/InstCombine/xor.ll
===================================================================
--- llvm/test/Transforms/InstCombine/xor.ll
+++ llvm/test/Transforms/InstCombine/xor.ll
@@ -1172,16 +1172,14 @@
   ret i8 %r
 }

-; (~A & B) ^ A  -->   (A | B)
+; (~A & B) ^ A -> (A | B)
 ; The division ops are here to thwart complexity-based canonicalization: all ops are binops.

 define i32 @test52(i32 %p1, i32 %p2) {
 ; CHECK-LABEL: @test52(
 ; CHECK-NEXT:    [[A:%.*]] = udiv i32 42, [[P1:%.*]]
 ; CHECK-NEXT:    [[B:%.*]] = udiv i32 42, [[P2:%.*]]
-; CHECK-NEXT:    [[O:%.*]] = xor i32 [[A]], -1
-; CHECK-NEXT:    [[R:%.*]] = and i32 [[B]], [[O]]
-; CHECK-NEXT:    [[Z:%.*]] = xor i32 [[R]], [[A]]
+; CHECK-NEXT:    [[Z:%.*]] = or i32 [[A]], [[B]]
 ; CHECK-NEXT:    ret i32 [[Z]]
 ;
   %a = udiv i32 42, %p1
@@ -1192,56 +1190,56 @@
   ret i32 %z
 }

-; (~B & A) ^ B  -->   (A | B)
+; (B & ~A) ^ A -> (A | B)
 ; The division ops are here to thwart complexity-based canonicalization: all ops are binops.

 define i32 @test53(i32 %p1, i32 %p2) {
 ; CHECK-LABEL: @test53(
 ; CHECK-NEXT:    [[A:%.*]] = udiv i32 42, [[P1:%.*]]
 ; CHECK-NEXT:    [[B:%.*]] = udiv i32 42, [[P2:%.*]]
-; CHECK-NEXT:    [[O:%.*]] = xor i32 [[B]], -1
-; CHECK-NEXT:    [[R:%.*]] = and i32 [[A]], [[O]]
-; CHECK-NEXT:    [[Z:%.*]] = xor i32 [[R]], [[B]]
+; CHECK-NEXT:    [[Z:%.*]] = or i32 [[A]], [[B]]
 ; CHECK-NEXT:    ret i32 [[Z]]
 ;
   %a = udiv i32 42, %p1
   %b = udiv i32 42, %p2
-  %o = xor i32 %b, -1
-  %r = and i32 %o, %a
-  %z = xor i32 %r, %b
+  %o = xor i32 %a, -1
+  %r = and i32 %o, %b
+  %z = xor i32 %r, %a
   ret i32 %z
 }

+; A ^ (~A & B) -> (A | B)
+; The division ops are here to thwart complexity-based canonicalization: all ops are binops.
+
 define i32 @test54(i32 %p1, i32 %p2) {
 ; CHECK-LABEL: @test54(
 ; CHECK-NEXT:    [[A:%.*]] = udiv i32 42, [[P1:%.*]]
 ; CHECK-NEXT:    [[B:%.*]] = udiv i32 42, [[P2:%.*]]
-; CHECK-NEXT:    [[O:%.*]] = xor i32 [[A]], -1
-; CHECK-NEXT:    [[R:%.*]] = and i32 [[B]], [[O]]
-; CHECK-NEXT:    [[Z:%.*]] = xor i32 [[R]], [[A]]
+; CHECK-NEXT:    [[Z:%.*]] = or i32 [[A]], [[B]]
 ; CHECK-NEXT:    ret i32 [[Z]]
 ;
   %a = udiv i32 42, %p1
   %b = udiv i32 42, %p2
   %o = xor i32 %a, -1
-  %r = and i32 %b, %o
+  %r = and i32 %o, %b
   %z = xor i32 %r, %a
   ret i32 %z
 }

+; A ^ (B & ~A) -> (A | B)
+; The division ops are here to thwart complexity-based canonicalization: all ops are binops.
+
 define i32 @test55(i32 %p1, i32 %p2) {
 ; CHECK-LABEL: @test55(
 ; CHECK-NEXT:    [[A:%.*]] = udiv i32 42, [[P1:%.*]]
 ; CHECK-NEXT:    [[B:%.*]] = udiv i32 42, [[P2:%.*]]
-; CHECK-NEXT:    [[O:%.*]] = xor i32 [[A]], -1
-; CHECK-NEXT:    [[R:%.*]] = and i32 [[B]], [[O]]
-; CHECK-NEXT:    [[Z:%.*]] = xor i32 [[A]], [[R]]
+; CHECK-NEXT:    [[Z:%.*]] = or i32 [[A]], [[B]]
 ; CHECK-NEXT:    ret i32 [[Z]]
 ;
   %a = udiv i32 42, %p1
   %b = udiv i32 42, %p2
   %o = xor i32 %a, -1
   %r = and i32 %o, %b
-  %z = xor i32 %a, %r
+  %z = xor i32 %r, %a
   ret i32 %z
 }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D88551.295222.patch
Type: text/x-patch
Size: 3020 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20200930/49707967/attachment.bin>


More information about the llvm-commits mailing list