[PATCH] D99674: [InstCombine] Conditionally fold select i1 into and/or
Sanjay Patel via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 7 08:46:59 PDT 2021
spatel added a comment.
In D99674#2673844 <https://reviews.llvm.org/D99674#2673844>, @nikic wrote:
> @spatel These are important canonicalization transforms, that allow us to treat logical and/or the same way as and/or in many other passes. There is shouldAvoidAbsorbingNotIntoSelect() to guard against infinite loops, and probably it needs to be applied in more places.
Ah - I stepped into the example here for a closer look. It's a vector partial-undef problem (conflicting with a demanded elements transform). I think we can avoid it by just making sure we're matching a true zero or one constant (no undef/poison elements).
Here's what I have the test down to:
define i32 @main(<2 x i1> %a, <2 x i1> %b, <2 x i32> %x, <2 x i32> %y) {
%t5 = add nsw <2 x i32> %y, <i32 2147483647, i32 2147483647>
%t6 = icmp slt <2 x i32> %t5, %x
%ab = and <2 x i1> %a, %b
%t7 = select <2 x i1> %ab, <2 x i1> %t6, <2 x i1> <i1 0, i1 poison>
%t10 = xor <2 x i1> %t7, <i1 true, i1 poison>
%p = select <2 x i1> %t10, <2 x i32> zeroinitializer, <2 x i32> %y
%t11 = extractelement <2 x i32> %p, i32 0
ret i32 %t11
}
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D99674/new/
https://reviews.llvm.org/D99674
More information about the llvm-commits
mailing list