[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