[PATCH] D159464: [InstCombine] Fold comparison of adding two zero extended booleans

Mohamed Atef via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 7 11:53:05 PDT 2023


elhewaty marked 5 inline comments as done.
elhewaty added a comment.

@goldstein.w.n

// zext i1 X + zext i1 Y == 0 --> !(or i1 X, Y):
https://alive2.llvm.org/ce/z/Wfs9BS

// sext i1 X + sext i1 Y == 0 --> !(or i1 X, Y):
https://alive2.llvm.org/ce/z/ns3oDR

// zext i1 X + zext i1 Y == 1 --> xor i1 X, Y
https://alive2.llvm.org/ce/z/NvMYj9

// zext i1 X + zext i1 Y == 1 --> and i1 X, Y
https://alive2.llvm.org/ce/z/vZGCgR

// sext i1 X + sext i1 Y == 1 --> false
https://alive2.llvm.org/ce/z/UAg6BB

// sext i1 X + sext i1 Y == 2 --> false
https://alive2.llvm.org/ce/z/89xqHQ

// sext i1 X + zext i1 Y == 0 --> !(xor i1 X, Y)
https://alive2.llvm.org/ce/z/jQAkrJ

// sext i1 X + zext i1 Y == 1 --> !X & Y
https://alive2.llvm.org/ce/z/qYfXq5

// sext i1 X + zext i1 Y == 2 --> false
https://alive2.llvm.org/ce/z/cvw9VW



================
Comment at: llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp:2906
+  // 1- (zext i1 X + zext i1 Y) == 1 --> xor i1 X, Y
+  // 2- (zext i1 X + zext i1 Y) == 0 --> !(or i1 X, Y)
+  if (Cmp.isEquality()) {
----------------
goldstein.w.n wrote:
> Can also do:
> 
> `(sext i1 X + sext i1 Y) == 0 --> !(or i1 X, Y)`
> `(sext i1 X + sext i1 Y) == 1 --> false`
> `(sext i1 X + sext i1 Y) == 2 --> false`
> 
> `(sext i1 X + zext i1 Y) == 0 --> (xor i1 X, Y)`
> `(sext i1 X + zext i1 Y) == 1 --> Y`
> `(sext i1 X + zext i1 Y) == 2 --> false`
> `(sext i1 X + zext i1 Y) == 0 --> (xor i1 X, Y)`
Is this transformation correct?

https://alive2.llvm.org/ce/z/vS_fMY

I think you meant `sext i1 X + zext i1 Y == 0  --> !(xor i1 X, Y)`


================
Comment at: llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp:2906
+  // 1- (zext i1 X + zext i1 Y) == 1 --> xor i1 X, Y
+  // 2- (zext i1 X + zext i1 Y) == 0 --> !(or i1 X, Y)
+  if (Cmp.isEquality()) {
----------------
elhewaty wrote:
> goldstein.w.n wrote:
> > Can also do:
> > 
> > `(sext i1 X + sext i1 Y) == 0 --> !(or i1 X, Y)`
> > `(sext i1 X + sext i1 Y) == 1 --> false`
> > `(sext i1 X + sext i1 Y) == 2 --> false`
> > 
> > `(sext i1 X + zext i1 Y) == 0 --> (xor i1 X, Y)`
> > `(sext i1 X + zext i1 Y) == 1 --> Y`
> > `(sext i1 X + zext i1 Y) == 2 --> false`
> > `(sext i1 X + zext i1 Y) == 0 --> (xor i1 X, Y)`
> Is this transformation correct?
> 
> https://alive2.llvm.org/ce/z/vS_fMY
> 
> I think you meant `sext i1 X + zext i1 Y == 0  --> !(xor i1 X, Y)`
> `(sext i1 X + zext i1 Y) == 1 --> Y`
i think this also incorrect
what about `(!X) & Y`


================
Comment at: llvm/test/Transforms/InstCombine/icmp-add.ll:36
+}
+
 define i1 @test1(i32 %a) {
----------------
arsenm wrote:
> Add tests showing the multiple use rejections
Can you please explain what do you mean by multiple use rejections? 


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D159464/new/

https://reviews.llvm.org/D159464



More information about the llvm-commits mailing list